Лабораторный блок питания. Версия 4.

ATMega32, BascomAvr

 

Вступление

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

Так же, информация для тех, кому нужен супер-прецизионный блок, аналоги которых стоят от 3000$: этот блок не относится к аппаратам такого класса.

ТТД.

Выходное напряжение    0 - 50 В  
Выходной ток   0 - 10 А 
Регулировка напряжения и тока  Цифровое с клавиатуры, путём прямого набора 
Оперативное изменение  Функциональные кнопки  клавиатуры
Защита  Релейная или ограничение 
Включение выхода  Кнопкой 
Звуковое подтверждение нажатия  Есть, отключается 
Тепловой режим  Программное включение вентилятора, от датчиков 
Коррекция показаний  Программное 
Связь с компьютером  USB с опторазвязкой  

 

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

Программа, написанная для данного блока питания, кардинально отличается от 2-й версии: введено управление от кнопочной  клавиатуры, она заточена под импульсный блок питания. Основные проблемы при написании программы были в незнании алгоритма ввода параметров с клавиатуры с десятичной запятой и ввод числовых данных в регистры ШИМ. Я тупо бился об стену, пока не пришла мысль складывать байты в последовательность, то есть в стринговую переменную, а уже стринговую переменную преобразовать в число, что я и сделал. Возможно, существуют и другие, более совершенные алгоритмы, но додумывать уже было лень, и, как известно, лучшее – враг хорошего.

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

Нюанс: при использовании блока питания с управлением 3м ШИМ  есть возможность регулировать разницу в напряжении между входом и выходом регулятора. Правда, пока не вижу в этом надобности. 3-й ШИМ был введен для того, чтобы напряжение на входе стабилизатора не снижалось ниже 8 вольт, при других режимах разница напряжений составляет 3 – 4 вольт.

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

Описание

Схема блока питания не претерпела сильных изменений.

Рисунок 1. Схема блока питания

Рисунок 1. Схема блока питания.

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

Инвертор на ис  DA301 выполнен ШИМ регулятор.

Ис DA302 драйвер транзисторов инвертора с бустрепным питанием D8C308 верхнего плеча.

Обратите внимание на необходимейшую часть инвертора – снабберы С309, С310R319, С312R318 и диоды параллельно транзисторам, выпрямитель так же оснащен снабберами, это довольно ощутимо снижает нагрев транзисторов и диодов, а так же существенно снижает уровень помех.

Регулятор выхода с цепями управления реле включения выхода и цепью управления вентилятора.

Узел защиты классический – при превышении тока включается тиристор и остается в замкнутом состоянии.

Регулятор выходного напряжения инвертора на ис DA304 работает от ШИМ3 контроллера.

Вспомогательный блок питания выполнен на ис VIPER12 или 20 с различными вариантами формирования 5 вольт.

Сетевой   выпрямитель выполнен отдельно с ограничителем тока заряда конденсаторов фильтра.

Рекомендации по сборке 

Силовая часть блока питания и собственно регулятор сделаны на одной плате размером 190х100 мм, выпрямитель и сглаживающий фильтр сетевого напряжения сделаны отдельно. Питание микроконтроллера и схемы регулирования сделаны на микросхеме Viper12 , выходные напряжения с этого блока 10 и -3 вольта. Сборку блока рекомендую начать именно с этого узла: собрать, подключить через лампу 25 вт к напряжению 300 вольт, проверить выходные напряжения, питание самой микросхемы 15-18 вольт, выходные в «холодной» части +10..12в и – 3…-4 вольт. Если ничего не дымится, будем считать, что эта часть исправна. Далее собираем ШИМ регулятор на TL494 и проверяем наличие импульсов на 9 и 10 ножках, если есть - идём дальше, припаиваем драйвер IR2113 и проверяем наличие импульсов на выводе 1. Верхнее плечо проверить проблематично без транзисторов, поэтому верим на слово этой микросхеме. Далее собираем силовую часть. Тут проблем никаких, потребуется  только регулировка срабатывания защиты, для этого нагрузить блок на нагрузку примерно 650 – 700 ват и подстроечным резистором подвести к моменту срабатывания, хотя блок выдерживает нагрузку в 1   квт. Дальше просто собираем остальное, потому как всё должно работать.

С напряжения 10 вольт через DC-DC конвертер поступает на питания микроконтроллера и дисплея. DC-DC конвертер собран на микросхеме MIC4680, можно, конечно, было собрать и на любой другой, но этих просто было много. Использованный дроссель фирмы murata 68uH на ток до 0,5 ампера. Использовать линейный регулятор тоже можно, но подсветка потребляет почти 300 ма, а ресурсы вспомогательного блока питания не безграничны.

Трансформатор TR501, магнитопровод отечественный М2000НМ, Ш6х6, зазор 0,4 мм (прокладка по 0,2 мм на центральный и на боковые),  обмотка 2-1 220 витков Ф 0,15 мм, 3-4 26 витков Ф 0,15 мм, обмотка 8-6 19 витков Ф 0,5 мм (косичка из 12 проводов Ф 0,15 мм), обмотка 6-5 (мотается в обратную сторону, так как для -3 вольт) 6 витков Ф 0,15 мм. На штатном каркасе.

Трансформатор TR2 мотается на кольце К45х28х12, первичная обмотка 38 витков, проводом  5х0,5 мм, вторичная 18 витков, проводом 10х0,5 мм, первичная от вторичной обмотки должно быть хорошо изолирована.

Трансформатор тока мотается на кольце диаметром 12 - 20 мм и содержит 100 витков провода Ф 0,2 – 0,5 мм, или МГТФ 0,07 

Микроконтроллер и клавиатура проектировались на отдельных платах, но с возможностью их не распиливать. На плате МК размещается сам контроллер, контроллер шины USB с опторазвязкой, пищалка и разъемы для подключения, контроллер оснащен светодиодом, который моргает при правильной работе устройства. 

 

Рисунок 2. Схема блока управления
Рисунок 2. Схема блока управления

На плате клавиатуры расположены 16 кнопок и 4 светодиода. 10 цифровых, выполняющих также другие функции, когда не используются цифры, кнопки вкл выхода, вкл триггерного режима, режимы регулировки и десятичная точка, светодиоды отображают режим работы, вкл/выкл триггерный режим, вкл/выкл выход, аварийный режим, превышение тока. Клавиатура использованa аналоговая, то есть каждой нажатой кнопке соответствует определенное напряжение, которое программа интерпретирует как нажатие определённой кнопки. Если кнопки не нажаты на выходе 5 вольт, это означает, что ни одна кнопка не нажата. На схеме нарисован также DC-DC конвертер, но на плате его нет.

Описание работы блока 

При включении блока появляется заставка с номером версии, по истечении двух секунд, на дисплее высвечивается текущее значение тока и напряжения, состояние выхода «отключен», температура, состояние вентилятора, установленное значение тока, режим пикалки,

Для включения выхода нужно нажать кнопку  OUT” , этой же кнопкой выход отключается, индицируется соответствующим светодиодом и дублируется надписью на дисплее.  Для изменения режима токовой защиты используется кнопка “TRIG”, этой кнопкой выбирается режим защиты – ограничение тока, или триггерный режим, который отключает выход при достижении тока ограничения. Этот режим подтверждается светодиодом. 

Для установки нужного значения напряжения или тока нажимается соответствующая кнопка “U или  I”, и  на появившемся экране цифровыми кнопками с запятой вводится нужное значение. Если это значение превышает установленное в сервисе максимальное значение, программа попросит ввести снова. Запоминаются введенные значения кнопкой “M”, если не отключен режим звукового подтверждения, прозвучит тройной звуковой сигнал; при нажатии на любую «действующую» кнопку звучит одинарный сигнал. Изменить текущие значения можно, также просто нажимая на соответствующие кнопки «стрелки», которые нанесены на цифровые кнопки, для тока и напряжения. Подобное изменение можно не сохранять или сохранить кнопкой “M”. Отключить или включить звук можно, удерживая кнопку «0» две секунды.

Для перехода в сервисный режим нужно при включении нажать и удерживать кнопку “OUT”, и через три секунды блок перейдет в режим калибровки.

Управляющая программа 

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

 Здесь описание подпрограммы набора значений из отдельных цифр и запятой: она также проверяет, чтобы запятая была одна; если попробовать ввести запятую ещё раз, запятая проигнорируется: 

Sub Convert    
    If Knopka = Trig1 Then     'модуль одичного нажатия триггерного типа  
    Goto Perehod11    'если нажатие продолжается то уходим
    End If     

Это сделано для того чтобы нажатие кнопки виделось в программе только один раз, а то будет целая строка из одной цифры. Просто проверяет, та же цифра нажата или нет, если та же - уходит, в конце подпрограммы переприсваивается значение проверяемой переменной. То есть, если значение кнопки не менялось (оставалась нажатой), при втором проходе, действие подпрограммы  не производится, просто выходит из подпрограммы 

If Knopka = "W" Then    'проверка на ненужные символы  
  Goto Perehod11    '
   End If  
   Call Bibip()     бибикнуть  
   If Knopka = "." Then     'проверка на нажатие запятой
   If A = 1 Then     'запрет на нажатие запятой второй раз  
    Goto Zpt2  
    End If    

далее к набранному значению добавляется запятая

    Msgi = Msgi + "."     'вывод на экран нажатой зпт
Zpt2:    
     A = 1     'установка флага запятой
     End If  
     If U1 < 353 Then   'селекция символов цифр
     Goto Perehod11   'если не цифра игнорируем
     End If    

далее собираем значение из нажатых кнопок; добавление запятой в любом месте переменной производится выше.

   Msgi = Msgi + Knopka      'построение набираемого значения
    Po = Val(msgi)    'преобразования стринга в численное значение
    Po = Po * Cifir  
   Cifir2 = Round(po)    'округляем
   Conv = Len(msgi)  
If Conv = 6 Then    'проверка количества символов
   A = 0    'сброс флага запятой
   Conv = 0  
   Msgi = " "     
   End If  
Perehod11:    'модуль одиночного нажатия триггерного типа
   Trig1 = Knopka  
End Sub  

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

 Подпрограмма включения вентилятора проверяет значения температуры с двух датчиков, определяет максимальную температуру, и если она превышает порог, установленный в сервисе, то включает вентилятор:  

  Sub Vse1   
Incr Cou1wir  
If Cou1wir < 22 Then : Goto Couend : End If     'счетчикпроходовзадержки  
1wverify Dsid1(1) : Call Temperature() : Meas2 = Meas     '1 ds18b20
1wverify Dsid2(1) : Call Temperature()     '2 ds18b20
 If Meas > Meas2 Then : Goto Tteerrmm : Else : Meas = Meas2 : End If     'выборбольшейтемпературы
Tteerrmm:  
If Meas > Porog3 Then : Set Vent : Vnt = 1 : End If     
If Meas < 35 Then : Reset Vent : Vnt = 0 : End If     'выключениевентилеслименьше 35 град
1wreset : : 1wwrite &HCC : Waitms 1 : 1wwrite &H44      'задание на преобразование для всех оптом
Cou1wir = 0  
Couend:  
End Sub  

подпрограмка считывания и вычисления температуры, с отсечением десятых долей и знака

  Sub Temperature    
1wwrite &HBE : : Byte0 = 1wread() : : Byte1 = 1wread() : Waitms 10     'считываемтемпературу  
Meas = Byte1     'из 2 х байт делаем слово
Shift Meas , Left , 8     'сдвигаем на 8 разрядов влево
Meas = Meas + Byte0      'добавл   второй байт
Shift Meas , Right , 4      'удаляем десятые
End Sub  

В подпрограмме ожидание готовности преобразования датчиков организовано  подсчетом вызовов подпрограммы, так как время преобразования DS18B20 равно 750mC, слишком долгое ожидание для работы программы, а опрос допускается в пределах нескольких секунд. Вентилятор выключается, если достигнута температура 35 градусов.

Подпрограмма работы с портом

Dim L_time As Word       'переменная времени ожидания слова из компорта 
Dim Get_byte As Byte
Sub Pechat()
L_time = 0
Cmda = ""  
 


   ‘обнуляем команду
Get_byte = Ischarwaiting()     'проверяем заполнение буфера ком порта
   If Get_byte = 0 Then      'если данных нет то ходим
  Goto Endpech
   End If
Do
 
    Incr L_time      'увеличиваем счетчик окна ожидания
    Get_byte = Ischarwaiting()       'проверяем заполнение буфера ком порта
    If Get_byte <> 0 Then       'если данные готовы то считываем
 Get_byte = Inkey()
    Select Case Get_byte
 Case 120:
 

     'X
    Print U_set ; " " ; I_set ; Po      'запрос данных установленных значений
   Case 099 :      'C
      Print U_real ; " " ; I_real      'запросданныхтекущщихзначений
   Case 115:       'S
     Print P ; " " ; I ; " " ; Vnt ; " " ; Meas ; " " ; Snd       'запросстатуса
    Case 112:       'P
      I = 1 : Call Our()       'включения выхода из вне
    Case 111:       'O
       I = 0 : Call Our()       'выключениевыхода
    Case 122:       'Z
       Call Tr()     'включения и выключение триггерного режима из вне
     CaseElse        ‘если пришел символ другой проверяем
      Cmda = Cmda + Chr(get_byte)        'сборкакоманды
    End Select
End If
Loop Until L_time > 50000 
      'если время кончилось  - выполняем команду
    Pech = Left(cmda , 1)      'вытащим первый символ, отвечающий за управление
     M = Len(cmda)       'узнаем сколько символов в пришедшей команде
     M = M - 1       'убавляем на 1, так как первый символ хранит только управление
     Znac = Right(cmda , M)        'вытаскиваем из команды все символы кроме первого символа
     Nado = Val(znac)
Select Case Pech
     'проверим назначение команды
     Case "i":      'если команда установки тока,
   Cifir2 = Nado * Cifiri      ' то устанавливаем ток
     I_set = Cifir2        'и данные на дисплее
     Pwm1b = Cifir2
     Case "u": 
      'если команда установки напряжения
     Cifir2 = Nado * Cifiru        'то устанавливаем напряжение
 Pwm1a = Cifir2
 End Select
 Endpech:
 End Sub
 

Для компьютера программа не писалась, протокол обмена символьный,

Для приходящих из компьютера символов (все в нижнем регистре, латиницей) блок  выполняет соответствующую команду и передает данные компьютеру (у меня - терминальной программе):

X    -   запрос   установленных значений

C    -   запрос текущих значений

S     -   запрос статуса, что включено, выключено, температуру

P    -   включение выхода

O   -    выключение выхода

Z    -   включение/выключение триггерного режима

Для управления установленными значениями, также в символьном режиме пересылается команда с данными:

I2.22  -  установка тока (например 2.22 ампера)

U22.2 -  установка напряжения (например 22.2 вольт)

На прием многобайтной  команды установки отводится время ожидания приема в строке Loop Until L_time > 50000 , примерно 200 милисекунд.  Если за это время команда не завершится, то она игнорируется. Естественно это время можно уменьшить или увеличить.

Протокол не претендует на законченность и законность, посему может быть изменен кем угодно, кто будет писать программу для компа.

По тексту остальной программы вообще многое понятно из комментариев, и посему подробно останавливаться не буду. 

Используемые pdf-файлы, программа

 

Обсуждение на форуме

Автор:     Мамышев Р. (aka RAF65)