Skip to content

Библиотека для расширенного ручного управления таймерами ATMega2560, ATMega328, ATMega32u4

License

Notifications You must be signed in to change notification settings

GyverLibs/directTimers

Repository files navigation

latest PIO Foo Foo Foo

Foo

directTimers

Библиотека для расширенного ручного управления таймерами ATMega2560, ATMega328, ATMega32u4

  • Функции библиотеки позволяют получить доступ ко всем возможностям и режимам работы с таймерами/счётчиками + прерывания watchdog
  • Ничего не урезано и не упрощено, доступен весь описанный в даташите функционал

Совместимость

ATMega2560, ATMega328, ATMega32u4

Документация

К библиотеке есть расширенная документация

Содержание

Установка

  • Библиотеку можно найти по названию directTimers и установить через менеджер библиотек в:
    • Arduino IDE
    • Arduino IDE v2
    • PlatformIO
  • Скачать библиотеку .zip архивом для ручной установки:
    • Распаковать и положить в C:\Program Files (x86)\Arduino\libraries (Windows x64)
    • Распаковать и положить в C:\Program Files\Arduino\libraries (Windows x32)
    • Распаковать и положить в Документы/Arduino/libraries/
    • (Arduino IDE) автоматическая установка из .zip: Скетч/Подключить библиотеку/Добавить .ZIP библиотеку… и указать скачанный архив
  • Читай более подробную инструкцию по установке библиотек здесь

Обновление

  • Рекомендую всегда обновлять библиотеку: в новых версиях исправляются ошибки и баги, а также проводится оптимизация и добавляются новые фичи
  • Через менеджер библиотек IDE: найти библиотеку как при установке и нажать "Обновить"
  • Вручную: удалить папку со старой версией, а затем положить на её место новую. "Замену" делать нельзя: иногда в новых версиях удаляются файлы, которые останутся при замене и могут привести к ошибкам!

Инициализация

Нет

Использование

// n - номер таймера (0, 1 или 2)
void TIMERn_COMPA_attachInterrupt(void (*isr)());
void TIMERn_COMPB_attachInterrupt(void (*isr)());
void TIMERn_COMPA_detachInterrupt(void);
void TIMERn_COMPB_detachInterrupt(void);
void TIMERn_setClock(byte clk);
void TIMERn_setMode(byte mode);
void TIMERn_COMPA_mode(byte mode);
void TIMERn_COMPB_mode(byte mode);
byte TIMERn_getCounter(void);
void TIMERn_setCounter(byte value);
void TIMERn_COMPA_setValue(byte value);
void TIMERn_COMPB_setValue(byte value);

// прерывания watchdog
void WDT_attachInterrupt(void (*isr)(),int prescaler);
void WDT_detachInterrupt(void);

/* константы для TIMERn_clock() */
STOPPED             // тактирование будет остановлено , таймер "заморожен"
EXTERNAL_FALLING    // тактирование внешним клоком до 8 мгц по спаду
EXTERNAL_RISING     // тактирование внешним клоком до 8 мгц по фронту

// делители
PRESCALER_1
PRESCALER_8
PRESCALER_32
PRESCALER_64
PRESCALER_128
PRESCALER_256
PRESCALER_1024

/* константы для настройки режима работы таймеров */
STANDARD_MODE       // таймер считает до 255 и сбрасывается в 0, (может до 511/1023 для таймера 1)
CTC_MODE            // таймер считает от 0 до числа заданного функцией TIMERn_COMPA_setValue(), после чего сбрасывается (в этот момент может вызват прерывание)
FAST_PWM_8BIT       // аппаратный шим 8 бит
FAST_PWM_9BIT       // для таймера 1
FAST_PWM_10BIT 

// шим с коррекцией
PHASECORRECT_PWM_8BIT
PHASECORRECT_PWM_9BIT
PHASECORRECT_PWM_10BIT
FAST_PWM_CUSTOM             // шим с кастомной глубиной, глубина задается TIMER0/2_COMPA_setValue() и TIMER1_setTop();
PHASECORRECT_PWM_CUSTOM     // то же самое но с коррекцией

/* константы для управления аппаратными выходами с таймеров */
DISABLE_COMP     // выход отключен от ноги, ногой можно пользоваться
NORM_PWM         // выход генерирует шим >>> +5В при сбросе таймера, 0В при совпадении
INVERT_PWM       // выход генерирует инвертированный шим >>> 0В при сбросе таймера, +5В при совпадении
TOGGLE_PIN       // выход генерирует меандр >>> инверсия состояния пина при совпадении

Пример

Остальные примеры смотри в examples!

#include <directTimers.h>

/* пример генерации шим с выбранной частотой на таймере 1
  формула для рачета предела счета приведена в шпаргалке README */

/*
  Для режима FAST PWM >>> top = (Fтаймера/Fшим)-1;
  Для режима PHASECORRECT PWM >>> top = Fтаймера/(2*Fшим);
*/

// пусть частота ШИМ будет 25 кгц в режиме коррекции фазы >>> top = 8000000/25000 >>> top = 320;

void setup() {
  pinMode(9, 1); // настраиваем канал А как выход
  pinMode(10, 1); // настраиваем канал В как выход

  TIMER1_setClock(PRESCALER_1); // задаем таймеру максимальную частоту
  TIMER1_setMode(PHASECORRECT_PWM_CUSTOM); // включаем режим кастомного предела счета
  TIMER1_setTop(320); // устанавливаем предел счета 320, чтобы получить частоту 25 кгц с коррекцией фазы
  TIMER1_COMPA_mode(NORM_PWM); // настраиваем аппаратные выходы с таймера в режим ШИМ
  TIMER1_COMPB_mode(NORM_PWM);
}

void loop() {
  int dutyA = map(analogRead(A0), 0, 1023, 0, 320); // пересчитываем диапазон потенциометра в диапазон таймера 0...top >>> 0...320
  int dutyB = map(analogRead(A1), 0, 1023, 0, 320);

  TIMER1_COMPA_setValue(dutyA); // устанавливаем на выходе А заполнение потенциометром (pin 9)
  TIMER1_COMPB_setValue(dutyB); // (pin 10)
}

Версии

  • v1.0

Баги и обратная связь

При нахождении багов создавайте Issue, а лучше сразу пишите на почту alex@alexgyver.ru
Библиотека открыта для доработки и ваших Pull Request'ов!

При сообщении о багах или некорректной работе библиотеки нужно обязательно указывать:

  • Версия библиотеки
  • Какой используется МК
  • Версия SDK (для ESP)
  • Версия Arduino IDE
  • Корректно ли работают ли встроенные примеры, в которых используются функции и конструкции, приводящие к багу в вашем коде
  • Какой код загружался, какая работа от него ожидалась и как он работает в реальности
  • В идеале приложить минимальный код, в котором наблюдается баг. Не полотно из тысячи строк, а минимальный код

About

Библиотека для расширенного ручного управления таймерами ATMega2560, ATMega328, ATMega32u4

Resources

License

Stars

Watchers

Forks

Packages