Цифровой регулятор мощности

Вариация на тему регуляторов мощности для 220В. Схема построена на симисторе с «опторазвязкой» и контролем перехода фазы через «0». Управляется все это микроконтроллером ATmega8A. Мощность выбирается кнопками и показывается на LED-дисплее.

Вершина эволюции регулятора мощности – сделать его цифровым. Не ахти как полезно, скорее все же трудоемко и затратно, но данный вариант регулятора намного удобнее «аналогового» в плане управления и информативности. Кроме того управляющие цепи гальванически развязаны с сетью 220В, что немного «развязывает руки» монтажнику систем и конечному пользователю.

Кратко об основных особенностях регулятора:

  • Индикация мощности на LED-индикаторе от 1 до 100%.
  • Мощность регулируется нажатием кнопок UP/DOWN.
  • Мощность регулируется пошагово через 10%
  • Выбранное значение мощности сохраняется в памяти при отключении и восстанавливается при запуске.
  • Используется LED-индикатор повышенной яркости.
  • Нажатия кнопок подтверждаются звуковым сигналом.
  • Гальваническая развязка сети 220В и органов управления.
  • Силовой компонент регулятора – симистор.
  • Контроль перехода фазы через «0».
  • Использование помехоподавляющих компонентов в цепи управления симистором.
  • Сигнализация готовности регулятора к работе после подключения к сети.

Основа регулятора микроконтроллер ATmega8A в корпусе DIP-28 только потому, что был экземпляр с убитым АЦП. При этом порт ввода/вывода PORT.C работал. Особой необходимости такого контроллера в такой схеме нет и при самостоятельной разработке печатной платы его можно заменить на любой другой – из 8кб памяти используется не более 20%. Мега удобна своим количеством ног – к ней напрямую, без дополнительных микросхем, подключен LED-индикатор, кнопки, пищалка и управление симистором. Кроме того, цена на нее совсем немного дороже ATtiny2313, а возможностей гораздо больше.

Микроконтроллер тактируется от внутреннего генератора 8МГц – это нужно учесть при прошивке fuse-ов. Т.к. микроконтроллер впаивается в печатную плату без использования «панельки/кроватки», «фьюзы» лучше прошить перед впаиванием – на случай, если что-то пойдет не так. Такой способ монтажа микросхемы МК позволил отказаться от использования межслойных перемычек. На всей плате нет ни одной перемычки – активно используются выводы компонентов.

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

'------------------------------------------------------------------------------
$regfile = "m8adef.dat"                                     
'ATmega8A
$crystal = 8000000                                          '8МГц (деление на 8 отключить)

$baud = 9600
'------------------------------------------------------------------------------
Ddrb = &B11111111                                           'PB7, PB6, PB5, PB4, PB3, PB2, PB1, PB0

Ddrc = &B11111111                                           'N/C, RESET, PC5, PC4, PC3, PC2, PC1, PC0

Ddrd = &B11001010                                           'PD7, PD6, PD5, PD4, PD3, PD2, TXD, RXD

'------------------------------------------------------------------------------

Dim Count_led As Byte                                       'счетная переменная

Dim Count_debounce As Byte                                  'счетная переменная

Dim N(3) As Integer                                         'значения трех разрядов

Dim Wt As Byte                                              'регулировка времени открытия симистора
Dim Led As Byte                                             'индикация мощности
'------------------------------------------------------------------------------
Config Int0 = Falling                                       'вход детектора 0
On Int0 Imp_0                                               'обработка прерывания INT0
'------------------------------------------------------------------------------
Config Timer0 = Timer , Prescale = 1024                     'переполнение каждые 0,032сек.
On Timer0 Perepolnenie_0                                    'обработка прерывания TIMER0
'------------------------------------------------------------------------------
Dig1 Alias Portc.1                                          'сотни
Dig2 Alias Portc.3                                          'десятки
Dig3 Alias Portc.5                                          'единицы

Opto Alias Portd.3                                          'управление симистором

Up_button Alias Pind.4                                      'кнопка UP
Down_button Alias Pind.5                                    'кнопка DOWN

Buzzer Alias Portd.6                                        'пищалка
'------------------------------------------------------------------------------
Enable Interrupts                                           'разрешаем использование прерываний
Enable Timer0                                               'разрешаем прерывание по переполнению TIMER0
Enable Int0                                                 'разрешаем внешнее прерывание INT0
'------------------------------------------------------------------------------
Wt = 195                                                    'минимальный накал

Maine:                                                      'основной цикл

   Do

      If Count_debounce > 40 Then Reset Buzzer              'антидребезг

      Gosub Refresh_led                                     'обработка индикации

      If Up_button = 0 And Buzzer = 0 Then
         If Wt < 255 Then Wt = Wt + 6                       'увеличиваем мощность
         Set Buzzer                                         'пикаем
         Count_debounce = 0                                 'сбрасываем счетчик антидребезга
      End If

      If Down_button = 0 And Buzzer = 0 Then
         If Wt > 195 Then Wt = Wt - 6                       'уменьшаем мощность
         Set Buzzer                                         'пикаем
         Count_debounce = 0                                 'сбрасываем счетчик антидребезга
      End If

      Select Case Wt                                        'соответствие открытия симистора % мощности
         Case 195 : Led = 1
         Case 201 : Led = 10
         Case 207 : Led = 20
         Case 213 : Led = 30
         Case 219 : Led = 40
         Case 225 : Led = 50
         Case 231 : Led = 60
         Case 237 : Led = 70
         Case 243 : Led = 80
         Case 249 : Led = 90
         Case 255 : Led = 100
      End Select

   Loop
End
'------------------------------------------------------------------------------
Refresh_led:                                                'подготовка данных для вывода на индикатор

   N(1) = Led                                               'разбиваем число на цифры
   N(2) = N(1)
   N(3) = N(1)

   N(1) = N(1) / 100                                        '1 цифра
   N(1) = Abs(n(1))

   N(2) = N(2) Mod 100                                      '2 цифра
   N(2) = N(2) / 10
   N(2) = Abs(n(2))

   N(3) = N(3) Mod 10                                       '3 цифра
   N(3) = Abs(n(3))

   Incr Count_led                                           'выбираем разряд для загрузки
   If Count_led > 3 Then Count_led = 1                      'всего 3 разряда

   Set Dig1 : Set Dig2 : Set Dig3                           'гасим индикатор

   Portb = Lookup(n(count_led) , Digits)                    'закидываем в порт код цифры

   Select Case Count_led                                    'включаем соответствующий разряд индикатора
      Case 1 : If N(1) <> 0 Then Reset Dig1                 'гашение незначащего 0 в 1 разряде
      Case 2 : If N(3) <> 1 Then Reset Dig2                 'гашение незначащего 0 в 2 разряде
      Case 3 : Reset Dig3                                   '3 разряд
   End Select

   Waitms 2                                                 'частота обновления индикатора

Return
'------------------------------------------------------------------------------
Imp_0:                                                      'прерывание от детектора нуля

   Timer0 = Wt                                              'чем большее значение, тем быстрее переполнится таймер
   Start Timer0

Return
'------------------------------------------------------------------------------
Perepolnenie_0:                                             'переполнение TIMER0

   Stop Timer0
   Set Opto                                                 'включение симистора
   Waitus 100                                               'курим
   Reset Opto                                               'выключение симистора

   Incr Count_debounce                                      'антидребезг

Return
'------------------------------------------------------------------------------
Digits:                                                     'цифры, выводимые на LED-индикатор

   Data &B00000011 , &B10011111 , &B00100101 , &B00001101 , &B10011001       '0 1 2 3 4
   Data &B01001001 , &B01000001 , &B00011111 , &B00000001 , &B00001001       '5 6 7 8 9
'------------------------------------------------------------------------------

LED-индикатор работает в режиме динамической индикации. Используется яркий красный 3-разрядный индикатор с общим анодом. Аноды разрядов индикатора подключены к МК через инверторы на транзисторах. Катоды сегментов объединены внутри индикатора и подключены к МК через токоограничивающие резисторы. Такой способ позволяет использовать довольно мощные (яркие) индикаторы, что особенно важно при эксплуатации регулятора в производственных условиях.

Стоит сказать, что схема напрочь отказалась симулироваться в Proteus-е. Ни в одной, даже самой новой версии. Восьмая версия Proteus вообще бесполезный монстр – нововведений ноль, ресурсов жрет больше, удобства меньше, прежние косяки остались. Файлы симулятора есть в приложенном архиве, если кому интересно.

П/п двухсторонняя, компоненты и проводники располагаются по обеим сторонам. Размер 73х84мм, при желании можно уменьшить плату на пару сантиметров. Китайцы наверняка уместили бы все в спичечном коробке, как обычно наплевав на надежность. Цитата из «видика» 90-х: «Дружище тебя, как и всех, привлекли красные точки…?». Просто в DipTrace-е до сих пор нет нормальных 3D компонентов, вот и приходится выкручиваться. Самое интересное, как обычно, с другой стороны.

Тактовые кнопки используются «большие», т.к. регулятор делается для практического применения, а не для понта. Незадействованные участки платы «залиты землей», кроме высоковольтной части. Особое внимание заслуживает способ монтажа радиатора симистора — получается своеобразный сэндвич. На плате предусмотрены отверстия для крепления радиатора.

Стабилизатор напряжения 7805 в данной версии регулятора используется в корпусе ТО-220. Практические испытания показали, что в таком типоразмере нет необходимости (я перестраховался) и его вполне можно заменить стабилизатором 78L05 в корпусе ТО-92. «Пищалка» 5-вольтовая, потребляет ток не более 20мА, поэтому подключена напрямую к микроконтроллеру. Регулятор питается от трансформатора с выходным напряжением 10-15В, что в паре с оптронами позволило обеспечить 100% гальваническую развязку цепей управления.

Скачать архив к статье.