/* * * DDS Sine Generator mit ATMEGS 168 * Timer2 generates the 31250 KHz Clock Interrupt * * KHM 2009 / Martin Nawrath * Kunsthochschule fuer Medien Koeln * Academy of Media Arts Cologne
*/
#include "avr/pgmspace.h"
// table of 256 sine values / one sine period / stored in flash memory PROGMEM prog_uchar sine256[] = { 127,130,133,136,139,143,146,149,152,155,158,161,164,167,170,173,176,178,181,184,187,190,192,195,198,200,203,205,208,210,212,215,217,219,221,223,225,227,229,231,233,234,236,238,239,240, 242,243,244,245,247,248,249,249,250,251,252,252,253,253,253,254,254,254,254,254,254,254,253,253,253,252,252,251,250,249,249,248,247,245,244,243,242,240,239,238,236,234,233,231,229,227,225,223, 221,219,217,215,212,210,208,205,203,200,198,195,192,190,187,184,181,178,176,173,170,167,164,161,158,155,152,149,146,143,139,136,133,130,127,124,121,118,115,111,108,105,102,99,96,93,90,87,84,81,78, 76,73,70,67,64,62,59,56,54,51,49,46,44,42,39,37,35,33,31,29,27,25,23,21,20,18,16,15,14,12,11,10,9,7,6,5,5,4,3,2,2,1,1,1,0,0,0,0,0,0,0,1,1,1,2,2,3,4,5,5,6,7,9,10,11,12,14,15,16,18,20,21,23,25,27,29,31, 33,35,37,39,42,44,46,49,51,54,56,59,62,64,67,70,73,76,78,81,84,87,90,93,96,99,102,105,108,111,115,118,121,124
// variables used inside interrupt service declared as voilatile volatile byte icnt; // var inside interrupt volatile byte icnt1; // var inside interrupt volatile byte c4ms; // counter incremented all 4ms volatile unsigned long phaccu; // pahse accumulator volatile unsigned long tword_m; // dds tuning word m
void setup() { pinMode(ledPin, OUTPUT); // sets the digital pin as output Serial.begin(115200); // connect to the serial port Serial.println("DDS Test");
pinMode(6, OUTPUT); // sets the digital pin as output pinMode(7, OUTPUT); // sets the digital pin as output pinMode(11, OUTPUT); // pin11= PWM output / frequency output
Setup_timer2();
// disable interrupts to avoid timing distortion cbi (TIMSK0,TOIE0); // disable Timer0 !!! delay() is now not available sbi (TIMSK2,TOIE2); // enable Timer2 Interrupt
dfreq=1000.0; // initial output frequency = 1000.o Hz tword_m=pow(2,32)*dfreq/refclk; // calulate DDS new tuning word
} void loop() { while(1) { if (c4ms > 250) { // timer / wait fou a full second c4ms=0; dfreq=analogRead(0); // read Poti on analog pin 0 to adjust output frequency from 0..1023 Hz
cbi (TIMSK2,TOIE2); // disble Timer2 Interrupt tword_m=pow(2,32)*dfreq/refclk; // calulate DDS new tuning word sbi (TIMSK2,TOIE2); // enable Timer2 Interrupt
sbi(PORTD,6); // Test / set PORTD,7 high to observe timing with a scope cbi(PORTD,6); // Test /reset PORTD,7 high to observe timing with a scope } } //****************************************************************** // timer2 setup // set prscaler to 1, PWM mode to phase correct PWM, 16000000/510 = 31372.55 Hz clock void Setup_timer2() {
//****************************************************************** // Timer2 Interrupt Service at 31372,550 KHz = 32uSec // this is the timebase REFCLOCK for the DDS generator // FOUT = (M (REFCLK)) / (2 exp 32) // runtime : 8 microseconds ( inclusive push and pop) ISR(TIMER2_OVF_vect) {
sbi(PORTD,7); // Test / set PORTD,7 high to observe timing with a oscope
phaccu=phaccu+tword_m; // soft DDS, phase accu with 32 bits icnt=phaccu >> 24; // use upper 8 bits for phase accu as frequency information // read value fron ROM sine table and send to PWM DAC OCR2A=pgm_read_byte_near(sine256 + icnt);
Перед вами текст рабочей программы для генератора синуса на ардуино. Сейчас на выходе частота ШИМ, который модулирует синусоиду, около 30 кГц. Измените код так, чтоб частота ШИМ была около 5 кГц. Брал отсюда https://cxem.net/arduino/arduino16.php
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
После изменения частоты ШИМ генератор стал слишком медленно реагировать на вращение переменного резистора. Т.е. нужно ждать секунд 5 пока частота изменится. Подскажите как это можно исправить? А ещё при изменении initial frequency с 1000 Гц до 100 Гц ШИМ на осциллографе начинает бегать быстрее
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
// variables used inside interrupt service declared as voilatile volatile byte icnt; // var inside interrupt volatile byte icnt1; // var inside interrupt volatile byte c4ms; // counter incremented all 4ms //volatile unsigned long phaccu; // pahse accumulator volatile unsigned long tword_m; // dds tuning word m
void setup() { pinMode(ledPin, OUTPUT); // sets the digital pin as output Serial.begin(57600); // connect to the serial port 115200 Serial.println("DDS Test");
pinMode(6, OUTPUT); // sets the digital pin as output pinMode(7, OUTPUT); // sets the digital pin as output pinMode(11, OUTPUT); // pin11= PWM output / frequency output
Setup_timer2();
// disable interrupts to avoid timing distortion cbi (TIMSK0,TOIE0); // disable Timer0 !!! delay() is now not available sbi (TIMSK2,TOIE2); // enable Timer2 Interrupt
dfreq = 100.0; // initial output frequency = 100.o Hz tword_m=pow(2,16)*dfreq/refclk; // calulate DDS new tuning word
} void loop() { while(1) { if (c4ms > 250) { // timer / wait fou a full second c4ms=0; dfreq=analogRead(0); // read Poti on analog pin 0 to adjust output frequency from 0..1023 Hz //dfreq=analogRead(0)/2; // read Poti on analog pin 0 to adjust output frequency from 0..511 Hz //dfreq=analogRead(0)/4; // read Poti on analog pin 0 to adjust output frequency from 0..255 Hz
cbi (TIMSK2,TOIE2); // disble Timer2 Interrupt tword_m=pow(2,16)*dfreq/refclk; // calulate DDS new tuning word sbi (TIMSK2,TOIE2); // enable Timer2 Interrupt
sbi(PORTD,6); // Test / set PORTD,7 high to observe timing with a scope cbi(PORTD,6); // Test /reset PORTD,7 high to observe timing with a scope } } //****************************************************************** // timer2 setup // set prscaler to 1, PWM mode to phase correct PWM, 16000000/510 = 31372.55 Hz clock ?????? void Setup_timer2() {
//****************************************************************** // Timer2 Interrupt Service at 31372,550 KHz = 32uSec // this is the timebase REFCLOCK for the DDS generator // FOUT = (M (REFCLK)) / (2 exp 32)
// переделано Timer2 Interrupt Service at 3921 Hz = 255uSec // runtime : 8 microseconds ( inclusive push and pop) ISR(TIMER2_OVF_vect) { static unsigned int phaccu; // pahse accumulator sbi(PORTD,7); // Test / set PORTD,7 high to observe timing with a oscope
phaccu=phaccu+tword_m; // soft DDS, phase accu with 16 bits icnt=phaccu >> 8; // use upper 8 bits for phase accu as frequency information
Напряжение на выходе частотозависимо и обратнопропорционально частоте, но это легко решается путем установки усилителя... Спойлер Полагаю не нужно объяснять, как из Ардуины сотворить генератор меандра 1 Гц -1 мГц?
_________________ "Ваше время ограничено, поэтому не тратьте его, живя чужой жизнью." Стив Джобс (Steve Jobs) сооснователь Apple.
Последний раз редактировалось Allaya Ср авг 04, 2021 14:48:38, всего редактировалось 5 раз(а).
Чистый синус из меандра с помощью интегратора на двух компараторах...
Ёпть! Ты жертва ЕГЭ и копипасты? 1. Интегрированием в принципе нельзя из прямоугольника получить синус: - первый интегратор из перепада сформирует линейно нарастающий/падающий участок (линейная функция y=x+c), - второй интегратор из линейной функции сформирует ее квадрат (y=x^2/2+c).
Чтобы на выходе интегратора получить синус, ему на вход нужно подать косинус, которого нет.
2. На компараторе интегратор не делается, он делается на ОУ и LM324 - это ОУ. 3. Приведенная схема не интегратор, а два частотно-зависимых усилителя, можно сказать два последовательно включенных ФНЧ 1-го порядка.
Напряжение на выходе частотозависимо и обратнопропорционально частоте, но это легко решается путем установки усилителя... Спойлер Полагаю не нужно объяснять, как из Ардуины сотворить генератор меандра 1 Гц -1 мГц?
Хрен там легко решается! Давай, отфильтруй с помощью ФНЧ у меандра 1 Гц гармоники, с ослаблением третьей, скажем на 40 дБ, чтобы синус походил на синус. Что останется на выходе такого фильтра при частоте входного меандра даже не 1 МГц, а 1 кГц? Хрен, да еще чуток и если ты это возьмешься усиливать, то синусоида умрет в шумах. Фильтровать меандр, для получения из него синуса, можно, но фильтр для этого должен быть следящий за входной частотой. Проще всего такое делается на коммутируемых конденсаторах.
А вообще лучше использовать специализированные генераторы, а ардуину использовать для управления частотой генератора.
А вообще лучше использовать специализированные генераторы, а ардуину использовать для управления частотой генератора.
Согласен, есть уже готовое решение на ЦАП MCP4725 по I2C протоколу. Попробуйте разделить период синуса на 4095 частей - как вам дискретность? Генератор на этом ЦАП способен принимать SPWM сигналы частотой до 500 кГц. Единственный недостаток - востребуется малошумящий источник питания! Спойлер
_________________ "Ваше время ограничено, поэтому не тратьте его, живя чужой жизнью." Стив Джобс (Steve Jobs) сооснователь Apple.
Последний раз редактировалось Allaya Чт авг 05, 2021 16:20:48, всего редактировалось 3 раз(а).
Что? Ну способен это чип работать на скоростях high speed (3.4 MHz) mode, сначала найдите тот МК которое вытянет шину I2C на этой скорости. У линейки stm32 максимальное значение 400 кГц, F0/F3/F7/L0/L4 составляют исключение и поддерживают режим fast mode plus (1 МГц).
Максимальный вменяемый синус с stm32f100 ЦАП12бит 30кГц, чуть хуже результат выдает stm32f0(DMA) + MCP4725 (fast mode plus 1 МГц).
Allaya писал(а):
Генератор на этом ЦАП способен генерировать синус с частотой до 500 кГц и 20 сэмплами
позвольте поинтересоваться, что такое 20 семплов? Вроде как - число сэмплов в секунду называется частотой дискретизации (сэмплирования)?
Тогда для построения синуса в 500 кГц и 20 семплами, потребуется 500.000*20=10.000.000(Гц).... Вы что, смеетесь? Ни один чип не способен вам генерировать табличный синус в 500 кГц.
Связка stm32f0(DMA) + MCP4725 (fast mode plus 1 МГц) при частоте таймера 500кГц выдаст вам синус, 20 семплов, максимум 25кГц.
Смотрите в сторону специализированных чипов DDS AD9833, у них таймер работает на частоте 25МГц, 25МГц/20 = синус в 1,250 МГц.
Согласен, есть уже готовое решение на ЦАП MCP4725 по I2C протоколу. Попробуйте разделить период синуса на 4095 частей - как вам дискретность? Генератор на этом ЦАП способен генерировать синус с частотой до 500 кГц и 20 сэмплами на этой частот
1. У этого ЦАП типовое время установления выходного напряжения 6 мкс, так что ни о каких 500 кГц (период 2 мкс) речи быть не может. 2. В ардуине уно с кварцем 16 МГц, I2C работает со скоростью 100 кбит/сек, а это означает, что работая с MCP4725 по Fast Mode Write Command (передается 2 байта), отсчеты в ЦАП можно передавать не чаще 100000/16 = 6250 раз в секунду. Если синус формировать из 20 отсчетов на период, то максимальная частота этого синуса будет не выше 6250/20 = 312,5 Гц. Даже если вдруг скорость I2C удастся поднять до 400 кбит/сек, это поднимет максимальную частоту синуса всего в 4 раза - до 1250 Гц. Следует так же учитывать, что 20 отсчетов на период - это немного, после ЦАП обязательно потребуется фильтр.
P.S. Копипаста никогда не заменит собственных знаний. Не смотри чушь в ютьюбе, изучай хотя бы основы электроники, чтобы элементарно на пальцах можно было прикинуть что к чему.
P.S. Копипаста никогда не заменит собственных знаний. Не смотри чушь в ютьюбе, изучай хотя бы основы электроники, чтобы элементарно на пальцах можно было прикинуть что к чему.
Можно подумать, что я постоянно этим тут занимаюсь... И, вроде давно подправил свой пост на счет 500 кГц А за идею генератора на модуле AD9833 благодарю...
_________________ "Ваше время ограничено, поэтому не тратьте его, живя чужой жизнью." Стив Джобс (Steve Jobs) сооснователь Apple.
Разве ЦАП MCP4725 не в состоянии воспроизвести синус с частотой 5 кГц
Нет, не в состоянии. Даже если взять high speed (3.4 MHz) mode 3400000 / 16бит = 212500 / на 20 семплов = 10625Гц. PIC, возможно, и раскочегарит шину I2C до таких скоростей.
Но вы не расстраивайтесь, Ардуино с кварцем 16 МГц Atmega168 не тянет да же и 400кГц, максимум что удалось выжить 262144Гц, а это 262144 / на 20 семплов = 13107Гц. Вот код:СпойлерПорт PORTD 8бит ЦАП R-2R Таблица синуса 256 значений
а теперь, частота прерывания таймера 262144Hz, частота МК 16МГц
Код:
// Пусть нам нужно генерировать частоту 1000 Гц, учитывая, что основную процедуру таймер у нас исполняет 262144 раз в секунду // 32768*2 / (262144 / 1000Гц) = 250
А если и уж что-то и советовать, то dds-синтез для частотного преобразователя не годится, он имеет один недостаток - джиттер, чем ниже частота накачки сумматора, тем этот джиттер больше. Было 30кГц, попросили сделать 5кГц, джиттер был 1/30000 = 33 мкс, стал 1/5000 = 200мкс, как это отразится на реальном устройстве - не знаю.
Я как-то подключал к компьютерному бесперебойнику, естественно при питании от аккумулятора, вот такой насос отопленияСпойлертак сразу работает как-то не адекватно, появился какой-то шум. Так этот бесперебойник имеет на выходе аппроксимацию синусоиды полиномом третей степени, ну не было у меня бесперебойника с чистой синусоидой.
не знаю что за моторы которые вы хотите крутить чт им нужен частейший синус? ну будет чуть гудеть силнее и гретца не смертелно чай не вечно он отинвертора работать будет ну а частотники даде пром серий часто вапше филтроф не имею поэтомуи огнраничение на длину кабеля до мотора....
_________________ ZМудрость(Опыт и выдержка) приходит с годами. Все Ваши беды и проблемы, от недостатка знаний. Умный и у дурака научится, а дураку и .. Алберт Ейнштейн не поможет и ВВП не спасет.и МЧС опаздает
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения