фазово-корректный analogWrite на любом пине
- Войдите на сайт для отправки комментариев
Есть два режима PWM: быстрый и с корректной фазой. На моей обычной Arduino Uno доступно 6 пинов для аппаратной реализации, каждые 2 пина отнимают один таймер. Поэтому, иногда надо реализовать ШИМ прогрмно. Хорошая реализация быстрого варианта сделана maksim, но иногда необходимо делать фазово-корректный ШИМ. Предлагаю посмотреть на мою реализацию тут: https://github.com/jabbervorx/arduino-any-pc-pwm
Пример использования:
#define _PWM_PIN_11 #define _useTimer2 #include "AnyPCPWM.h" void setup() { setup_pc_pwm_any(); }
Это установка используемых пинов. К сожалению, не удалось сделать без явного вызова функции setup_pc_pwm_any(), поскольку ардуиновская библиотечная функция init() перепрограммирует таймеры по своему и любые установки таймеров перед ней оказываются бесполезными, а вызов функций после init() находится как раз в setup().
void loop() { static unsigned long next_print = 0; if (millis() > next_print) { short pot_value = 1023 - analogRead(A1); analogWriteAny(11, pot_value / 4); next_print = millis() + 100; } }
Всё точно как с analogWrite, только название функции немного другое. Расчёт таймерного прескейла и каунтера -- обсуждаем :) Сейчас сделана поддержка Timer1 и Timer2 -- выбирается дефайном перед включением библиотеки.
а что такое ШИМ с корректной фазой?
а что такое ШИМ с корректной фазой?
По большому счёту, особенность в том, что вершина волны находится в известном месте и на всех выходах в одном и том же, независимо от ширины волны. Смысл именно в синхронизации фаз на разных выходах. Более подробно пишут в документации https://www.google.com/search?q=%D0%A8%D0%98%D0%9C+%D1%81+%D0%BA%D0%BE%D1%80%D1%80%D0%B5%D0%BA%D1%82%D0%BD%D0%BE%D0%B9+%D1%84%D0%B0%D0%B7%D0%BE%D0%B9
Видимо, Phase correct PWM.
Симметричный ШИМ, реализуемый за счет инверсной работы счетчика (попеременно инкрементный/декрементный счет)