Только вот чегой-то мне не особо верится, что шаг в 1 Герц возможен для всего диапазона...
исходник либы tone если посмотреть - используется режим таймера CTC - шаг в 1Гц имхо не получится.
Оказывается есть STM8 ардуины -sduino https://github.com/roybaer/sduino_uno стандартная ардуино IDE поддерживает - хитрО используется SDCC (он без C++) к стати ардуино IDE можно сделать темной (очень легко) и трудиться становиться веселей и приятней для глаз
Относительно точности до герца в низкочастотной части все же соответствие, а вот где-то от 10 килогерц и более есть смысл помудрствовать... Да и не СТС, а что-то вроде быстрого ШИМ с потерей 50% скважности на +/- 1-2 периода тактовой частоты...
if (_timer != -1) { // Set timer specific stuff // All timers in CTC mode // 8 bit timers will require changing prescalar values, // whereas 16 bit timers are set to either ck/1 or ck/64 prescalar switch (_timer) { #if defined(TCCR0A) && defined(TCCR0B) && defined(WGM01) case 0: // 8 bit timer TCCR0A = 0; TCCR0B = 0; bitWrite(TCCR0A, WGM01, 1); bitWrite(TCCR0B, CS00, 1); timer0_pin_port = portOutputRegister(digitalPinToPort(_pin)); timer0_pin_mask = digitalPinToBitMask(_pin); break; #endif .............................
Это адуринка как "задачник вопроса" проявилась... А вот далее.... У меня идейка вытрясти из AVRкина Т1 максимум возможного в смысле генерации последовательности частот с минимальным шагом между ними... Просто из интереса - "а чего таки можно вытянуть"? Понятно, что там таки будет в некоторых случаях более 1 Гц/на добавленную единицу счетного импульса, но вот количество тех градаций, да варианты управления счетчиком... Не теоретически расчетом, а на реальной пищалке и осциллограммке полюбоваться.... Ежли "по примитиву" - один период результата равен двум переполнениям таймера (скважность сигнала 50%). Т.е. минимальный интервал - 2 периода счетного сигнала (генератора МК)... А ежли "быстрый ШИМ" - там только 1 период счетного интервала критичен - ессно и градаций при всем том же в два раза больше...
Ну и возможные программные "умножайкины трюки" - совместное использование аппаратного и программного счетчиков для расширения диапазона "мягких лапок"...
у Л.И. есть генератор - диапазон генерируемых частот 1…50000 Гц, минимальный шаг установки частоты 0.01 Гц
Цитата:
DDS реализован программно на микроконтроллере ATmega8 фирмы "Atmel". Быстродействие этого контроллера является достаточным, чтобы при тактовой частоте 16 МГц реализовать 34-разрядный накопитель фазы, работающий на частоте 216 кГц. Такой накопитель фазы обеспечивает шаг перестройки частоты примерно 0.00001 Гц. Реально используется шаг сетки 0.01 Гц,
Воть... оставим тот DDS "на остаточное" - а для начала чего таки можно из простого подручного материала выжать. Насчет 1Гц/на шаг - это уже зависит от диапазона частот. В "низкочастотной" части вполне себе возможно, а вот "повыше" пока интерес как можно меньший шаг обеспечить.
Проще посчитать корень из тактовой таймера. Все что выше - шаг больше 1 Гц,ниже - меньше 1 Гц. Делал DDS на 2313 с тактовой 19,5 МГц. Опрос 500 кГц с шагом 1 Гц. Автоматический перестраиваемый фильтр НЧ. Выше 20 кГц не пробовал,не нужно было.
значит чем выше тактовая таймера, тем лучше. Можно взять 8 ног STM32G031J6M6 - там 16-ти разрядный TIM1 можно 128МГц тактировать. Есть 32-ти разрядный TIM2 64МГц. В киосках в продаже есть такой - имхо вытрясти из такого максимум возможного поинтереснее будет.
При "простом делителе" важна не только тактовая частота, но и разрядность самого делителя. Но в то же время не "переусердствовать" - собственно из-за простенькой задачи ставить DDS или осваивать новое семейство МК на уровне аппаратной начинки...
Предделитель особо не котируется - это всего лишь "размер единицы отсчета". Без дополнительного байтика в счетчике и в регистре цифрового сравнения собо и не важен...
При "простом делителе" важна не только тактовая частота, но и разрядность самого делителя.
а как же без пределителя низкие частоты делать. Вот примерчик формировать ноты http://avr-start.ru/?p=3876 там таймер4 сидит на шине APB1, далее обычные расчеты (выше подобные уже были)
Цитата:
Допустим, нужно посчитать сколько нужно тиков, чтобы сформировать частоту, например нота До 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, ножка инвертирует свое состояние, а нам нужно чтобы она успела включиться и выключиться.
Для низких - то как раз вопрос и не стоит. Тот же Т1 АВРки с досчетом до 30651 при 8 Мгц на входе даст 261,0029 Гц... Это более для частот за 5 КГц актуально.
ну у них не было задачи "вытрясти максимум возможного", а так да, там DDSа того - 6 строк ассемблера
Код:
; 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
глянул - появились у нас в базарном киоске soic8 ATtiny212 ATtiny202, чуть дороже ATtiny13 - а там навалили таймеров для генерации тона – One 16-bit Timer/Counter Type A with Dedicated Period Register, Three Compare Channels (TCA) – One 16-bit Timer/Counter type B with Input Capture (TCB) – One 12-bit Timer/Counter type D Optimized for Control Applications (TCD) – One 16-bit Real Time Counter (RTC) Running from External Crystal or Internal RC Oscillator еще и ЦАПчик есть синусы генерить – 8-bit Digital to Analog Converter (DAC) еще и это может к делу приобщить – Configurable Custom Logic (CCL) with Two Programmable Lookup Tables (LUT)
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения