Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.80/161: Рейтинг темы: голосов - 161, средняя оценка - 4.80
port_wymi777
0 / 0 / 0
Регистрация: 29.09.2011
Сообщений: 91
1

Микроконтроллерный регулятор мощности

28.03.2012, 14:04. Просмотров 29474. Ответов 30
Метки нет (Все метки)

Здравствуйте. Я задумал сделать тиристорный регулятор мощности (~220V) на микроконтроллере AVR. Смысл в том что мне не нужен обычный ШИМ, нехочу тупо его использовать, одна из причин того - большая коммутируемая мощность, я хочу чтобы у меня тиристор включал нагрузку в момент перехода сетевого напряжения через ноль и выключал его через промежуток времени [0..10 мс] (10 мс это время одного полупериода при частоте 50Гц). Микроконтроллер должен в момент перехода напряжения через 0 подать 5 В на управляющий электрод тиристора, отсчитать время (которое определяет долю приходящей мощности) и подать 0 В. Далее цикл повторяется. Но вот главный вопрос: как отследить этот момент перехода напряжения через 0 и подать прямоугольный импульс +5 V на вывод внешнего прерывания микроконтроллера. Подскажите как сделать такую схеммку. Каким сбособом лучше уменьшить напряжение? АЦП микроконтроллера я использовать нехочу. Спасибо!:)
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.03.2012, 14:04
Ответы с готовыми решениями:

фазовый регулятор мощности tiny2313
Господа, все. я сдаюсь. Помогите. Я буду рассуждать - и пусть меня поправят...

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

Регулятор напряжения на Tiny13
Приветствую всех участников данного форума. Только начинаю осваивать...

П регулятор на Atmega на ассмеблере
Кто-нибудь писал П регулятор на ассемблере? Может быть готовые решения есть?

MCS-51. ПИД-регулятор
Добрый день! Необходимо сделать ПИД-регулятор на ассемблере 8051. Начал с...

30
drvtos
1 / 1 / 0
Регистрация: 25.05.2010
Сообщений: 3,610
02.04.2012, 02:14 21
Цитата Сообщение от Леанид Ивинавич
Что касается полезного действия,то в моем случае это был нагрев
Ну, не удержался. Вот какая формула у меня получилась (проверил цифровым интегрированием, похоже на правду):

Вход: SIN(2*pi()*t) то есть, единичной амплитуды. Его СКЗ равно 0,707, мощность без регулирования - 1/2 на резисторе 1 Ом

Выход: P = 1/2 - t1/T +1/(4*pi())*SIN(4*pi()*t1/T) это мощность на резисторе 1 Ом
Проверка: при t1=0 имеем нерегулированную мощность 0,5, при t1=Т/2 мощность ноль.

График красивенький, тоже не вызывает внутреннего протеста:
0
Леанид Ивинавич
0 / 0 / 0
Регистрация: 16.02.2012
Сообщений: 699
02.04.2012, 10:28 22
Цитата Сообщение от drvtos
А при уходе сети и такт таймера0 пропорционально уйдет.
Это я понял. Но у Вас синхронизация с сетью с точностью до частоты. Т.е. Вам нужно брать значение этого таймера в момент срабатывания ZCD, потом добавлять к значению нужный угол, переведенный в тики таймера. Это сводит на нет все усилия, так как момент срабатывания ZCD дрожит. С тем же успехом Вы могли бы не подстраивать тактовый генератор, а просто измерять частоту сети и вычислять коэффициент перевода градусов в тики таймера. Что, кстати, и делают в одной из AppNote STM.

У меня тот таймер, который используется для генерации управляющих импульсов тиристора, синхронизируется с сетью с точностью до фазы. Причем делается это петлей PLL, что эффективно подавляет дрожание импульса привязки. Я этот импульс нигде больше не использую, только как входной сигнал PLL. А саму PLL можно представить как полосовой фильтр с полосой пропускания, равной удвоенной частоте среза петлевого фильтра. Поэтому можно считать, что сигнал ZCD подвергается узкополосной полосовой фильтрации, что значительно снижает влияние помех. Вообще, частота сети не может меняться резко в силу самого принципа генерации сетевого напряжения. А вот амплитуда - может. Мы обычно судим о частоте, используя амплитудные характеристики. Например, момент перехода через ноль, что плохо. Вот тут и выручает PLL, которая нечувствительна к импульсным помехам. Отдельный импульс ZCD может вообще "выпасть", но это почти не скажется на работе системы.

Да, в прошлом сообщении я ошибочно написал, что у Вас И-регулятор. На самом деле это интегрирующий релейный регулятор, так как значение ошибки не учитывается, учитывается только ее знак, ну и еще реализована зона нечувствительности.

Цитата Сообщение от drvtos
Выход: P = 1/2 - t1/T +1/(4*pi())*SIN(4*pi()*t1/T) это мощность на резисторе 1 Ом
Осталось дело за малым - выразить угол через мощность :)
0
drvtos
1 / 1 / 0
Регистрация: 25.05.2010
Сообщений: 3,610
02.04.2012, 11:04 23
Цитата Сообщение от Леанид Ивинавич
нужно брать значение этого таймера в момент срабатывания ZCD, потом добавлять к значению нужный угол, переведенный в тики таймера. Это сводит на нет все усилия, так как момент срабатывания ZCD дрожит
Да, конечно. Я ухожу от влияния помех в момент перехода через ноль (говорят, их там много) и ставлю свой компаратор на какой-то ненулевой уровень. При этом, естественно, добавляется влияние амплитуды входного напряжения. Но это мизерные эффекты, т.к. в начале синус растет быстро и зависимость времени рабатывания от амплитуды мала.
В общем, если говорить о конкретной задаче, то мне хватает точности. Но ясно, что принципиально фазовая автоподстройка лучше.
Но Вы уж совсем заругали принцип подстройки частоты генератора. Попытаюсь немного реабилитировать:
1)
Цитата Сообщение от Леанид Ивинавич
С тем же успехом Вы могли бы не подстраивать тактовый генератор, а просто измерять частоту сети и вычислять коэффициент перевода градусов в тики таймера. Что, кстати, и делают в одной из AppNote STM.
Далеко не с такой же простотой реализации. Это же нужно множить-делить...

2)
Цитата Сообщение от Леанид Ивинавич
Например, момент перехода через ноль, что плохо. Вот тут и выручает PLL, которая нечувствительна к импульсным помехам. Отдельный импульс ZCD может вообще "выпасть", но это почти не скажется на работе системы.
В моей интегрирующей системе разовый сбой тоже ничего страшного не сделает. Бахнет один раз OSCCAL++ лишний - ну и ладно. В следующий раз вернется в семью.

Цитата Сообщение от Леанид Ивинавич
Осталось дело за малым - выразить угол через мощность :)
Да, я не понял. Тады ой, только таблица и выручит.

У меня-то другая задача: управлять полезным эффектом, который зависит от ЗВТ вообще неизвестным образом (только монотонность бесспорна). Да и то - не задача, а прелюдия. Настоящая зубастая задача - стабилизировать полезное действие при изменении напряжения сети. Вот тут уж интересно! Там такие трехмерные поверхности подучаются, такие аппроксимации - я сам через полгода забываю, что же это я такое придумал. Но основная идея простая: корректировать ЗВТ в зависимости от напряжения в сети так, чтобы полезное действие изменялось минимально. Тоже таблички использую...
0
drvtos
1 / 1 / 0
Регистрация: 25.05.2010
Сообщений: 3,610
02.04.2012, 11:45 24
Цитата Сообщение от drvtos
Тады ой, только таблица и выручит
А гляньте-ка, уважаемый коллега, как неплохо аппроксимирует простая функция

0,25+0,25*COS(Omega*t)

нашу искомую

0,5-t/T+(1/(4*PI()))*SIN(2*Omega*t)

Вот:


<Изображение удалено>

А обратную от косинуса уже легче взять.

Хотя, имея МК, я бы пошел по пути кусочно-линейной аппроскимации. Та же таблица, но с меньшим числом точек, а между ними - линейно вычислять. Функция-то гладенькая, как попа младенца :)
0
Леанид Ивинавич
0 / 0 / 0
Регистрация: 16.02.2012
Сообщений: 699
02.04.2012, 12:05 25
Цитата Сообщение от drvtos
В моей интегрирующей системе разовый сбой тоже ничего страшного не сделает. Бахнет один раз OSCCAL++ лишний - ну и ладно.
В плане подстройки частоты - да, ничего страшного. Но у Вас по импульсу ZCD берется значение таймера, вычисляется момент формирования управляющего импульса и этот импульс формируется. Т.е. помеха пролезет прямо на выход. Интегрирующие свойства Вашей системы сказываются только на подстройку частоты, но не на формирование управляющих импульсов, как было бы в случае привязки таймера к сети с точностью до фазы.

Цитата Сообщение от drvtos
А гляньте-ка, уважаемый коллега, как неплохо аппроксимирует простая функция 0,25+0,25*COS(Omega*t) нашу искомую
Действительно, очень неплохо. Наверное, именно поэтому в диммерах часто используют arccos. Я-то думал, он там из-за ошибки - использования среднего значения выходного напряжения вместо среднеквадратического. А тут, оказывается, его оправдать можно :)

Цитата Сообщение от drvtos
Хотя, имея МК, я бы пошел по пути кусочно-линейной аппроскимации.
Именно так я и делаю, про линейную интерполяцию я писал несколькими постами выше. Вычислять arccos на микроконтроллере - малоприятное занятие. Я искал аналитическое решение больше для того, чтобы сгенерировать таблицу. А пришлось ее генерировать методом последовательных приближений с использованием обратной функции.
0
drvtos
1 / 1 / 0
Регистрация: 25.05.2010
Сообщений: 3,610
02.04.2012, 12:16 26
Цитата Сообщение от Леанид Ивинавич
у Вас по импульсу ZCD берется значение таймера, вычисляется момент формирования управляющего импульса и этот импульс формируется. Т.е. помеха пролезет прямо на выход
Ага. Понял.
Ну что же, значит так и есть. В деле управления вибропитателем это пофик, ибо имеет значение усредненный эффект на многих периодах. Но придется все же Ваш подход изучить подробнее, когда будет повод полезть в свой девайс. Ведь знать, что можно лучше, и не сделать - тяжело!

Тяжело истым контрабандистам перфекционистам!

Спасибо за увлекательную беседу. Уважаемый автор темы, надеюсь, нас простит.
0
port_wymi777
0 / 0 / 0
Регистрация: 29.09.2011
Сообщений: 91
02.04.2012, 22:13 27
Цитата Сообщение от drvtos
Цитата Сообщение от port_wymi777
Сначала хотел использовать встроенный АЦП микроконтроллера, но теперь понял, что это тупость. Сейчас мне напомнили что у МК есть встроенный аналоговый компаратор, думаю использовать буду его. Спасибо за ответ
Спасибо за спасибо, КАНЕШНА...

Но вот не понял, в чем тупость? Если этим АЦП гвозди забивать? Или как?
Тебе нужно аналого-цифровое преобразование? Тогда чем использование компаратора лучше?
Или тебе ловить какие-то переходы (скажем, через ноль)? Так тогда и использование компаратора может быть "тупостью". Ибо синхронизацию с сетью правильнее делать
а) не на нуле, там мусора много
б) обычным триггером Шмидта, тот же 555 таймер очень хорош. А с его выхода - на дискретный вход МК. И забыли о компараторе.

Если у тебя другие соображения - поделись. Ибо интересно, где я, например, туплю.
Ну скажем если я бы использовал компаратор, я переменку сравнивал бы не с нулём. Подал-бы на второй вывод компаратора напряжение чуть больше нуля, чтобы компаратор срабатывал при наличии мусора в сети. Эта идея мне нравится, тем что можно не "липить" дополнительную схему, а воспользоваться возможностями AVR-контроллера
0
port_wymi777
0 / 0 / 0
Регистрация: 29.09.2011
Сообщений: 91
02.04.2012, 22:17 28
Цитата Сообщение от tid_fom
AVR - самоцель? если нет, то все гораздо проще. генератор с изменяемой скважностью и периодом порядка секунды и оптопара с детектором нуля на MOC3xxx для управления симистором. ... PROFIT!
или, если все-таки авр хочется, тогда брезенхема запилить. я в соседней ветке дал ссылку, а в этой и автор засветился... ;)
Я не очень богат радиодеталями, в моём городе нигазина радиодеталей нет. AVR-ками я запасся вдоволь, логических совецких микросхем тоже много. Вот и леплю схемы из того, что имею
0
port_wymi777
0 / 0 / 0
Регистрация: 29.09.2011
Сообщений: 91
02.04.2012, 22:32 29
Цитата Сообщение от Леанид Ивинавич
Цитата Сообщение от drvtos
Ибо синхронизацию с сетью правильнее делать а) не на нуле, там мусора много
Для уменьшения восприимчивости к помехам в регуляторе мощности применяю программный PLL. Управление может осуществляться в фазовом режиме или в режиме Ditto-Sigma модулятора. Импульсы с детектора перехода через ноль, реализованного на оптроне, поступают на вход захвата ICP таймера 1. Используется спад импульса, так как он имеет большую крутизну. Схема захвата имеет аппаратный подавитель шумов, который включен с помощью бита ICNC1. В прерывании по захвату вычисляется текущая ошибка фазы dPh = ICR1 + Delay. Она является входной величиной для PI-регулятора, который служит петлевым фильтром PLL: Period[i] = Period[i-1] - Kp * (dPh[i - 1] - dPh[i]) + Ki * dPh[i]. Выходной сигнал PI-регулятора представляет собой текущий период таймера 1, который загружается в регистр OCR1A. Таймер работает в режиме очистки по сравнению (CTC), причем TOP = OCR1A. В результате работа таймера оказывается синхронизированной с сетью с точностью до фазы (если точнее, с удвоенной частотой сети). PLL позволяет получить постоянный сдвиг Delay относительно сигнала ZCD, который позволяет скомпенсировать конечную длительность импульса ZCD и задержку срабатывания ZCD. При работе в режиме фазового управления используется канал B аппаратного PWM, значение которого загружается в регистр OCR1B, а выходная последовательность формируется на выводе OC1B. Загрузка регистра OCR1B должна осуществляться как при изменении желаемого угла открывания ключа, так и при подстройке периода таймера (в прерывании по захвату). Регистры OCR1A и OCR1B имеют double buffering, поэтому их перезагрузка не нарушает текущий цикл управления ключом. Желаемая мощность P задается в процентах от максимальной с дискретностью 0.1%. Далее эта мощность должна быть преобразована в угол открытия ключа, который и представляет собой код регистра OCR1B с точностью до постоянного множителя. При фазовом управлении мощность зависит от угла нелинейно: для угла f нормализованная мощность равна интегралу от f до pi от sin^2(x)dx, деленному на pi/2. Или Pnorm = 1 - f / pi + sin(2 * f) / (2 * pi). Если угол A задается в градусах, то f = A * pi / 180. Аналитическое выражения для угла в зависимости от требуемой мощности я найти не смог. Но это не arccos, как вычисляют в некоторых фазовых регуляторах. Поэтому численными методами была сгенерирована таблица с шагом по мощности 1%. Между точками таблицы производится линейная интерполяция: angle = A[p] + DittoP * DittoA / 10. Найденный угол преобразуется в код для загрузки регистра OCR1B: OCR1B = Half_Period * angle / MAX_ANGLE. При работе в режиме Ditto-Sigma модулятора мощность зависит от кода линейно, никакой специальной линеиризации не требуется. Частота дискретизации Ditto-Sigma модулятора равна частоте сравнений COMPA таймера 1. Модулятор реализован следующим образом:

Код
//квантование:
if(Sigma > MAX_POW) { Ditto = -MAX_POW; OutOn(); }
else { Ditto = 0; OutOff(); }
//суммирование:
Sigma = Sigma + Power + Ditto;
Это конечно интересно. Но не думаю что моя ATmega48 справится с этой задачей с учётом того, что у меня контроллер в свободное, от переключений нагрузки, время должен выполнять функцию getrc5 из BASCOM AVR для приёма комманд, с целью управления нагрузкой. Эту функцию запустить по внешнему прерыванию у меня не получилось. Написать вручную процедуру приёма RC5-команды мне не показалось простой задачей. Подпрограмму приёма и расшифровки комманд с использованием getrc5, уже довёл до ума и думаю остановиться на этом варианте.
0
Леанид Ивинавич
0 / 0 / 0
Регистрация: 16.02.2012
Сообщений: 699
02.04.2012, 23:25 30
В присоединенном файле декодер RC-5, который работает чисто по прерываниям и практически не тратит ресурсов процессора. Что касается описанного мной алгоритма регулировки мощности с программной PLL, то как раз он и работал у меня в ATmega48, которая делала еще много чего.

[6.78 Кб]
0
т.Дастаевский
0 / 0 / 0
Регистрация: 11.12.2011
Сообщений: 3
07.04.2013, 18:07 31
Цитата Сообщение от Леанид Ивинавич
Для уменьшения восприимчивости к помехам в регуляторе мощности применяю программный PLL....
Извиняюсь за некропост. А нельзя ли расписать алгоритм синхронизации с сетью подробнее? Спсб.
0
07.04.2013, 18:07
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.04.2013, 18:07

Регулятор оборотов бесколлекторного двигателя
Подкиньте пожалуйста схему регулятора оборотов(ESC) под авиамодельный...

помогите реализовать ПИД регулятор
задача реализовать ПИД регулятор с настройкой по modbus RTU, modbus RTU худо...

Регулятор сетевого напряжения на Arduino
Нужно сделать регулятор сетевого напряжения на Arduino. В качестве основы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
31
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru