ШИМ Синусоида

Nickalaich
Nickalaich аватар
Offline
Зарегистрирован: 07.04.2013

Требуется собрать генератор двух одинаковых ШИМ сигналов, которыми промодулирована частота 60 герц. Есть программные средства для создания двух ШИМ с противоположной полярностью?

std
Offline
Зарегистрирован: 05.01.2012

мб инвертор на транзисторе, но будет на микросекунды запаздывать.

Nickalaich
Nickalaich аватар
Offline
Зарегистрирован: 07.04.2013

Инвертор не получится использовать, лучше всего это программно реализовать.

dimax
dimax аватар
Онлайн
Зарегистрирован: 25.12.2013

Nickalaich пишет:

 Есть программные средства для создания двух ШИМ с противоположной полярностью?

Есть, биты Compare_Output_mode регистра TCCRxA задают требуемый режим выхода.

Nickalaich
Nickalaich аватар
Offline
Зарегистрирован: 07.04.2013

Ладно, уже что-то. Спасибо.

Logik
Offline
Зарегистрирован: 05.08.2014

А на какой частоте нужен ШИМ? Аналоговый выводы не подойдут? Тогда все просто на один вывод 512+511*sin(2*pi*60*t) на другой 512-511*sin(2*pi*60*t). Или я чего не понял.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

А где у дунек "аналоговые выходы"? :)

Nickalaich
Nickalaich аватар
Offline
Зарегистрирован: 07.04.2013

Подойдет частота выше звуковой, хочу использовать таймер 0 в режиме Phase-correct PWM. Тогда частота должна быть 31,25 кГц. Всё так?

После pinMode мне, видимо, нужно написать:
TCCR0A = _BV(COM0A1) | _BV(COM0B1) | _BV(WGM00);
TCCR0B = _BV(CS00);

В соответствии с:
http://playground.arduino.cc/Main/TimerPWMCheatsheet 

Но, что делать дальше, я особого понятия уже не имею.  Нашел только это: 
https://www.arduino.cc/en/Tutorial/DueSimpleWaveformGenerator
Отсюда можно взять массив для синусоиды. Точнее, нельзя. В нём всего лишь 255 значений, а нужно 510.

Logik
Offline
Зарегистрирован: 05.08.2014

Arhat109-2 пишет:

А где у дунек "аналоговые выходы"? :)

http://arduino.ru/Reference/AnalogWrite

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Это PWM или ШИМ ноги .. они точно также как и остальные устанавливаются или в лог.0 или в лог.1 .. разница только в том, что время стояния 1 (или 0) можно указывать в аппаратном таймере .. вы же написали про "аналоговые выходы" .. то есть я вас понял про DAC конвертер (преобразование числа в аналоговый уровень сигнала аппаратно) .. у ATxmega да, такие есть .. но насколько знаю на них нет "Ардуино" плат или они не распространены.

Чтобы из ШИМ сделать полноценный DAC вообще-то надо постараться. Простой интегрирующий конденсатор полезен только для фиксированной частоты DAC.

Nickalaich
Nickalaich аватар
Offline
Зарегистрирован: 07.04.2013

Не имеет особого смысла использовать DAC. Нужно лишь составить массив из значений коэффициента заполнения, т.к. модулируемая частота строго фиксирована. Из хитростей требуется только прямая запись в регистры, насколько я понял за последние пару часов. Такой код даже на 10% не нагрузит процессор МК.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Возьмите любой таймер AVR-ки (не знаю в какой модели вы это хотите использовать, подойдет "любая"), настройте один его выход (их от 2 до 4 в зависимости от модели на таймер) на прямую выдачу, а второй на инверсную и управляйте ШИМ таймера хоть по синусоиде, хоть по какому иному закону, хоть таблично, ... в общем как вдумается. В чем проблема?

dimax
dimax аватар
Онлайн
Зарегистрирован: 25.12.2013

Nickalaich, вам будет проще найти аналогичный проект. С начальными знаниями о таймерах ничего не получится, тут нужно досканально понимать все нюансы программирования таймеров. Нужно настроить 16-битный таймер на прерывание по переполнению, если вам нужна  точность в 512 отсчётов, то выходная частота будет 31250/512=61,03 Гц В прерывании по переполнению нужно программировать скважность таймера из готового буффера данных на 512 байт, или вычисляя математически. Второе вряд ли реально при такой скорости. Первое может  и реально, но в любом случае МК ничего другого делать уже не сможет. Так что в любом случае лучше задуматься о чисто аппаратном решении данной задачи.

Nickalaich
Nickalaich аватар
Offline
Зарегистрирован: 07.04.2013

Первый вариант реален, больше ничего от МК и не требуется. Я выбрал именно такой способ, потому что аналоговый способ генерации ШИМ сигнала именно такой частоты требует гораздо больше деталей и импульсный трансформатор. В заданный корпус может не влезть.

dimax
dimax аватар
Онлайн
Зарегистрирован: 25.12.2013

Nickalaich, ну найдите сначала (или сделайте)  массив синуса на 512 байт, глядишь и выйдет чего :)

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Верно. Только непонятно почему накатать 512 байт в предварительный буфер - "проблема" или сложность. Взять калькулятор, подсчитать заранее и сложить в общую программную память. Оттуда доставать при завершении предыдущего счета в таймер. Да, при 512 значениях можно обойтись буфером в 1/4 периода (128шт) ибо синус симметричен, что позволяет обойтись и 8-и битным таймером...

Nickalaich
Nickalaich аватар
Offline
Зарегистрирован: 07.04.2013

Вопрос - массив обязательно должен быть в шестнадцатеричной системе счисления?

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

?!? Этот вопрос на что влияет и из каких соображения появился? :)

Nickalaich
Nickalaich аватар
Offline
Зарегистрирован: 07.04.2013

А впрочем, я уже нашел таблицу значений :)

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Да, ступил. Если надо 512 значений по амплитуде, то 8-и битный тайрем использовать, скорее всего, не получится.

Logik
Offline
Зарегистрирован: 05.08.2014

Nickalaich пишет:

А впрочем, я уже нашел таблицу значений :)

да в сетапе расчитайте нужную таблицу в нужном виде в массив и усё, в лупе пользуйте. Это к стати может быть и не отсчеты синуса а непосредственно длительности импульса ШИМ для соответствующей фазы сигнала. И нужно их не 512 а в 4 раза менше. тригонометрия в помощ!

dimax
dimax аватар
Онлайн
Зарегистрирован: 25.12.2013

Собссно я уже из любопытсва накатал код и проверил. Правда таблицы синуса на 512байт подрукой не было, взял на 256 байт. Генерит на выводах 9 и 10 ардуино шим-синус, каналы в противофазе. Скетч:

uint8_t sine_wave[256] = {
 0x80, 0x83, 0x86, 0x89, 0x8C, 0x90, 0x93, 0x96,
 0x99, 0x9C, 0x9F, 0xA2, 0xA5, 0xA8, 0xAB, 0xAE,
 0xB1, 0xB3, 0xB6, 0xB9, 0xBC, 0xBF, 0xC1, 0xC4,
 0xC7, 0xC9, 0xCC, 0xCE, 0xD1, 0xD3, 0xD5, 0xD8,
 0xDA, 0xDC, 0xDE, 0xE0, 0xE2, 0xE4, 0xE6, 0xE8,
 0xEA, 0xEB, 0xED, 0xEF, 0xF0, 0xF1, 0xF3, 0xF4,
 0xF5, 0xF6, 0xF8, 0xF9, 0xFA, 0xFA, 0xFB, 0xFC,
 0xFD, 0xFD, 0xFE, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF,
 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFE, 0xFD,
 0xFD, 0xFC, 0xFB, 0xFA, 0xFA, 0xF9, 0xF8, 0xF6,
 0xF5, 0xF4, 0xF3, 0xF1, 0xF0, 0xEF, 0xED, 0xEB,
 0xEA, 0xE8, 0xE6, 0xE4, 0xE2, 0xE0, 0xDE, 0xDC,
 0xDA, 0xD8, 0xD5, 0xD3, 0xD1, 0xCE, 0xCC, 0xC9,
 0xC7, 0xC4, 0xC1, 0xBF, 0xBC, 0xB9, 0xB6, 0xB3,
 0xB1, 0xAE, 0xAB, 0xA8, 0xA5, 0xA2, 0x9F, 0x9C,
 0x99, 0x96, 0x93, 0x90, 0x8C, 0x89, 0x86, 0x83,
 0x80, 0x7D, 0x7A, 0x77, 0x74, 0x70, 0x6D, 0x6A,
 0x67, 0x64, 0x61, 0x5E, 0x5B, 0x58, 0x55, 0x52,
 0x4F, 0x4D, 0x4A, 0x47, 0x44, 0x41, 0x3F, 0x3C,
 0x39, 0x37, 0x34, 0x32, 0x2F, 0x2D, 0x2B, 0x28,
 0x26, 0x24, 0x22, 0x20, 0x1E, 0x1C, 0x1A, 0x18,
 0x16, 0x15, 0x13, 0x11, 0x10, 0x0F, 0x0D, 0x0C,
 0x0B, 0x0A, 0x08, 0x07, 0x06, 0x06, 0x05, 0x04,
 0x03, 0x03, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01,
 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x03,
 0x03, 0x04, 0x05, 0x06, 0x06, 0x07, 0x08, 0x0A,
 0x0B, 0x0C, 0x0D, 0x0F, 0x10, 0x11, 0x13, 0x15,
 0x16, 0x18, 0x1A, 0x1C, 0x1E, 0x20, 0x22, 0x24,
 0x26, 0x28, 0x2B, 0x2D, 0x2F, 0x32, 0x34, 0x37,
 0x39, 0x3C, 0x3F, 0x41, 0x44, 0x47, 0x4A, 0x4D,
 0x4F, 0x52, 0x55, 0x58, 0x5B, 0x5E, 0x61, 0x64,
 0x67, 0x6A, 0x6D, 0x70, 0x74, 0x77, 0x7A, 0x7D
};

void setup(){
pinMode(9,OUTPUT);
pinMode(10,OUTPUT);
TCCR1B = (1<<WGM13)|(1<<CS10); 
TCCR1A = (1<<COM1A1)|(1<<COM1B1)|(1<<COM1B0); 
TIMSK1 = 1<<TOIE1;
ICR1=511; //считать до 255
OCR1A=0; //
OCR1B=0;
}


ISR (TIMER1_OVF_vect) {
static uint8_t  n=0;
OCR1A =  OCR1B= sine_wave[n];
n++;
}

void loop(){
}

Результат (через 2 интегрирующие цепи разумееется):

Nickalaich
Nickalaich аватар
Offline
Зарегистрирован: 07.04.2013

А есть возможность показать нефильтрованные сигналы? Мне нужны два сигнала для того, чтобы давать их драйверу полумоста. Хочу сопоставить моменты включения каждого транзистора, а мой совковый осцил не очень-то такие удобства дает.

Огромное спасибо за код :)

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Все-таки непонятно, почему не посчитать таблицы синуса в setup(), как советует Logik.

Nickalaich
Nickalaich аватар
Offline
Зарегистрирован: 07.04.2013

Это занимает процессорное время. 

Logik
Offline
Зарегистрирован: 05.08.2014

Nickalaich пишет:

Это занимает процессорное время. 

Так это же только после сброса один раз просчитается. А время старта у ардуинки и так с проблемой.

 

А если сгенерить 3 ШИМ-синусоиды со сдвигом 120 градусов то уже чисто коммерческий проект выйдет ;)

Nickalaich
Nickalaich аватар
Offline
Зарегистрирован: 07.04.2013

Да можно и этот проект коммерческим сделать без особых проблем - получается достаточно точный генератор 120 вольт 60 герц из 230 вольт 50 герц. Мне он нужен, чтобы американский синхронный двигатель завести в номинальную мощность.

dimax
dimax аватар
Онлайн
Зарегистрирован: 25.12.2013

Nickalaich пишет:

А есть возможность показать нефильтрованные сигналы?

Да, конечно. Вот два варианта отображения этого же сигнала, разница в установленном времени развёртки:

Nickalaich
Nickalaich аватар
Offline
Зарегистрирован: 07.04.2013

Прекрасно. В следующие выходные, наверное, протестирую. Придется ещё поискать изолирующий трансформатор. А частота ШИМа - 31,25 кГц?

dimax
dimax аватар
Онлайн
Зарегистрирован: 25.12.2013

Nickalaich, да. 16000000/512= 31250,  но в данном скетче за один полный цикл Wave Form Generator' а (512 тактов) синус рисуется 2 раза, тк. он на 256 байт.

Nickalaich
Nickalaich аватар
Offline
Зарегистрирован: 07.04.2013

Хорошо, большое спасибо за разъяснения. С Вашей помощью мне требуется только плату развести, можно сказать.

Калькулятор таблиц значений http://www.daycounter.com/Calculators/Sine-Generator-Calculator.phtml, если захотите сделать подобное в будущем :)
 

dimax
dimax аватар
Онлайн
Зарегистрирован: 25.12.2013

Nickalaich, оказывается у меня уже был этот сайт в избранном, но с закладкой на калькуляторы :)

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

По картинкам хочется спросить: а что там за хвосты на крайних значениях? Можете вывести верх и/или низ в более растянутом варианте?

Nickalaich
Nickalaich аватар
Offline
Зарегистрирован: 07.04.2013

Совсем забыл про одну очень важную деталь. Моменты включения-выключения этих ШИМ ни в коем случае не должны совпадать. Нужен dead time, иначе полевые ключи сгорят. Для ШИМ-контроллера стандартный dead time - 3%. Те ключи, что я собираюсь использовать, достаточно быстродействующие, так что dead time можно сократить до 1%. Значит, OCR1A и OCR1B должны отличаться на 5 тактов, верно?

dimax
dimax аватар
Онлайн
Зарегистрирован: 25.12.2013

Arhat109-2, не совсем понял, про какие хвосты речь, на каком рисунке хоть?

Nickalaich, я очень слабо знакомом с спецификой дед-таймов, так что могу высказать только предположение. По-моему средствами atmega328  невозможно сдвинуть фазы ШИМ  друг относительно друга. Эта возможность есть в некоторых более свежих МК, в частности в "народной" attiny85.

Nickalaich
Nickalaich аватар
Offline
Зарегистрирован: 07.04.2013

Если один цикл ШИМ составляет 512 тактов, то дед-тайм в 1% составит 5 тактов. Вполне осуществимо, кажется, хотя этого должно быть предостаточно для срабатывания драйвера и полевика. Тогда обработчик прерывания будет таким? И, наверное, надо таблицу значений подкорректировать.

ISR (TIMER1_OVF_vect) {

static uint8_t  n=0;
OCR1A - 5 =  OCR1B = sine_wave[n];
n++;
}

Есть возможность перенести код на STM32F1.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Там где у вас приведены синусоиды. В вверху и внизу (макс и мин) значений наблюдается существенное "уширение" рисунка. Там явно "что-то есть". Вот и хотел посмотреть.

Да почему сложно-то?

Если пользовать 2 ноги одного счетчика в противофазах - то они конечно будут шлепать синхронно .. причем очень синхронно, ибо аппаратно.

Но, есть же режим коррекции фазы и частоты, и в если в нем загружать ШИМ +-1 в пределы срабатывания, то вполне можно получить (не пробовал сам) ситуацию когда одна нога будет гарантированно выключаться "чуть раньше" или "чуть позже". Но это уже надо серъезно вкуривать даташит на 16-и битные счетчики и смотреть кто кого и когда должен "опережать".

Как вариант использовать 2 счетчика сдвигая их на заданную величину. Таким же способом можно организовать и "трехфазные" ШИМ. :)

dimax
dimax аватар
Онлайн
Зарегистрирован: 25.12.2013

Nickalaich, может мы о чём-то разном говорим? Посмотрите на второй рисунок в #27 У обоих оцилограмм передний фронт наступает чётко синхронно. Длительность импульса может быть сколь угодно разной, но передний фронт всегда одновременно. Я так понимаю, что разность в наступлении переднего фрона - это и есть дед тайм. К сожалению значение OCR на это никаким образом не влияет. Arhat109-2 верно вспомнил про один хитрый режим, в котором могут разойтись фронты при разных OCR, но это сразу приведёт к искажению формы синуса. До какой степени -не знаю, нужно проверять.

Arhat109-2, там утолщение просто следствие упрощённого преобразования шим-напряжение,  если увеличить то там будет видно, как проползает несущая частота.

Nickalaich
Nickalaich аватар
Offline
Зарегистрирован: 07.04.2013

В режиме Phase-correct PWM оба фронта могут не совпадать. Так что мой костыль, возможно, мог бы и проканать.

При таком мизерном расхождении фронтов ощутимых искажений не будет, я думаю...

Да, пробовать нужно. До самых выходных не будет возможности :/

Нашел полезную инфу:
http://www.hilltop-cottage.info/blogs/adam/avr-timer1-dead-time-generato...
Надо бы закупиться десятком тинек и кварцами.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

dimax, ну вот и мне так показалось, что применение конденсатора в качестве интегрирующего звена "не комильфо". правильнее делать полноценный интегратор на ОУ. :)

P.S. Ибо DAC - отсутствует ..

Nickalaich
Nickalaich аватар
Offline
Зарегистрирован: 07.04.2013

Да почему не комильфо? Г-LC фильтр достаточно проинтегрирует ШИМ. Я очень, очень сомневаюсь, что в промышленных установках кто-то использует ЦАП для управления двигателями. Там и синусоиду не всегда используют. Устройство силовое всё же, и к тому же сигнал на выходе из ардуины должен быть строго импульсным. Это простейший усилитель класса D, по сути.

dimax
dimax аватар
Онлайн
Зарегистрирован: 25.12.2013

ШИМ-синус 60Гц 9-битный (512 отсчётов)

uint16_t sine_wave[512] = {
0x100,0x103,0x106,0x109,0x10c,0x10f,0x112,0x115,
0x119,0x11c,0x11f,0x122,0x125,0x128,0x12b,0x12e,
0x131,0x134,0x137,0x13b,0x13e,0x141,0x144,0x147,
0x14a,0x14d,0x150,0x153,0x156,0x159,0x15b,0x15e,
0x161,0x164,0x167,0x16a,0x16d,0x170,0x172,0x175,
0x178,0x17b,0x17d,0x180,0x183,0x186,0x188,0x18b,
0x18d,0x190,0x193,0x195,0x198,0x19a,0x19d,0x19f,
0x1a2,0x1a4,0x1a6,0x1a9,0x1ab,0x1ad,0x1b0,0x1b2,
0x1b4,0x1b6,0x1b9,0x1bb,0x1bd,0x1bf,0x1c1,0x1c3,
0x1c5,0x1c7,0x1c9,0x1cb,0x1cd,0x1cf,0x1d0,0x1d2,
0x1d4,0x1d6,0x1d7,0x1d9,0x1db,0x1dc,0x1de,0x1df,
0x1e1,0x1e2,0x1e4,0x1e5,0x1e6,0x1e8,0x1e9,0x1ea,
0x1ec,0x1ed,0x1ee,0x1ef,0x1f0,0x1f1,0x1f2,0x1f3,
0x1f4,0x1f5,0x1f6,0x1f7,0x1f7,0x1f8,0x1f9,0x1f9,
0x1fa,0x1fb,0x1fb,0x1fc,0x1fc,0x1fd,0x1fd,0x1fd,
0x1fe,0x1fe,0x1fe,0x1ff,0x1ff,0x1ff,0x1ff,0x1ff,
0x1ff,0x1ff,0x1ff,0x1ff,0x1ff,0x1ff,0x1fe,0x1fe,
0x1fe,0x1fd,0x1fd,0x1fd,0x1fc,0x1fc,0x1fb,0x1fb,
0x1fa,0x1f9,0x1f9,0x1f8,0x1f7,0x1f7,0x1f6,0x1f5,
0x1f4,0x1f3,0x1f2,0x1f1,0x1f0,0x1ef,0x1ee,0x1ed,
0x1ec,0x1ea,0x1e9,0x1e8,0x1e6,0x1e5,0x1e4,0x1e2,
0x1e1,0x1df,0x1de,0x1dc,0x1db,0x1d9,0x1d7,0x1d6,
0x1d4,0x1d2,0x1d0,0x1cf,0x1cd,0x1cb,0x1c9,0x1c7,
0x1c5,0x1c3,0x1c1,0x1bf,0x1bd,0x1bb,0x1b9,0x1b6,
0x1b4,0x1b2,0x1b0,0x1ad,0x1ab,0x1a9,0x1a6,0x1a4,
0x1a2,0x19f,0x19d,0x19a,0x198,0x195,0x193,0x190,
0x18d,0x18b,0x188,0x186,0x183,0x180,0x17d,0x17b,
0x178,0x175,0x172,0x170,0x16d,0x16a,0x167,0x164,
0x161,0x15e,0x15b,0x159,0x156,0x153,0x150,0x14d,
0x14a,0x147,0x144,0x141,0x13e,0x13b,0x137,0x134,
0x131,0x12e,0x12b,0x128,0x125,0x122,0x11f,0x11c,
0x119,0x115,0x112,0x10f,0x10c,0x109,0x106,0x103,
0x100,0xfc,0xf9,0xf6,0xf3,0xf0,0xed,0xea,
0xe6,0xe3,0xe0,0xdd,0xda,0xd7,0xd4,0xd1,
0xce,0xcb,0xc8,0xc4,0xc1,0xbe,0xbb,0xb8,
0xb5,0xb2,0xaf,0xac,0xa9,0xa6,0xa4,0xa1,
0x9e,0x9b,0x98,0x95,0x92,0x8f,0x8d,0x8a,
0x87,0x84,0x82,0x7f,0x7c,0x79,0x77,0x74,
0x72,0x6f,0x6c,0x6a,0x67,0x65,0x62,0x60,
0x5d,0x5b,0x59,0x56,0x54,0x52,0x4f,0x4d,
0x4b,0x49,0x46,0x44,0x42,0x40,0x3e,0x3c,
0x3a,0x38,0x36,0x34,0x32,0x30,0x2f,0x2d,
0x2b,0x29,0x28,0x26,0x24,0x23,0x21,0x20,
0x1e,0x1d,0x1b,0x1a,0x19,0x17,0x16,0x15,
0x13,0x12,0x11,0x10,0xf,0xe,0xd,0xc,
0xb,0xa,0x9,0x8,0x8,0x7,0x6,0x6,
0x5,0x4,0x4,0x3,0x3,0x2,0x2,0x2,
0x1,0x1,0x1,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,
0x1,0x2,0x2,0x2,0x3,0x3,0x4,0x4,
0x5,0x6,0x6,0x7,0x8,0x8,0x9,0xa,
0xb,0xc,0xd,0xe,0xf,0x10,0x11,0x12,
0x13,0x15,0x16,0x17,0x19,0x1a,0x1b,0x1d,
0x1e,0x20,0x21,0x23,0x24,0x26,0x28,0x29,
0x2b,0x2d,0x2f,0x30,0x32,0x34,0x36,0x38,
0x3a,0x3c,0x3e,0x40,0x42,0x44,0x46,0x49,
0x4b,0x4d,0x4f,0x52,0x54,0x56,0x59,0x5b,
0x5d,0x60,0x62,0x65,0x67,0x6a,0x6c,0x6f,
0x72,0x74,0x77,0x79,0x7c,0x7f,0x82,0x84,
0x87,0x8a,0x8d,0x8f,0x92,0x95,0x98,0x9b,
0x9e,0xa1,0xa4,0xa6,0xa9,0xac,0xaf,0xb2,
0xb5,0xb8,0xbb,0xbe,0xc1,0xc4,0xc8,0xcb,
0xce,0xd1,0xd4,0xd7,0xda,0xdd,0xe0,0xe3,
0xe6,0xea,0xed,0xf0,0xf3,0xf6,0xf9,0xfc
};

void setup(){
pinMode(9,OUTPUT);
pinMode(10,OUTPUT);
TCCR1A = (1<<COM1A1)|(1<<COM1B1)|(1<<COM1B0)|(1<<WGM11);
TCCR1B = (1<<WGM12)|(1<<CS10); //Mode6 Fast PWM, 9-bit  TOP 0x01FF ; DIV 1
TIMSK1 = 1<<TOIE1;
OCR1A=OCR1B=0;
}
ISR (TIMER1_OVF_vect) {
static uint16_t  n=0;
n=n&511;
OCR1A=OCR1B=sine_wave[n];
n++;
}

void loop(){
}

 

Radjah
Offline
Зарегистрирован: 06.08.2014

Nickalaich пишет:

Да можно и этот проект коммерческим сделать без особых проблем - получается достаточно точный генератор 120 вольт 60 герц из 230 вольт 50 герц. Мне он нужен, чтобы американский синхронный двигатель завести в номинальную мощность.

Nickalaich
Nickalaich аватар
Offline
Зарегистрирован: 07.04.2013

Выяснилось, что было бы крайне неразумно строить такой девайс на Arduino/AVR МК, т.к. у STM32, имеющегося в наличии, есть возможность аппаратно генерировать dead-time и поднять частоту ШИМ. В конечном варианте хочу использовать STM32F030, а пока тестирую на F103. Код нужен?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Nickalaich пишет:

Это занимает процессорное время. 

Для Вас лишние 0.06 с один раз при включении - это критично?

Nickalaich
Nickalaich аватар
Offline
Зарегистрирован: 07.04.2013

Не знаю. Самое критичное - это дедтайм, на AVR он вводится как костыль. Поэтому я переношу код на STM32, там его реализация никаких проблем не составляет на уровне железа и добавляет в код всего 3 строчки.

И зачем вычислять то, что и так уже вычислено? Смысл в этом вообще какой? Почему бы не упростить контроллеру задачу, и не положить в память готовую таблицу? 

sazombi
Offline
Зарегистрирован: 30.01.2014

Добрый вечер Всем

DIMAX очень хороший пример

попобую еще связать с драйвером IR2110 (2 шт в мост)

selevo
selevo аватар
Offline
Зарегистрирован: 21.12.2013

Nickalaich

где код-то для stm32

dimanoid999
Offline
Зарегистрирован: 20.11.2016

хороший пример. только он к сожалению для фиксированной частоты. А мне бы надо регулируемой частоты две синусы в противофазе как у Вас. вот чую в сетапе должен быть блок вычисления массива синуса по данным с потенциометра а как это формализовать не знаю мозги не доходят. новичок я еще в этом деле. частоты нужны небольшие до 20 гц. а опрос потенциометрат вроде как в лупе должон быть.