Я на него и намекал
NCO может выдать как меандр, так и импульсы определенных длительностей.
Диапазон частот большой, шаг перестройки очень маленький, настройка и перенастройка - пара-тройка строк.
Код: Выделить всё
// 32 значения амплитуды, одно полное колебание сигнала мяяяяандер
uint8_t period[] = {
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
};
// Пусть нам нужно генерировать частоту 80000 Гц, учитывая, что основную процедуру таймер у нас исполняет 160000 раз в секунду
#define n_counter 32768UL // 65536 / (160000 / 80000) = 32768
ISR(TIMER2_COMPA_vect)
{ static uint16_t gen_counter = 0;
gen_counter = gen_counter + n_counter;
if(period[(gen_counter>>11)] == 1)
PORTB |= (1<<(PORTB0));
else
PORTB &= (~(1<<(PORTB0)));
}
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: 16000,000 kHz
// Mode: CTC top=OCR2A
// OC2A output: Disconnected
// OC2B output: Disconnected
// Timer Period: 6,25 us
ASSR=(0<<EXCLK) | (0<<AS2);
TCCR2A=(0<<COM2A1) | (0<<COM2A0) | (0<<COM2B1) | (0<<COM2B0) | (1<<WGM21) | (0<<WGM20);
TCCR2B=(0<<WGM22) | (0<<CS22) | (0<<CS21) | (1<<CS20);
TCNT2=0x00;
OCR2A=0x63;
OCR2B=0x00;
TIMSK2=(0<<OCIE2B) | (1<<OCIE2A) | (0<<TOIE2);
sei();
