DDS-генератор ДЛЯ упр H-мост

Алексей911
Offline
Зарегистрирован: 04.11.2016

Спасибо!)))

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

mmmx пишет:

1. Не пойму, почему так вычисляется частота ШИМ:

// set prscaler to 1, PWM mode to phase correct PWM,  16000000/510 = 31372.55 Hz clock

По теории, 16МГц нужно поделить на разрешение 8-разрядного таймера, умноженное на прескалер: 256*1=256. Почему у них 510?

Потому, что режим PhaseCorrect. В нём цикл изх двух фаз - сначала счётчик считает до 256, а потом считает обратно до ноля. Таким образом F_CPU/512  Про 510 автор попутал.

mmmx пишет:


dfreq=1000.0;                    // initial output frequency = 1000.o Hz

Это модулирующая частота, т.е. частота выходного синуса? Почему такое большое значение? Ведь речь идет об управлении АС-приводом, то есть 50-герцовым устройством. Плюс-минус диапазон регулирования, ну в итоге 10-100Гц. Почему тысяча?

речь ни о чём не идёт, это скетч 2009 года оригинал статьи   разрабатывался просто для радиолюбительских целей

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

[quote=dimax]

Потому, что режим PhaseCorrect. В нём цикл изх двух фаз - сначала счётчик считает до 256, а потом считает обратно до ноля. Таким образом F_CPU/512  Про 510 автор попутал.

/quote]

А если считать точки перегиба? видимо 511?

mmmx
Offline
Зарегистрирован: 04.02.2016

dimax пишет:
Потому, что режим PhaseCorrect. В нём цикл изх двух фаз - сначала счётчик считает до 256, а потом считает обратно до ноля. Таким образом F_CPU/512  Про 510 автор попутал.

...

речь ни о чём не идёт, это скетч 2009 года оригинал статьи   разрабатывался просто для радиолюбительских целей

dimax, спасибо большое. Я бы еще долго пытался понять, где удваивается разрешение... Я к тому же с чего-то решил, что там Fast PWM, хотя про Phase Correct там несколько раз написано.

И за оригинал спасибо, среди репостов его уже найти не мог!

Алексей911
Offline
Зарегистрирован: 04.11.2016

А если действилельно этот скетч под однофазный частотник заточить кто знает что поменять надо для плавной регулировки от 2х до 100 герц?Неплохо бы было)

mmmx
Offline
Зарегистрирован: 04.02.2016

ua6em пишет:

А если считать точки перегиба? видимо 511?

И "255" в таблице нету, так что еще минус один ))

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

ua6em пишет:

А если считать точки перегиба? видимо 511?

Да, возможно, что в перегибе только один раз 255, значит будет делитель 511 :)

mmmx
Offline
Зарегистрирован: 04.02.2016

В общем, тут ноль тоже точка перегиба, так что действительно 510

mmmx
Offline
Зарегистрирован: 04.02.2016
ISR(TIMER2_OVF_vect) {
  phaccu=phaccu+tword_m;
  icnt=phaccu >> 24;
 
 OCR2A=pgm_read_byte_near(sine256 + icnt);    

  if(icnt1++ == 125) { // increment variable c4ms all 4 milliseconds
    c4ms++;
    icnt1=0;
   }   
 }

Осталось пара неясных моментов по процедуре прерывания, не поясните? Во-первых, по времени: если один такт ШИМ равен 32мкс, тогда полный ход в один конец: 32*255=8мс. И соответственно, в оба конца 16мс. А тут речь идет о 4/8мс...

 

И второй вопрос:

Допустим, полный ход туда-обратно = 8 миллисекунд, когда OCR2A=255. Во всех остальных случаях оно будет меньше, в зависимости от скорректированного OCR2A. Почему тогда автор считает фиксированным время инкремента icnt1?

  if(icnt1++ == 125) {  // increment variable c4ms all 4 milliseconds

Ведь он будет инкрементироваться в зависимости от текущего значения в регистре сравнения, то есть это время плавающее. Причем инкремент будет происходить при вызове прерывания, когда счетчик вернется обратно в ноль, то есть речь должна идти о 8 миллисекундах (длительности полного хода туда-обратно)

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

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

mmmx, ну да, похоже на 510, автор явно проверял частотомером, судя по цифрам после запятой.  Мозговрывательно всё это в голове раскладывать)  ЗЫ: а у вас то какой интерес к этому скетчу? Как генератор синуса мой вариант гораздо лучше :)

mmmx
Offline
Зарегистрирован: 04.02.2016

dimax, решил я сделать частотник (для асинхронного однофазного конденсаторного двигателя 220В, вентилятора короче). Мало того, что там с железом адские сложности, по сравнению с управлением ключами в низковольтных цепях постоянного тока. Так еще и в принцип ШИМ нужно въехать (DDS рулит, я проникся!)

Планирую мостовую (полумостовую) схему силовых ключей.

Для ваших применений, видимо, (я в них пока не вникал, если честно) годится синус на одном выходе.

А мне нужно разложить его на два выхода, для управления верхнего и нижнего плечей, да еще и контролировать dead time (отсутствие одновременного открытия обоих ключей в точках перехода синуса через ноль). Вот и пытаюсь разобраться досконально...

А ваш вариант гляну обязательно! В любом случае спасибо за подсказки, вы уже мне очень помогли!

ПС: ну и ШИМ на выходе меня очень устраивает, в этом виде она и подается на движок, условно говоря. Не надо ничего фильтровать или сглаживать, обмотка как индуктивность сама все сделает ))

Упоминание и обсуждение данного кода только здесь нашел, прошу прощения у автора темы, что влез со своими вопросами, но глядишь, и ему пригодится!

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

mmmx пишет:

Осталось пара неясных моментов по процедуре прерывания, не поясните? Во-первых, по времени: если один такт ШИМ равен 32мкс, тогда полный ход в один конец: 32*255=8мс. И соответственно, в оба конца 16мс. А тут речь идет о 4/8мс...

Тут таймер работает на тактовой МК, 32 uS -это уже бегунок сбегал туда и обратно, то есть отстрочил 512 тактов. Соответственно 125 входов в прерывание дают 4 мс.
 

mmmx пишет:

Допустим, полный ход туда-обратно = 8 миллисекунд, когда OCR2A=255. Во всех остальных случаях оно будет меньше, в зависимости от скорректированного OCR2A. Почему тогда автор считает фиксированным время инкремента icnt1?

 

OCR2A влияет только на скважность, частота не меняется.

mmmx
Offline
Зарегистрирован: 04.02.2016

dimax пишет:
Тут таймер работает на тактовой МК, 32 uS -это уже бегунок сбегал туда и обратно, то есть отстрочил 512 тактов. Соответственно 125 входов в прерывание дают 4 мс.

Нет...32мкс - это все-таки один такт ШИМ должен быть...?

125*4=1секунда, периодичность опроса потенциометра (ну, чтоб пореже analogRead делать). Но это время абсолютно неответственное, поэтому я бы допустил неточность его вычисления (4мс должна зависеть от OCR2A)...

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

dimax пишет:

mmmx, ну да, похоже на 510, автор явно проверял частотомером, судя по цифрам после запятой.  Мозговрывательно всё это в голове раскладывать)  ЗЫ: а у вас то какой интерес к этому скетчу? Как генератор синуса мой вариант гораздо лучше :)

А я уж грешным делом думал что даташит 328, по крайней мере в части таймеров, Вы наизусть знаете )))

The PWM waveform is generated by clearing (or setting) the OC2x Register at the
compare match between OCR2x and TCNT2 when the counter increments, and setting (or clearing) the OC2x
Register at compare match between OCR2x and TCNT2 when the counter decrements. The PWM frequency
for the output when using phase correct PWM can be calculated by the following equation:
The N variable represents the prescale factor (1, 8, 32, 64, 128, 256, or 1024).
      fOCnxPCPWM=fclk_IO / (N *510)

Немного формулу подправил, не копипастилась красиво. Так что 510 по докам

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

mmmx пишет:

А мне нужно разложить его на два выхода, для управления верхнего и нижнего плечей, да еще и контролировать dead time (отсутствие одновременного открытия обоих ключей в точках перехода синуса через ноль). Вот и пытаюсь разобраться досконально...

dead-time вы не сделаете, лучше взять контроллер с его аппаратной поддержкой. В данном случае (с моей модификацией) выходы 3 и 11 строго инверсны, но на выходах уже существует время перехода из одного состояние в другое, и оно только вырастет когда вы подадите сигналы на мосфеты. Поэтому представим себе картину -пока один транзитор плавно закрывается, другой плавно открывается, то есть пересечение "открыты оба"  абсолютно неизбежно.

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Logik, и на старуху....   век живи -век учись :-)))

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

mmmx пишет:

Нет...32мкс - это все-таки один такт ШИМ должен быть...?

Мы говорим про разные такты видимо) В прочем суть не меняется - таймер запускает прерывание каждые 32uS

mmmx
Offline
Зарегистрирован: 04.02.2016

dimax пишет:
dead-time вы не сделаете, лучше взять контроллер с его аппаратной поддержкой. В данном случае (с моей модификацией) выходы 3 и 11 строго инверсны, но на выходах уже существует время перехода из одного состояние в другое, и оно только вырастет когда вы подадите сигналы на мосфеты. Поэтому представим себе картину -пока один транзитор плавно закрывается, другой плавно открывается, то есть пересечение "открыты оба"  абсолютно неизбежно.

Просто инверсией второй выход не получить, нужно именно положительную полуволну отправить на одно плечо, отрицательную - на второе.

Дэдтайм как-то реализуется в драйверах igbt, надо разобраться...

dimax пишет:
таймер запускает прерывание каждые 32uS
Ок, но понять это пока не могу...

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

mmmx пишет:

Просто инверсией второй выход не получить, нужно именно положительную полуволну отправить на одно плечо, отрицательную - на второе.

Тогда да, и одного выхода хватит. Сигнал превратить в переменку, и транзиторами разделить на полуволны :)

PS: можно и в МК разделить синус на половинки  и вывести эти половинки на два выхода, но это потребует существенного изменения программы.

PSS: хотя нет, не существено. Убрать инверсию (бит COM2B0) и изменить пару строк:


  byte x =pgm_read_byte_near(sine256 + icnt);   
 if (x>127){OCR2B=0; OCR2A =x;  } else {OCR2A=0; OCR2B =x; } 

Вот чего получается в итоге, даже dead-time сам собой образовался.

 

mmmx
Offline
Зарегистрирован: 04.02.2016

dimax, спасибо за эксперимент! )) Это симуляция или реальная осциллограмма?

...Оказывается, у таймера может быть два настраиваемых выхода! А я на старые модели мк описание читаю (атмега 8/16). Там таймер1 имеет только один выход. А таймер0 - два, он 16-битный, но встретил рекомендацию им не пользоваться, пока не разбирался почему.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

mmmx, (1) осцилограмма-настоящая :) (2) и три выхода бывает у некоторых моделей. (3) рекомендация -ужас. 16 битный имеет только преимущества.

mmmx
Offline
Зарегистрирован: 04.02.2016

А это какой ригол? Хочу осцилл прикупить, руки чешутся ))

В той рекомендации звучала фраза "...порушит wiring..." Не вникал, просто на подсознании возникла мысль, что на таймере0 основано тактирование самого мк, и мол, ковыряние таймера порушит работу всего контроллера. (пишу и понимаю, что это бред)))

Ну а недостаток очевидный: в таблице синуса должно быть не 256, а 65536 значений. Повышение разрядности аккумулятора фазы. Увеличение ресурсов на эту обработку. Замена процессора... )))

Да, для моей задачи 8битный DDS выше крыши. Для ваших (звук, килогерцы) - возможно, не помешает и 16 бит.

Алексей911
Offline
Зарегистрирован: 04.11.2016

Я в скрипте плоховато понимаю зато в силовой электронике прилично разбираюсь подсобрал ваш частотничег могу пару решений по силовой электронике подсказать) Ща фоточку моста скину на котором запускал всю эту систему на нормальных драйверах и мостах показать не могу это всетаки собственность фирмы(

Алексей911
Offline
Зарегистрирован: 04.11.2016

mmmx
Offline
Зарегистрирован: 04.02.2016

Алексей911 пишет:

Я в скрипте плоховато понимаю зато в силовой электронике прилично разбираюсь подсобрал ваш частотничег могу пару решений по силовой электронике подсказать) Ща фоточку моста скину на котором запускал всю эту систему на нормальных драйверах и мостах показать не могу это всетаки собственность фирмы(

Подскажите, конечно!

Какие драйверы использовали? Это основной вопрос )) И с какими ключами?

Алексей911
Offline
Зарегистрирован: 04.11.2016

IR2111

Полумостовой драйвер

Отличительные особенности:

Типовая схема включения:

Блок-схема:

Расположение выводов:

 

Описание выводов:

IN Логический вход управления выходами драйверов верхнего и нижнего уровней, в фазе с HO
VB Напряжение питания ключей верхнего уровня
HO Выход драйвера верхнего уровня
VS Возврат питания верхнего уровня
VCC Питание драйверов нижнего уровня и логики
LO Выход драйвера нижнего уровня
COM Возврат питания нижнего уровня

Описание:

IR2111 – драйвер высоковольтных, высокоскоростных МОП-транзисторов или IGBT-транзисторов с зависимыми выходными каналами нижнего и верхнего уровней, разработанный для полумостовых приложений. Собственная HVIC-технология и стойкая к защелкиванию КМОП-технология позволили создать монолитную конструкцию. Логический вход совместим с стандартными КМОП выходами.

Выходы драйверов отличаются высоким импульсным током буферного каскада, что выполнено для минимизации встречной проводимости драйвера. Внутренняя пауза при переключении предусмотрена, чтобы избежать сквозных токов в полумосте. Выходной канал может быть использован для управления N-канальным силовым МОП-транзистором или IGBT-транзистором с напряжением питания верхнего уровня до 600В.

 

Алексей911
Offline
Зарегистрирован: 04.11.2016

Затем заливаем эпоксидкой Делаем 2 ярус и заливаем снова!)

Алексей911
Offline
Зарегистрирован: 04.11.2016

Силовое питание: Мост 2 штука в поралель

763725699.jpg

Алексей911
Offline
Зарегистрирован: 04.11.2016

Конденсаторы 450 вольт 1000мф на 2 киловата мощности

B43456b.jpg

mmmx
Offline
Зарегистрирован: 04.02.2016

Алексей, конечно, интересно увидеть фотачку 50 амперного диодного моста и проч... ))

Но это все равно, что вместо программы dimax скинул бы вам фотографию запрограммированной атмеги )))

Алексей911
Offline
Зарегистрирован: 04.11.2016

Обязательно по плюсовому проводу между канденсатором и мостом индуктивность на трансформаторном железе размером с конденсатор лутше больше это позволит включать схему в розетку без дополнительной платы предворительной зарядки конденсаторов и увеличит срок службы моста раз так в тысячу без неё устройство прароботает максимум 30 мин так как мост положат высокочастотные выбросы.

Алексей911
Offline
Зарегистрирован: 04.11.2016

А как вам обьяснять всю схему? чертить долго что и зачем всёравно обьяснять придеться 

Алексей911
Offline
Зарегистрирован: 04.11.2016

Блин времени сейчас нет вечером схемку накидаю и доконца опишу процесс)извеняюсь за орфографию с ней беда(

mmmx
Offline
Зарегистрирован: 04.02.2016

Я все понимаю и не настаиваю. Тем более, что основная компоновка мне понятна. Дъявол в деталях, как говорится... Всякие там бутстрапные емкости, балласт (борьба с выбегом), как реализовано разделение управляющего сигнала на оба полумоста... Была бы схемка, я бы позадавал конкретные вопросы, что почем...

Сам склоняюсь к чему-то подобному (одну фазу выкинуть, драйвер... заменить?):

Упс: у меня движок однофазный конденсаторный, и пока не планирую ковырять его на предмет разделения обмоток и удаления кондера. Мощность движка ватт 30! А что делать... Вентиляция.

Алексей911
Offline
Зарегистрирован: 04.11.2016

Вот только начал чертить дочерчу потом обозначения вбивать буду)

Алексей911
Offline
Зарегистрирован: 04.11.2016

Кстати у программы есть недостаток когда резистор выкручиваещ на минимум кз по питанию нисковольтной а затем на силовом мосте!!!

Алексей911
Offline
Зарегистрирован: 04.11.2016

А драйвера самый бюджетный и стабильный вариант IR2111 проверено до 1.2 Киловольта

Алексей911
Offline
Зарегистрирован: 04.11.2016

Вот эту фигню я использовал для преобразования уровней 200 Кгц держит спокойно

arduino70-2.png

Joiner
Offline
Зарегистрирован: 04.09.2014

Читал бегло, но не понял, зачем для управления мостом использовать какую-то иммитацию синусоиды. Неужели не проще управлять мостом прямоугольным сигналом нужной частоты?

Алексей911
Offline
Зарегистрирован: 04.11.2016

Врятли двигателю понравиться 310 либо 710 ВОЛЬТ да и шет его знает так положено прямоуголку не пробовал)

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

Алексей911 вы бы поправили свои картинки в размере пикселей до 700, а то вся тема враскоряку постами

mmmx
Offline
Зарегистрирован: 04.02.2016

Алексей911 пишет:

Вот эту фигню я использовал для преобразования уровней 200 Кгц держит спокойно

arduino70-2.png

Каких уровней? Это в каком месте используется?

Алексей911
Offline
Зарегистрирован: 04.11.2016

Драйвер шаговых я использовал для преобразования ардуиновских 5 вольт в 20 вольт для упровления драйверами типа ir2111 и таму подобными у них входной сигнал от 10 до 20 вольт!

Алексей911
Offline
Зарегистрирован: 04.11.2016

Я не знаю как это сделать это не картинки а ссылки на мотериал из сети а мои в норм формате вроде

mmmx
Offline
Зарегистрирован: 04.02.2016

Алексей911 пишет:
Драйвер шаговых я использовал для преобразования ардуиновских 5 вольт в 20 вольт для упровления драйверами типа ir2111 и таму подобными у них входной сигнал от 10 до 20 вольт!

А как же:

3.3V logic compatible
Separate logic supply range from 3.3V to 20V
Logic and power ground ±5V offset

...

Logic inputs are compatible with
standard CMOS or LSTTL output, down to 3.3V logic

отсюда: https://lib.chipdip.ru/159/DOC000159769.pdf

Алексей911
Offline
Зарегистрирован: 04.11.2016

IR2111 (S) и (PbF)
Www.irf.com 3
Символ Определение Мин. Тип. Максимум. Условия испытаний блоков
VIH Логика «1» входное напряжение для HO & логики «0» для LO 6.4 - - VCC = 10V
9,5 - - VCC = 15 В
12,6 - - VCC = 20 В
VIL Логика «0» входное напряжение для HO & логики «1» для LO - - 3.8 VCC = 10V
- - 6.0 VCC = 15 В
- - 8.3 VCC = 20 В
VOH Выходное напряжение высокого уровня, VBIAS - VO - - 100 IO = 0A
VOL Выходное напряжение низкого уровня, VO - - 100 IO = 0A
ILK Ток утечки питающей сети - - 50 VB = VS = 600V
IQBS Потребляемый ток покоя VBS - 50 100 VIN = 0 В или VCC
Ток питания IQCC Quiescent VCC - 70 180 VIN = 0 В или VCC
IIN + Логический «1» входной ток смещения - 30 50 VIN = VCC
IIN-Logic «0» входной ток смещения - - 1,0 VIN = 0 В
VBSUV + VBS подают пороговое значение положительного порога срабатывания 7.6 8.6 9.6
VBSUV- VBS подает отрицательный пороговый уровень минимального напряжения 7.2 8.2 9.2
VCCUV + VCC пороговое значение минимального порогового значения минимального напряжения 7.6 8.6 9.6
VCCUV- VCC подает пороговое значение отрицательного порога минимального напряжения 7.2 8.2 9.2
IO + Высокий ток короткого замыкания на выходе 200 250 - VO = 0 В, VIN = VCC
PW ≤ 10 мкс
IO- Выходной короткий импульсный ток короткого замыкания 420 500 - VO = 15 В, VIN = 0 В
PW ≤ 10 мкс

Алексей911
Offline
Зарегистрирован: 04.11.2016

(&HO) логику я так и несмог использовать а если питать драйвера напряжением в 9 вольт что не предусматривает производитель то и от ордуинки работает но кллючи открывает працентов на 15(

mmmx
Offline
Зарегистрирован: 04.02.2016

https://geektimes.ru/post/255532/

Тут пишут, что можно. Логический уровень зависит от напряжения логического питания Vdd, может его надо снизить вольт до пяти?

Обычно используется VDD равное +5В. При VDD = +5В, входной порог логической 1 немного выше, чем 3В. Таким образом, когда напряжение VDD = +5В, IR2110 может быть использован для управления нагрузкой, когда вход «1» выше, чем 3 (сколько-то) вольт. Это означает, что IR2110 может быть использован почти для всех схем, так как большинство схем, как правило, имеют питание примерно 5В. Когда вы используете микроконтроллеры, выходное напряжение будет выше, чем 4В (ведь микроконтроллер довольно часто имеет VDD = +5В). Когда используется SG3525 или TL494 или другой ШИМ-контроллер, то, вероятно, придётся их запитывать напряжением большим, чем 10В, значит на выходах будет больше, чем 8В, при логической единице. Таким образом, IR2110 может быть использован практически везде.

Алексей911
Offline
Зарегистрирован: 04.11.2016

Я с тобою согласен для ir2110 но у мох длайверов ir2111 отдельного питания для логики просто нет(

mmmx
Offline
Зарегистрирован: 04.02.2016

Алексей911 пишет:
Я с тобою согласен для ir2110 но у мох длайверов ir2111 отдельного питания для логики просто нет(
А, наверно! Я решил, что даташит для 2110 подходит и для 2111 (заголовок запутал)