Compare нас уже не устраивает, да ?
Или PWM mode?

Ты еще тупее, чем я полагал... Каким образом Compare сможет ЗА ОДИН ВХОДНОЙ КЛОК изменить содержимое таймера НА ПРОИЗВОЛЬНУЮ (определенную в некоем регистре) величину?
Ты хоть думаешь над тем что пишешь или тебя вконец переклинило?
То есть на стм32 ресурсы сожрет а на пЫк18 усе в шОколаде?
Да, Досикус, именно так. Патамушта замена специализированного модуля на софтовую реализацию перегружает ядро по самый небалуй. Тебе же не придет в голову реализовывать софтовый таймер на частотах близких к тактовым CPU? Так что тебя удивляет в этом случае?
Подведу черту под мусором от Досикуса и повторю входное сообщение темы.
===============
Модуль NCO (Numerically Controlled Oscillator) является ядром любой микросхемы DDS (прямого цифрового синтеза). Но в специализированных микросхемах старшие разряды (обычно 10...12 из 28...32) сумматора модуля подключены к ROM в которой прописана форма синтезируемого сигнала. То есть на каждый такт суммирования (опорной частоты DDS) генерируется один отсчет выходного сигнала. В модулях NCO PIC-ов, естественно, нет такой возможности и единственная форма сигнала, которую этот модуль может генерировать - импульсы фиксированной длительности синтезируемой частоты следования.
Для синтеза собственно сигналов произвольной формы нужно настроить синтезируемую частоту модуля на частоту ВЫБОРОК синтезируемого сигнала произвольной формы.
Например мы хотим синтезировать синус частотой 1,111 кГц с дискретностью по времени в 256 отсчетов. Значит нам нужно настроить NCO модуль на частоту 284,416 кГц.
Выбираем в качестве накачки NCO осциллятор МК с включенной PLL. Пусть это будет 32 МГц (8 MIPS).
При 20-разрядном сумматоре модуля NCO код искомой частоты (значение инкрементного регистра NCO) будет:
N=FoutDDS
*2^20/Fosc=284416*2^20/32000000=9320.
С учетом округления реальная частота составит:
F=32000000*9320/2^20=284424 Гц, а синтезируемый синус будет иметь частоту 1111,03 Гц.
Каждое переполнение модуля NCO помимо генерации импульса настроенной длительности, генерируется прерывание, в котором и следует перегрузить очередное значение сигнала из таблицы в PWM или DAC.
Таким образом, на крошечном и дешевом PIC10F322 можно сделать настоящий DDS. Правда из-за такого способа синтеза на выходе простейшей RC не обойтись, но даже простейший ФНЧ на ОУ даст очень неплохой результат.
При использовании новейших PIC18F25Q43 с DMA и осциллятором 64 МГц описанная задача станет фоновой и не требующей от ядра МК вообще никаких ресурсов кроме нескольких строк в прерывании от DMA один раз на период синтезируемого сигнала. К слову, отпускная стоимость упомянутого PIC18 у Микрочипа, как неожиданно выяснилось - менее 1 бакса...

