Котуинко

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

[uquote="BOB51",url="/forum/viewtopic.php?p=3970849#p3970849"]Только вот чегой-то мне не особо верится, что шаг в 1 Герц возможен для всего диапазона...[/uquote]
исходник либы tone если посмотреть - используется режим таймера CTC - шаг в 1Гц имхо не получится.

Оказывается есть STM8 ардуины -sduino
https://github.com/roybaer/sduino_uno
стандартная ардуино IDE поддерживает - хитрО используется SDCC (он без C++)
Изображение
к стати ардуино IDE можно сделать темной (очень легко) и трудиться становиться веселей и приятней для глаз :)
Реклама
Друг Кота
Аватара пользователя
Сообщения: 15678
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Относительно точности до герца в низкочастотной части все же соответствие, а вот где-то от 10 килогерц и более есть смысл помудрствовать...
Да и не СТС, а что-то вроде быстрого ШИМ с потерей 50% скважности на +/- 1-2 периода тактовой частоты...
:roll:

STM8 я видел, но как-то.... не в таком виде -
больше вот такие:
https://vk.com/market-79970674?section= ... 19%2Fquery
:dont_know:

Ну то кому как приятнее/привычнее - светлый или темный фон...
:wink:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

[uquote="BOB51",url="/forum/viewtopic.php?p=3971775#p3971775"]Да и не СТС, а что-то вроде быстрого ШИМ с потерей 50% скважности на +/- 1-2 периода тактовой частоты...[/uquote]
откуда дровишки? Вижу исходник - там явно CTC
https://github.com/arduino/ArduinoCore- ... o/Tone.cpp

Код: Выделить всё

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
...........
Друг Кота
Аватара пользователя
Сообщения: 15678
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Это адуринка как "задачник вопроса" проявилась...
8)
А вот далее....
У меня идейка вытрясти из AVRкина Т1 максимум возможного в смысле генерации последовательности частот с минимальным шагом между ними...
Просто из интереса - "а чего таки можно вытянуть"?
Понятно, что там таки будет в некоторых случаях более 1 Гц/на добавленную единицу счетного импульса, но вот количество тех градаций, да варианты управления счетчиком...
Не теоретически расчетом, а на реальной пищалке и осциллограммке полюбоваться....
Ежли "по примитиву" - один период результата равен двум переполнениям таймера (скважность сигнала 50%).
Т.е. минимальный интервал - 2 периода счетного сигнала (генератора МК)...
А ежли "быстрый ШИМ" - там только 1 период счетного интервала критичен - ессно и градаций при всем том же в два раза больше...

:roll:
Ну и возможные программные "умножайкины трюки" - совместное использование аппаратного и программного счетчиков для расширения диапазона "мягких лапок"...
8)
Реклама
Эиком - электронные компоненты и радиодетали
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

DDS-ом генерируют синус до 20 кГц с шагом в 1Гц (а особо гениальные и с 0,1 Гц), так что меандр и подавно можно сделать.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

у Л.И. есть генератор - диапазон генерируемых частот 1…50000 Гц, минимальный шаг установки частоты 0.01 Гц
DDS реализован программно на микроконтроллере ATmega8 фирмы "Atmel". Быстродействие этого контроллера является достаточным, чтобы при тактовой частоте 16 МГц реализовать 34-разрядный накопитель фазы, работающий на частоте 216 кГц. Такой накопитель фазы обеспечивает шаг перестройки частоты примерно 0.00001 Гц. Реально используется шаг сетки 0.01 Гц,
http://www.leoniv.diod.club/projects/me ... g-530.html
Реклама
OKF
Это не хвост, это антенна
Сообщения: 1430
Зарегистрирован: Вт июн 07, 2011 08:03:18

Сообщение OKF »

DDS - это слишком жирно. Там ведь и другие задачи при звучащем тоне.
При CTC никакого 1 гц шага. Как обычно кто то бредит.)
Друг Кота
Аватара пользователя
Сообщения: 15678
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

OKF писал(а):DDS - это слишком жирно. ...
Воть... оставим тот DDS "на остаточное" - а для начала чего таки можно из простого подручного материала выжать.
Насчет 1Гц/на шаг - это уже зависит от диапазона частот.
В "низкочастотной" части вполне себе возможно, а вот "повыше" пока интерес как можно меньший шаг обеспечить.
8)
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

тут кроме основной задачи DDS в прерывании от таймера T1 кнопки опрашиваются, еще и индикатор есть
https://radiokot.ru/circuit/digital/measure/20/
насчет
вытрясти из AVRкина Т1 максимум возможного в смысле генерации последовательности частот с минимальным шагом между ними...
имхо как не крути - все равно через OCR, на высоких частотах шаг больше 1Гц получится.
Простенький расчет на любимом ардуинщиками Processing

Код: Выделить всё

 int ocr;
     for (int freq = 7900; freq < 8000 ; freq++) { 
        ocr = 8000000/freq - 1;
        freq = 8000000/(ocr+1);
        println("ocr= " + ocr);
        println("freq= " + freq);
    }  
..........
ocr= 1003
freq= 7968
ocr= 1002
freq= 7976
ocr= 1001
freq= 7984
ocr= 1000
freq= 7992
ocr= 999
freq= 8000
Мучитель микросхем
Сообщения: 412
Зарегистрирован: Ср янв 04, 2012 11:57:40
Откуда: Алчевск

Сообщение Sergi »

Проще посчитать корень из тактовой таймера. Все что выше - шаг больше 1 Гц,ниже - меньше 1 Гц.
Делал DDS на 2313 с тактовой 19,5 МГц. Опрос 500 кГц с шагом 1 Гц. Автоматический перестраиваемый фильтр НЧ. Выше 20 кГц не пробовал,не нужно было.
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

значит чем выше тактовая таймера, тем лучше. Можно взять 8 ног STM32G031J6M6 - там 16-ти разрядный TIM1 можно 128МГц тактировать. Есть 32-ти разрядный TIM2 64МГц. В киосках в продаже есть такой - имхо вытрясти из такого максимум возможного поинтереснее будет. 8)
Друг Кота
Аватара пользователя
Сообщения: 15678
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

При "простом делителе" важна не только тактовая частота, но и разрядность самого делителя.
Но в то же время не "переусердствовать" - собственно из-за простенькой задачи ставить DDS или осваивать новое семейство МК на уровне аппаратной начинки...
8)
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

пределитель там 16-ти разрядный - любое значение в диапазоне 0...65535, а если цель "вытрясти" - можно мышкой натыкать без особого осваивания
Изображение
Друг Кота
Аватара пользователя
Сообщения: 15678
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Предделитель особо не котируется - это всего лишь "размер единицы отсчета".
Без дополнительного байтика в счетчике и в регистре цифрового сравнения собо и не важен...
:roll:
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

тю, а кто написал
При "простом делителе" важна не только тактовая частота, но и разрядность самого делителя.
а как же без пределителя низкие частоты делать. Вот примерчик формировать ноты
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, ножка инвертирует свое состояние, а нам нужно чтобы она успела включиться и выключиться.
Друг Кота
Аватара пользователя
Сообщения: 15678
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Для низких - то как раз вопрос и не стоит.
Тот же Т1 АВРки с досчетом до 30651 при 8 Мгц на входе даст 261,0029 Гц...
Это более для частот за 5 КГц актуально.
:roll:
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

дык тратить драгоценный авркин T1 на тон, уж лучше T0, T2 делителем (имхо), чего изначально в ардуино по умняку и сделано

Код: Выделить всё

#define USE_TIMER2
Друг Кота
Аватара пользователя
Сообщения: 15678
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Там вполне себе и программный DDS на базе T2 может уместиться...
:roll:
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

ну у них не было задачи "вытрясти максимум возможного", а так да, там 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
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

глянул - появились у нас в базарном киоске 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)

Ардуинщики на высоте, поддерживают, есть ядро, программатор на обычной ардуине делается
https://github.com/SpenceKonde/megaTinyCore
Ответить

Вернуться в «Разные вопросы по МК»