Цитата(=GM= @ Jul 26 2007, 18:42)

Идея вашего метода хороша, но на практике плохо реализуема, поскольку в регистре OCR1A будет число 25, то вы можете получить максимум 25 градаций между 600 и 640 кГц.
Извините но не совсем Вас понял.
Маленький комментарий программе (алгоритму)
РЕЖИМ Fast PWM top=OCR1A
ВЫХОД OC1B output: Non-Inv
ЧАСТОТА 307 ... 320 Килогерц
ПРЕРЫВАНИЕ по периоду выходной частоты (достигается записью в OCR1A )
ПОЛУПЕРИОД изменение значения OCR1B
МИНУСА узкополосность (хотя можно усложнить алгоритм), джеттер, дребезжание *фазы*
КВАРЦ допустим 24 Мегагерца (за период 320Килогерц 75тактов в обработчике)
работа построена по следующему принципу:
переменная полупериода -- четыре регистра (long int)
старшие два -- реальная часть переменной long int
младшие два -- мнимая часть переменной long int
Вот мнимая часть, старший из младших регистров
0х80 | 0x40 | 0x20 | 0x10 | 0x08 | 0x04 | 0x02 | 0x01
| | | | | | | |
0,5 0,25 0,125 0,0625 0,03125 0,015625 0,0078125 0,00390625
#pragma vector = TIMER1_COMPA_vect
__interrupt void irqHandler(void)
Обнуление старших двух регистров PPperiodTmpH = 0;(правильная работа по цыклу)
суммирование мнимой части (младшие два) а также перезапись старших (старшие два)
запись старших двух регистров в OCR1A
Tmp = OCR1A - OCR1B ;
OCR1B = Tmp;
ВЫХОД
если мнимая часть переполняется (adc суммирование с переносом)--- младший из
старших регистров увеличивается
Так, если седьмой бит в старшем из младших установлен регистров(0х80) то дробный коэфициент равен 0,5
ну и соответственно так дальше.... Думаю не плохо..