Бібліотеки TimerOne та TimerThree для Arduino
Ця бібліотека є набором функцій для налаштування апаратного 16-бітного таймера Timer1 в ATMega168/328. У мікроконтролері є 3 апаратні таймери, які можуть бути налаштовані різними способами для отримання різних функціональних можливостей. Початок розробки даної бібліотеки був викликаний необхідністю швидко і легко встановити період або частоту ШІМ сигналу, але пізніше вона розрослася, включивши обробку переривань по переповненню таймера та інші функції. Він може бути легко розширений або портований для роботи з іншими таймерами.
Точність таймера залежить від тактової частоти процесора. Тактова частота таймера Timer1 визначається встановленням попереднього дільника частоти. Цей дільник може бути встановлений значення 1, 8, 64, 256 або 1024.
- Максимальний період = (Дільник / Частота) × 2 17
- Тривалість одного відліку = (Дільник / Частота)
Для встановлення просто розпакуйте та помістіть файли в каталог Arduino/hardware/libraries/Timer1/ .
Зверніть увагу, що бібліотека Timer1 може використовуватися на Arduino Mega, але вона не підтримує всі три вихідні виводи OCR1A, OCR1B та OCR1C. Підтримуються лише A та B . OCR1A підключений до виведення 11 на Mega, а OCR1B – до виводу 12. За допомогою одного з трьох викликів, які задають висновок, значення 1 задасть висновок 11 на Mega, а 2 – задасть висновок 12. Бібліотека Timer3 була протестована тільки на Mega.
Бібліотеку для таймера Timer3 можна тут (TimerThree.zip)
Для встановлення просто розпакуйте та помістіть файли в каталог Arduino/hardware/libraries/Timer3/ .
Методи бібліотек TimerOne та TimerThree
Управління запуском
Управління вихідним ШИМ сигналом
Переривання
У прикладі ШІМ сигналз коефіцієнтом заповнення 50% подається на висновок 9, а прикріплений обробник переривання перемикає стан цифрового виведення 10 кожні півсекунди.
Модифіковані бібліотеки від Paul Stoffregen
Також доступні окремо підтримувані та оновлювані копії TimerOne та TimerThree, які відрізняються підтримкою більшої кількості обладнання та оптимізацією для отримання більш ефективного коду.
Методи модифікованих бібліотек аналогічні описаним вище, але додано ще один метод керування запуском таймера:
void resume(); Відновлює роботу зупиненого таймера. Новий період не починається.
Проблеми з контекстом переривань
Для обміну даними між кодом обробника переривання та іншою частиною вашої програми необхідно вжити додаткових заходів.
Змінні зазвичай повинні бути типу volatile. Volatile говорить компілятору про необхідність уникати оптимізації, які припускають, що змінна не може спонтанно змінитись. Оскільки ваша функція може змінювати змінні, поки ваша програма використовує їх, компілятор потребує цієї підказки. Але одного volatile часто не вистачає.
"Точність таймера залежить від тактової частоти процесора. Тактова частота таймера Timer1 визначається установкою попереднього дільника частоти. Цей дільник може бути встановлений значення 1, 8, 64, 256 або 1024." А як цей дільник встановити? Чи це автоматично відбувається? Я виводжу частоту від 50 до 1000 гц керувати step/dir; починаючи з 200 гц похибка частоти збільшується з 1-2 гц до 4-5 гц при 1000 гц, що дуже те. я від переривань чекав більшого! Але, швидше, це я просто чогось не зрозумів. Пробував і стандартним частоту виводу Timer1.pwm(9, 512) і обробником переривань, в обробникузастосовував запис через порти прямо - все одно похибка не покращала.