при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
http://www.leoniv.diod.club/projects/me ... g-530.htmlDDS реализован программно на микроконтроллере ATmega8 фирмы "Atmel". Быстродействие этого контроллера является достаточным, чтобы при тактовой частоте 16 МГц реализовать 34-разрядный накопитель фазы, работающий на частоте 216 кГц. Такой накопитель фазы обеспечивает шаг перестройки частоты примерно 0.00001 Гц. Реально используется шаг сетки 0.01 Гц,
Воть... оставим тот DDS "на остаточное" - а для начала чего таки можно из простого подручного материала выжать.OKF писал(а):DDS - это слишком жирно. ...
имхо как не крути - все равно через OCR, на высоких частотах шаг больше 1Гц получится.вытрясти из AVRкина Т1 максимум возможного в смысле генерации последовательности частот с минимальным шагом между ними...
Код: Выделить всё
int ocr;
for (int freq = 7900; freq < 8000 ; freq++) {
ocr = 8000000/freq - 1;
freq = 8000000/(ocr+1);
println("ocr= " + ocr);
println("freq= " + freq);
} а как же без пределителя низкие частоты делать. Вот примерчик формировать нотыПри "простом делителе" важна не только тактовая частота, но и разрядность самого делителя.
Допустим, нужно посчитать сколько нужно тиков, чтобы сформировать частоту, например нота До 1 октавы 261Гц. Для этого исходные 4 000 000 таймера делим на предделитель 50. Предделитель просто позволяет сделать величины нот в разумными, т.е. в пределах uint16_t.
4000 000/50= 80 000 это рабочая частота после всех делителей.
Теперь нужно найти число, которое нужно положить в ARR, чтобы из исходных 80 000 получить нужные нам 261Гц.
(80 000/(261*2))-1= 152
Почему тут умножаем на 2, потому что при достижении таймером регистра ARR, ножка инвертирует свое состояние, а нам нужно чтобы она успела включиться и выключиться.
Код: Выделить всё
#define USE_TIMER2Код: Выделить всё
; Output frequency (using 24 bit accumulator) :
;
; f = deltaPhase * fClock/2^24
;
; fClock is in this case the CPU clock divided by the
; number of cycles to output the data ( 9 cycles )
;
; f = r24/r25/r26 * (11059200/9)/16777216
;
; f = r24/r25/r26 * 0.073242188
;
; fMax (theoretical) = 0.5 * fClock
......
; main loop
;
; r28,r29,ZL is the phase accumulator
; r24,r25,r26 is the adder value determining frequency
;
; add value to accumulator
; load byte from current table in ROM
; output byte to port
; repeat
LOOP1:
add r28,r24 ; 1
adc r29,r25 ; 1
adc ZL,r26 ; 1
; note: LPM will read (ZH, ZL). r30 is constantly changing (MSB, but LSB of ZH)
lpm ; 3
out PORTB,r0 ; 1
rjmp LOOP1 ; 2 => 9 cyclesПрограмматор или отладчик?программатор на обычной ардуине делается