Цитата(SasaVitebsk @ Dec 23 2007, 14:23)

Потребуется 1 таймер.
1) Формируется таблично пол синуса.
2) Таймер инициализируется в режиме с перезагрузкой.
3) Обрабатываются 4 прерывания. По переполнению, и по сравнению A,B,C.
4) по переполнению все рабочие (3 из 6) каналы устанавливаются в 1 и текущее табличное значение по каждому из каналов заносится в соответствующий OCR. Тут же осуществляется выбор рабочих каналов (по сути - полярность синуса)
5) По OCR сбрасывается текущий канал.
Для меги8 и фиксированной выходной частоты
Потребуется 2 таймера (1 и 2)
1) Формируется таблично полный синус. Можно даже с добавлением 3-й гармоники для улучшения КПД системы.
2) Таймера на phase correct PWM. Возможные варианты - либо 8-битный ШИМ, либо
max(OCR1x)=2040; Timer2 prescaler = ck/8
3) Обрабатывается одно прерывание таймера 1 или 2- какое больше нравится

Кроме того, надо читать АЦП и вычислять среднее значение напряжения пульсаций. Назовем его AVG. Лично я делаю это в том же прерывании без зазрения совести- точности хватает. Для измерения напряжения на кондерах достаточно 8-бит точности.
4) По прерыванию берете самое свеженькое значение из АЦП, назовем его Ux. Вычисляете
Kf=(Ux*256)/AVG;
Mag=Commanded_Mag*Kf>>8; /* Mag-амплитуда по выходу, Commanded_Mag - параметр, задающий ограничение амплитуды по выходу */
Едем дальше.
Взяли Uphase_U из таблицы;
Взяли Uphase_V из таблицы со смещением в 120 градусов;
Посчитали
Uphase_U= (Uphase_U*Mag)/256;
Uphase_V=(Uphase_V*Mag)/256;
Uphase_W=- (Uphase_U+Uphase_V);/*вспомнили, что сумма фаз должна быть равна нулю*/
5) Добавляем смещение, соотв. нулю на выходе, выполняем двустороннее ограничение и плюемся в порты. Для 8-битного OCR2 еще и делим на 8 одну из понравившихся фаз.
6) Не забываем, что синусоидальный у нас только ток и только на индуктивной нагрузке.