ШИМ для управления сетевой нагрузкой
|
|
timerlan |
Дата: Сб, 01.06.2019, 07:46 | Сообщение # 1 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
94
Замечания:
±
На сайте с 18.03.2012
Статус:
Offline
|
Добрый день! помогите, плиз, осмыслить проблему и найти решение...задача такая, хочу регулировать обороты на мощном коллекторнике (двигатель ПБСТ), статор у него питается постоянным напряжением, а на коллекторе пытаююсь регулировать его ШИМом. включено по такой схеме: Добавлено (01.06.2019, 07:59) --------------------------------------------- то, что подписано "к Нагрузке" идет на диодный мост и далее на коллектор двигателя. сначала включал вместо этого коллектора лампу накаливания, не смог добиться на ней стабильного свечения нужного уровня, меняя значение duty в операторе PWM, если выставить так:
pw var portc.5
portb = 0
main:
pause 50
PWM pw,35,40
goto main
то лампа часто мерцает слегка приглушенной. если сильно увеличить cycle (до 20000). при подключении к якорю симистор взрывается.... отсюда вопросы: -каково же должно быть значение параматра cycle? про него мало что где сказано почему-то... -и почему выдаваемый ШИМ так странно изменяет мощность на нагрузке? Добавлено (01.06.2019, 08:00) --------------------------------------------- контроллер 16ф690
|
|
|
|
anatol |
Дата: Сб, 01.06.2019, 11:26 | Сообщение # 2 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
471
Замечания:
±
На сайте с 10.02.2010
Статус:
Offline
|
На программу управления грешить надо тогда когда "железо" работает безупречно. Взрывающийся симистор вам докладывает о его неправильном выборе... Симистор - простой электронный выключатель. Если его включать импульсом, то выключится он сам в момент смены направления ТОКА! А якорь это просто дроссель (индуктивность).
|
|
|
|
brown |
Дата: Сб, 01.06.2019, 15:05 | Сообщение # 3 |
Группа:
Пользователи
Ранг:
Помогаю всем
Сообщений:
333
Замечания:
±
На сайте с 18.09.2007
Статус:
Offline
|
Не силён в силовой электронике, но может в данном случае применить фазоимпульсное управление, а не ШИМ. Если я правильно понял, вы пытаетесь сделать так а симистор в таком режиме не работает. ФИУ:
для активной нагрузки.
Век живи - век учись! К концу жизни поймешь, что ничего не знаешь...
|
|
|
|
timerlan |
Дата: Сб, 01.06.2019, 18:38 | Сообщение # 4 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
94
Замечания:
±
На сайте с 18.03.2012
Статус:
Offline
|
Цитата anatol ( ) выключится он сам в момент смены направления ТОКА! точно, вы правы! вижу много промышленных схем, где коллекторы электродвигателей управляются симистором, но без выпрямления тока. а мой экземпляр питается только постоянкой....Добавлено (01.06.2019, 18:46) ---------------------------------------------
Цитата brown ( ) а симистор в таком режиме не работает. я пробовал регулировать этот двигатель симисторным регулятором (изъятым блоком с другого устройства) и он был как раз фазоимпульсным, приводило это к нагреву якоря, рывкам, плавающим оборотам...попробую сделать ШИМ регулирование на IGBT. мне кажется, что именно шим здесь решит задачу...
|
|
|
|
dimvad |
Дата: Вс, 02.06.2019, 00:19 | Сообщение # 5 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
80
Замечания:
±
На сайте с 20.07.2012
Статус:
Offline
|
У вас, судя по картинке, оптопара с детектором нуля, что в вашем случае совершенно недопустимо. Попробуйте что-нибудь типа MOC3023. Эта оптопара специально сделана для фазо-импульсного управления. Почитайте даташиты, и увидите различия. Добавлено (02.06.2019, 00:27) --------------------------------------------- А вообще, если надо мотором управлять, то существуют куча аналоговых схем без всяких там микроконтроллеров.
|
|
|
|
DAlexV |
Дата: Пн, 03.06.2019, 11:24 | Сообщение # 6 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
657
Замечания:
±
На сайте с 13.05.2008
Статус:
Offline
|
Цитата timerlan ( ) задача такая, хочу регулировать обороты на мощном коллекторнике (двигатель ПБСТ), статор у него питается постоянным напряжением, а на коллекторе пытаююсь регулировать его ШИМом. включено по такой схеме Был такой задач несколько лет назад, но пока стопорнули(Теперь возвращаемся, но писать будем для STMа). Если память не изменяет на статор там идет постоянка, а на ротор - переменка. Управление - фазо-импульсное. Принцип управления прост как три копейки. Нам понадобится 1 нога проца которая реагирует на прерывание (по фронту или по спаду сигнала) И 1 таймер который и будет регулировать момент открытия МОСа. На рисунке в посте №3 по спаду. То есть прерывание обязательно должно произойти до перехода через '0' , иначе не получится развить полную мощность. Алгоритм примерно такой: 1. таймер должен быть выключен. В регистр CNT занесено значение фазового сдвига(прескаллер по вкусу в зависимости от частоты. В Шпротеусе подбирается на ура). Так же необходимо учесть проверку на минимальный и максимальный сдвиг. Ведь если значение таймера будет некорректно то будет перелет(включение после перехода) или недолет(включение раньше). 2. В прерывании по сигналу с датчика фазы (INT0 допустим) когда оно наступило запускается таймер. 3. В прерывании от таймера (по переполнению) включаем МОС. Выключаем таймер. и далее по кругу. Так же советую в прерывании INT предусмотреть флаг разрешающий включение-выключение МОСа. И очень удобно через прерывание от датчика фазы измерять время(100гц). Прикладываю проект на Рыбе для 452 как раз для такого двигателя. Успехов
Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
|
|
|
|
timerlan |
Дата: Пн, 03.06.2019, 18:15 | Сообщение # 7 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
94
Замечания:
±
На сайте с 18.03.2012
Статус:
Offline
|
DAlexV ! спасибо! с удовольствием покопаюсь в вашей "рыбе"!) для эксперимента, нашел проект в нете на 16f628, регулятор мощности фазо-импульсный, собрал его на макете,попробовал к мотору подцепить, но...рывки неожиданные плавающие обороты...а на лампе накаливания всё идеально!... у моего двигателя на ротор если подать переменку, то он порсто гудит и греется, не работает, только постонка нужна...сначала экспериментировал с ним ЛАТРом, так вот, если выход ЛАТРа выпрямить, то прекрасно работает!.. сегодня отдрессировал силовую часть на FGH40N60 сигнал с МК на затвор через оптрон А3120, работает прекрасно тоже! на изменение модуляции шим, реагирует прекрасно!Добавлено (03.06.2019, 18:25) ---------------------------------------------
Цитата dimvad ( ) А вообще, если надо мотором управлять, то существуют куча аналоговых схем без всяких там микроконтроллеров. потому что в управление мотором хочу добавить логику в виде реверса, плавного пуска. вот по плавному увеличению заполнения ШИМ тоже вопрос - как это организовать в цикле FOR...TO ? пишу так:
pw var portc.5 i var byte
main:
for i = 0 to 200 step 1 pwm pw,i, 1000 pause 100 next i goto main то есть, хочу плавно увеличить мощность от 0 до почти 100% на пару секунд хотя бы, но что-то на выходе не понятное, стоит-стоит, потом резко увеличивает импульс и заново, подскажите, пожалуйста, как правильно этот алгоритм прописать?!..
|
|
|
|
dimvad |
Дата: Пн, 03.06.2019, 21:50 | Сообщение # 8 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
80
Замечания:
±
На сайте с 20.07.2012
Статус:
Offline
|
Когда-то, очень давно делал что-то похожее на микроконтроллере. Но че-то не понравилось, и сделал на рассыпухе. Но проектик остался, еле нашел.
|
|
|
|
dimvad |
Дата: Пн, 03.06.2019, 22:13 | Сообщение # 9 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
80
Замечания:
±
На сайте с 20.07.2012
Статус:
Offline
|
Вот, подрихтовал под Ваше.
|
|
|
|
timerlan |
Дата: Вт, 04.06.2019, 04:58 | Сообщение # 10 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
94
Замечания:
±
На сайте с 18.03.2012
Статус:
Offline
|
спасибо! поэкспериментирую! но главный вопрос, как реализовать плавное включение ШИМ?..Добавлено (04.06.2019, 10:45) --------------------------------------------- эмпирическим путём отладил такой код:
pt var portc.5 a var byte
low pt pauseus 15
beg: for a = 0 to 252 step 7 pwm pt,a, 25 next a
gosub stab goto beg
stab: pwm pt, 252,25 goto stab
единственное, что смущает, количество переходов...
|
|
|
|
DAlexV |
Дата: Вт, 04.06.2019, 13:37 | Сообщение # 11 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
657
Замечания:
±
На сайте с 13.05.2008
Статус:
Offline
|
pt var portc.5 a var byte
low pt pauseus 15
beg: for a = 0 to 252 step 7 pwm pt,a, 25 next a
gosub stab goto beg
stab: pwm pt, 252,25 goto stab
Выделенное выкинуть. Пока For не прокрутится на pwm pt, 252,25 не перейдет Успехов
Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
Сообщение отредактировал
DAlexV - Вт, 04.06.2019, 13:37
|
|
|
|
timerlan |
Дата: Вт, 04.06.2019, 17:50 | Сообщение # 12 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
94
Замечания:
±
На сайте с 18.03.2012
Статус:
Offline
|
Цитата DAlexV ( ) Пока For не прокрутится на pwm pt, 252,25 не перейдет Точно! спасибо за подсказку!Добавлено (04.06.2019, 18:36) --------------------------------------------- ещё одна затыка...вот таким кодом регулирую обороты якоря этого двигателя:
define adc_bits 8 define adc_clock 3 define adc_sampleus 50
trisb = $00 portb = $00 adcon1 = %00000010
pt var portc.5 a var byte
main: adcin 0, a pwm pt, a, 1 goto main
регулирует без задержек, шустро, но...есть один момент, если выставить движок потенциометра на PORTA.0 в положение движка, где значение переменной "а" будет больше 150 и подать питание, то силовой транзистор почти всегда выходит из строя. т.е. нужен плавный разгон от 0 до установленного потенциометром значения, делаю так:
pt var portc.5 a var byte x var byte
main: adcin 0, a читаем значение перем, присваиваем в "а" for x = 0 to a step 7 \ pwm pt, x, 1 - плавно увеличиваем ШИМ от 0 до значения "а" next x / gosub stab переход на подпрограмму, выдающую стабильный ШИМ с установленным ранее значением goto main
stab: подпрограмма, удерживающая в цикле ШИМ с получ. значением pwm pt, x, 1 if x <> a then если текущий ШИМ отличен от уст. значения, т.е. повернули потенциометр, то в начало проги, считать значение и заново pause 100 goto main endif goto stab end
но движок работает импульсами, то поднимая, то снижая обороты, до уровня, всё же, установленного потенциометром...
вот как бы этот цикл привести к нужному управлению...
|
|
|
|
DAlexV |
Дата: Чт, 06.06.2019, 09:02 | Сообщение # 13 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
657
Замечания:
±
На сайте с 13.05.2008
Статус:
Offline
|
Код define adc_bits 8 define adc_clock 3 define adc_sampleus 50
trisb = $00 portb = $00 adcon1 = %00000010
pt var portc.5
AdcRes var word PWMDef var byte
main_Loop:
adcin 0, AdcRes AdcRes=(AdcRes+1)/2 // Душим результат АЦП (макс 256/2=128)
if PWMDef <> AdcRes // если не равно if PWMDef> AdcRes PWMDef=PWMDef-1 // Если больше else PWMDef=PWMDef+1 // если меньше end if end if
pwm pt, PWMDef , 1 // обновляем ШИМ
pause 100 // пауза для реакции движка. Нужно конечно гораздо больше. goto Main_Loop // и по кругу
timerlan, не нужно такие ходы конем. Все проще выглядит.
Цитата timerlan ( ) но движок работает импульсами, то поднимая, то снижая обороты, до уровня Да, так оно и будет. Если нужно четко держать обороты, тогда без обратной связи не получится. Если побаловаться, то хватит и такого кода. Успехов
Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
|
|
|
|
timerlan |
Дата: Чт, 06.06.2019, 11:10 | Сообщение # 14 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
94
Замечания:
±
На сайте с 18.03.2012
Статус:
Offline
|
даже с ОС проблема останется...если резко значительно увеличить обороты, то от перегруза силовой ключ всё равно рванёт. вот я и пытаюсь прирастить плавное увеличение до выставленного значения. думаю, так...
|
|
|
|
DAlexV |
Дата: Чт, 06.06.2019, 20:45 | Сообщение # 15 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
657
Замечания:
±
На сайте с 13.05.2008
Статус:
Offline
|
Цитата timerlan ( ) если резко значительно увеличить обороты, Нужно увеличить паузу для того чтобы двигатель успевал разогнаться. pause 1000 что то типа такого. Цитата timerlan ( ) то от перегруза силовой ключ всё равно рванёт Когда товарищ мой крутил такой движок у него тоже вылетал часто триак. Тогда он сделал 2 датчика тока. Первый давал 1 если ток двигателя был максимально возможный(тогда через прерывание значение фазового сдвига снижалось на несколько десяков(-50 например), второй - если ток был оптимальный (рабочий). Тогда пока второй датчик не дал 1 приращение фазового сдвига было например +15, как появилась 1, приращение было уже +5 например. Все это есть в коде. Там и в ремах все написано. Успехов
Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
|
|
|
|