фазово-корректный analogWrite на любом пине

ites
Offline
Зарегистрирован: 26.12.2013

Есть два режима 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 -- выбирается дефайном перед включением библиотеки.

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

а что такое ШИМ с корректной фазой?

ites
Offline
Зарегистрирован: 26.12.2013

Tomasina пишет:

а что такое ШИМ с корректной фазой?

По большому счёту, особенность в том, что вершина волны находится в известном месте и на всех выходах в одном и том же, независимо от ширины волны. Смысл именно в синхронизации фаз на разных выходах. Более подробно пишут в документации 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

step962
Offline
Зарегистрирован: 23.05.2011

Видимо, Phase correct PWM.

Симметричный ШИМ, реализуемый за счет инверсной работы счетчика (попеременно инкрементный/декрементный счет)