На этой странице показан пример создания источника питания (ИП) с регулируемым выходным напряжением от 0 до 25 В и током нагрузки до 2,5 А. ИП имеет функцию токовой стабилизации, при достижении заданного предела тока начинает стабилизироваться ток, так же происходит при коротком замыкании выхода ИП.
Регулировка параметров тока и напряжения осуществляется при помощи энкодера, так же имеется кнопка отключения / включения выхода ИП. Вся информация о текущем напряжении и токе потребления нагрузки выводится на дисплей OLED 1.3 128×64 (чип драйвера — SH1106 I2C).
Регулирование напряжения и тока стабилизации цифровое, выполнено на микроконтроллере LGT8F328 (LGT8F328P-LQFP32 MiniEVB).
Как использовать плату в среде программирования Arduino IDE рассказано в — http://rcl-radio.ru/?p=129966
- Энкодер KY-040
- OLED 1.3″ — OLED-дисплей с контроллером SH1106
Схема источника питания
Регулировка тока стабилизации и выходного напряжения
На верхней строке дисплея выводятся параметры напряжения, указатель 1 показывает что возможна регулировка напряжения, если нажать кнопку энкодера указатель 1 перемещается во вторую строку где выводятся параметры тока, указывая на возможность регулировки тока.
Элемент дисплея 2 это текущее значение выходного напряжения, которое измеряется при помощи 12-битного входа АЦП микроконтроллера. Элемент 3 это установленное напряжение на выходе ИП, оно может отличаться от измеренного когда происходит стабилизация тока.
Элемент 4 это измеренный ток нагрузки, элемент 5 установленное ограничение тока, при достижении которого начинает работать токовая стабилизация.
Элемент 6 обозначает состояние выхода ИП, включено или выключено.
Так как показанный пример является линейным ИП, то силовой транзистор КТ825 необходимо установить на достаточно большой радиатор охлаждения. Транзисторы Q2 и Q3 не нуждаются в дополнительном охлаждении. Все резисторы кроме указанных мощностью 0,125 Вт.
Так же следует учитывать, что максимальное выходное напряжение и ток ограничены программно и могут быть увеличены при необходимости.
Скетч
#define KALL_U 214 #define KALL_I 1325 #define KALL_I_IZ 0.820 #define KALL_U_IZ 1.090 #include <Wire.h> #include <U8glib.h> // https://github.com/olikraus/u8glib/ #include <EEPROM.h> #include <MsTimer2.h> // http://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip #include <Encoder.h> // http://rcl-radio.ru/wp-content/uploads/2019/05/Encoder.zip Encoder myEnc(6, 5);// DT, CLK U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_DEV_0|U8G_I2C_OPT_FAST); float u=0,i=0,u_iz,i_iz; long times,oldPosition = -999,newPosition,times0,i_sum,u_sum; bool iu,w,w1,power; int n,m; float i_dig,u_dig; void setup() { delay(200);Wire.begin();Serial.begin(9600); pinMode(7,INPUT); // SW ENCODER pinMode(11,INPUT_PULLUP);// ON OFF OUTPUT MsTimer2::set(1, to_Timer);MsTimer2::start(); if(EEPROM.read(100)!=0){for(int i=0;i<101;i++){EEPROM.update(i,0);}}// очистка памяти при первом включении u = float(EEPROM.read(0));i=float(EEPROM.read(1)); analogReadResolution(12);// АЦП 12 БИТ analogReference(INTERNAL4V096); pinMode(A0,INPUT); pinMode(A1,INPUT); cli(); // TIMER_1 D9 OUTPUT DDRB = 1 << PB1; TCCR1A = 0;TCCR1B = 0; TCCR1A = 1 << COM1A1 | 1 << WGM11; TCCR1B = 1 << WGM13 | 1 << WGM12 | 1 << CS10; ICR1 = 10000; OCR1A = 0; // TIMER_3 D2 OUTPUT TCCR3A=0;TCCR3B=0; DDRF |= (1<<PF2); HDR = 1 << HDR3; TCCR3A = 1 << COM3B1 | 1 << WGM31; TCCR3B = 1 << WGM33 | 1 << WGM32 | 1 << CS30; ICR3 = 5000; OCR3B = 0; sei(); u8g.firstPage(); do { u8g.setFont(u8g_font_profont12r); u8g.drawStr(30,10,"POWER SUPPLY"); u8g.drawStr(30,25,"0-25V 0-2.5A"); u8g.drawStr(30,55,"rcl-radio.ru"); } while( u8g.nextPage() ); delay(2000); OCR1A = KALL_U*u/10; OCR3B = KALL_I*i/100.0; } void loop() { if(digitalRead(7)==LOW &&iu==0){iu=1;times=millis();w=1;w1=1;delay(200);} if(digitalRead(7)==LOW &&iu==1){iu=0;times=millis();w=1;w1=1;delay(200);} if(digitalRead(11)==LOW &&power==0){power=1;OCR1A=0;times=millis();w=1;w1=1;delay(200);} if(digitalRead(11)==LOW &&power==1){power=0;OCR1A = KALL_U*u/10;times=millis();w=1;w1=1;delay(200);} i_dig = analogRead(A0); i_sum = i_sum+i_dig; n++;if(n>9){n=0;i_iz=i_sum/10;i_sum=0;} u_dig = analogRead(A1); u_sum = u_sum+u_dig; m++;if(m>9){m=0;u_iz=u_sum/10;u_sum=0;w=1;} if(iu==0){ if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;} u=u+newPosition;myEnc.write(0);newPosition=0; if(u<0){u=0;}if(u>250){u=250;}times=millis();if(power==0){OCR1A = KALL_U*u/10;}w=1;w1=1;} } if(iu==1){ if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;} i=i+newPosition;myEnc.write(0);newPosition=0; if(i<0){i=0;}if(i>250){i=250;}times=millis();if(power==0){OCR3B = KALL_I*i/100.0;}w=1;w1=1;} } u8g.firstPage(); do { u8g.drawLine(0, 26, 128, 26);u8g.drawLine(0, 53, 128, 53); u8g.setFont(u8g_font_profont29r); if(iu==0){u8g.drawStr(0,22,"U>");}else{u8g.drawStr(0,22,"U ");}u8g.setPrintPos(35, 22);u8g.print(u_iz*KALL_U_IZ/100.0,1); if(iu==1){u8g.drawStr(0,50,"I>");}else{u8g.drawStr(0,50,"I ");}u8g.setPrintPos(35, 50);u8g.print(i_iz*KALL_I_IZ/1000.0,2); u8g.setFont(u8g_font_profont12r); u8g.setPrintPos(105, 22);u8g.print(u/10.0,1); u8g.setPrintPos(105, 50);u8g.print(i/100.0,2); if(power==0){u8g.drawStr(35,64,"OUTPUT ON ");}else{u8g.drawStr(35,64,"OUTPUT OFF");} u8g.setPrintPos(60, 64); } while( u8g.nextPage() ); if(millis()-times>5000 && w1==1){EEPROM.update(0,u);EEPROM.update(1,i);w1=0;w=1;iu=0;myEnc.write(0);} } void to_Timer(){newPosition = myEnc.read()/4;}
Источник питания нуждается в регулировке, регулировка содержит 4 параметра (коэффициента):
#define KALL_U 214
#define KALL_I 1325
#define KALL_I_IZ 0.820
#define KALL_U_IZ 1.090
Процесс регулировки состоит из нескольких этапов, которые должны быть выполнены в указанной очередности. В процессе регулировки необходимо менять корректирующие коэффициенты и несколько раз загружать измененный скетч.
- KALL_U — установить на дисплее ИП выходное напряжение 20 В, измерить фактическое напряжение на выходе ИП, при необходимости изменить коэффициент.
- KALL_U_IZ — установить на выходе ИП выходное напряжение 20 В, если измеренное напряжение отличается от фактического, то необходимости изменить коэффициент.
- KALL_I — подключить нагрузку к выходу ИП, ток нагрузки должен быть не менее 1 А. Точно измерить ток нагрузки, если установленное значение тока отличается от измеренного, то необходимо изменить коэффициент.
- KALL_U_IZ — подключить нагрузку к выходу ИП, ток нагрузки должен быть не менее 1 А. Точно измерить ток нагрузки, если измеренное микроконтроллером значение тока (выводимое на экран) отличается от измеренного внешним амперметром, то необходимо изменить коэффициент.
В скетче уже указаны необходимые корректирующие коэффициенты, поэтому при правильной сборке уст-ва и соблюдения всех номиналов элементов указанных на схеме, источник питания будет правильно регулировать и измерять ток и напряжение. Настройка корректирующих коэффициентов необходима для получения большой точности источника параметров источника питания.
Доработки
- ИП с дисплее LCD1602 I2C
Скетч — http://forum.rcl-radio.ru/viewtopic.php?pid=9487#p9487
- XL4016 в качестве источника питания регулятора тока и напряжения для повышения КПД
Ранее в http://rcl-radio.ru/?p=131518 рассматривался пример создания ИП на XL4016, применив более простую схему подключения XL4016 можно использовать этот преобразователь как источник питания для ИП описанного в этой статье. Так как показанный выше пример является линейным ИП, то для повышения его КПД можно подавать на его вход напряжение на 2-3 В превышающее выходное, что дает возможность значительно уменьшить площадь радиатора для силового транзистора КТ825. При выходном напряжении менее 10 В выходное напряжение преобразователя XL4016 будет находится в пределах 12-13 В, при напряжении выше 10 В, выходное напряжение преобразователя XL4016 будет на 2-3 В выше выходного напряжения линейного ИП.
Управление преобразователем XL4016 осуществляется совместно с ИП от одного микроконтроллера.
Скетч — http://forum.rcl-radio.ru/viewtopic.php?pid=9488#p9488