Регистрация | Вход

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: ivan_fd  
Форум Picbasic.ru » Программирование МК » PicBasicPro » ШИМ для управления сетевой нагрузкой (нестабильность работы)
ШИМ для управления сетевой нагрузкой
timerlan Дата: Сб, 01.06.2019, 07:46  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 94
Репутация: 0   ±
Замечания:   ±
На сайте с 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

Прикрепления: 4505033.gif (5.6 Kb)
ЯНДЕКС Дата: 01.06.2019
anatol Дата: Сб, 01.06.2019, 11:26  |                                                                                                                Сообщение # 2
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 472
Репутация: 32   ±
Замечания:   ±
На сайте с 10.02.2010

Статус: Offline

На программу управления грешить надо тогда когда "железо" работает безупречно. Взрывающийся симистор вам докладывает о его неправильном выборе... Симистор - простой электронный выключатель. Если его включать импульсом, то выключится он сам в момент смены направления ТОКА! А якорь это просто дроссель (индуктивность).
brown Дата: Сб, 01.06.2019, 15:05  |                                                                                                                Сообщение # 3
Группа: Пользователи
Ранг:  Помогаю всем
Сообщений: 333
Репутация: 12   ±
Замечания:   ±
На сайте с 18.09.2007

Статус: Offline

Не силён в силовой электронике, но может в данном случае применить фазоимпульсное управление, а не ШИМ. Если я правильно понял, вы пытаетесь сделать так
а симистор в таком режиме не работает.
ФИУ:

для активной нагрузки.


Век живи - век учись! К концу жизни поймешь, что ничего не знаешь...
timerlan Дата: Сб, 01.06.2019, 18:38  |                                                                                                                Сообщение # 4
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 94
Репутация: 0   ±
Замечания:   ±
На сайте с 18.03.2012

Статус: Offline

Цитата anatol ()
выключится он сам в момент смены направления ТОКА!

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

Добавлено (01.06.2019, 18:46)
---------------------------------------------

Цитата brown ()
а симистор в таком режиме не работает.

я пробовал регулировать этот двигатель симисторным регулятором (изъятым блоком с другого устройства) и он был как раз фазоимпульсным, приводило это к нагреву якоря, рывкам, плавающим оборотам...попробую сделать ШИМ регулирование на IGBT. мне кажется, что именно шим здесь решит задачу...
dimvad Дата: Вс, 02.06.2019, 00:19  |                                                                                                                Сообщение # 5
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 79
Репутация: 54   ±
Замечания:   ±
На сайте с 20.07.2012

Статус: Offline

У вас, судя по картинке, оптопара с детектором нуля, что в вашем случае совершенно недопустимо. Попробуйте что-нибудь типа MOC3023. Эта оптопара специально сделана для фазо-импульсного управления. Почитайте даташиты, и увидите различия.

Добавлено (02.06.2019, 00:27)
---------------------------------------------
А вообще, если надо мотором управлять, то существуют куча аналоговых схем без всяких там микроконтроллеров.

DAlexV Дата: Пн, 03.06.2019, 11:24  |                                                                                                                Сообщение # 6
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 657
Репутация: 27   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

Цитата timerlan ()
задача такая, хочу регулировать обороты на мощном коллекторнике (двигатель ПБСТ), статор у него питается постоянным напряжением, а на коллекторе пытаююсь регулировать его ШИМом. включено по такой схеме

Был такой задач несколько лет назад, но пока стопорнули(Теперь возвращаемся, но писать будем для STMа). Если память не изменяет на статор там идет постоянка, а на ротор - переменка. Управление - фазо-импульсное. Принцип управления прост как три копейки. Нам понадобится 1 нога проца которая реагирует на прерывание (по фронту или по спаду сигнала) И 1 таймер который и будет регулировать момент открытия МОСа. На рисунке в посте №3 по спаду. То есть прерывание обязательно должно произойти до перехода через '0' , иначе не получится развить полную мощность.
Алгоритм примерно такой:
1. таймер должен быть выключен. В регистр CNT занесено значение фазового сдвига(прескаллер по вкусу в зависимости от частоты. В Шпротеусе подбирается на ура). Так же необходимо учесть проверку на минимальный и максимальный сдвиг. Ведь если значение таймера будет некорректно то будет перелет(включение после перехода) или недолет(включение раньше). 
2. В прерывании по сигналу с датчика фазы (INT0 допустим) когда оно наступило запускается таймер.
3. В прерывании от таймера (по переполнению) включаем МОС. Выключаем таймер.
и далее по кругу. Так же советую в прерывании INT предусмотреть флаг разрешающий включение-выключение МОСа. И очень удобно через прерывание от датчика фазы измерять время(100гц).
Прикладываю проект на Рыбе для 452 как раз для такого двигателя. Успехов  wink
Прикрепления: PID_Test.rar (474.2 Kb)


Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
timerlan Дата: Пн, 03.06.2019, 18:15  |                                                                                                                Сообщение # 7
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 94
Репутация: 0   ±
Замечания:   ±
На сайте с 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
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 79
Репутация: 54   ±
Замечания:   ±
На сайте с 20.07.2012

Статус: Offline

Когда-то, очень давно делал что-то похожее на микроконтроллере. Но че-то не понравилось, и сделал на рассыпухе. Но проектик остался, еле нашел.
Прикрепления: PHAZREG.rar (62.5 Kb)
dimvad Дата: Пн, 03.06.2019, 22:13  |                                                                                                                Сообщение # 9
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 79
Репутация: 54   ±
Замечания:   ±
На сайте с 20.07.2012

Статус: Offline

Вот, подрихтовал под Ваше.
Прикрепления: PHAZREG2.rar (59.2 Kb)
timerlan Дата: Вт, 04.06.2019, 04:58  |                                                                                                                Сообщение # 10
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 94
Репутация: 0   ±
Замечания:   ±
На сайте с 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
Репутация: 27   ±
Замечания:   ±
На сайте с 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 не перейдет
Успехов  wink


Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
Сообщение отредактировал DAlexV - Вт, 04.06.2019, 13:37
ЯНДЕКС Дата: 04.06.2019
timerlan Дата: Вт, 04.06.2019, 17:50  |                                                                                                                Сообщение # 12
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 94
Репутация: 0   ±
Замечания:   ±
На сайте с 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
Репутация: 27   ±
Замечания:   ±
На сайте с 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 ()
но движок работает импульсами, то поднимая, то снижая обороты, до уровня

Да, так оно и будет. Если нужно четко держать обороты, тогда без обратной связи не получится. Если побаловаться, то хватит и такого кода.
Успехов  wink


Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
timerlan Дата: Чт, 06.06.2019, 11:10  |                                                                                                                Сообщение # 14
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 94
Репутация: 0   ±
Замечания:   ±
На сайте с 18.03.2012

Статус: Offline

даже с ОС проблема останется...если резко значительно увеличить обороты, то от перегруза силовой ключ всё равно рванёт. вот я и пытаюсь прирастить плавное увеличение до выставленного значения. думаю, так...
DAlexV Дата: Чт, 06.06.2019, 20:45  |                                                                                                                Сообщение # 15
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 657
Репутация: 27   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

Цитата timerlan ()
если резко значительно увеличить обороты,

Нужно увеличить паузу для того чтобы двигатель успевал разогнаться.
pause 1000 что то типа такого.
Цитата timerlan ()
то от перегруза силовой ключ всё равно рванёт

 Когда товарищ мой крутил такой движок у него тоже вылетал часто триак. Тогда он сделал 2  датчика тока. Первый давал 1 если ток двигателя был максимально возможный(тогда через прерывание значение фазового сдвига снижалось на несколько десяков(-50 например), второй - если ток был оптимальный (рабочий). Тогда пока второй датчик не дал 1 приращение фазового сдвига было например +15, как появилась 1, приращение было уже +5 например. Все это есть в коде. Там и в ремах все написано.
Успехов  wink


Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
Форум Picbasic.ru » Программирование МК » PicBasicPro » ШИМ для управления сетевой нагрузкой (нестабильность работы)
  • Страница 1 из 1
  • 1
Поиск: