Тема: ШИМ регулятор от 0 до 25 В (2,5А) + защита от КЗ
Проект на стадии тестирования и доработки!!!
.......................................................................................................................................................
ШИМ регулятор выдает стабилизированное напряжение от 0 до 25 В с максимальным током нагрузки 2,5 А (25В), в ШИМ регулятор программно встроена защита от КЗ (срабатывает при токе потребления ШИМ регулятора 2,7 А), так имеется компенсация напряжения при изменении тока нагрузки.
ШИМ регулятор имеет три режима работы:
1. Основной режим - на выходе присутствует напряжение установленное при помощи энкодера, напряжение отображается на индикаторе TM1637 как U10.0
2. Режим изменения выходного напряжения - для перехода в этот режим необходимо нажать кнопку энкодера, на индикаторе будет отображено r10.0, поворотом ручки энкодера можно изменить выходное напряжение. Напряжение на выходе в этом режиме равно 0 В.
3. Режим КЗ - при коротком замыкании или при токе больше 2,7 А, выходное напряжение пропадает, на 2 секунды выводится сообщение Err0, далее ШИМ регулятор переходит в режим №2.
Расчет КПД:
При выходном напряжении 20В на нагрузке 10 Ом выходной ток 1,95 А (не 2 А - сказывается сопротивление проводов подключенных к нагрузке), выходная мощность равна 39 Вт. При этом входное напряжение ШИМ регулятора 30,3 В и ток 1,76 В, что дает нам мощность 53,3 Вт.
КПД = Pout/Pin*100 = 39/53.3*100 = 73.17 %
Сборка:
Транзистор КТ818Б необходимо установить на теплоотвод (процентов на 30 желательно больше того что показан на фото макетной платы).
Дроссель - намотан на кольце диаметром 25 мм, проводом 0,8-1 мм, намотка в один слой до заполнения.
Настройка:
1. Установить значение 20 В, подключить к выходу вольтметр, подобрать значение переменной float pop (вольтметр должен показывать 20+/-0,1 В)
2. При выходном напряжении 20 В, подключить нагрузку 10 Ом, подобрать значение переменной float pop1 (вольтметр должен показывать 20+/-0,1 В).
3. Выходное напряжение во всем диапазоне выходных напряжений должен иметь погрешность +/-0,2В с подключенной нагрузкой и без нее.
#include <STM32_TM1637.h>
#include <Encoder.h> // http://rcl-radio.ru/wp-content/uploads/2019/05/Encoder.zip
#include <MsTimer2.h> // http://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip
#include <EEPROM.h>
STM32_TM1637 tm(2,3);// CLK, DIO
Encoder myEnc(11, 12);//CLK, DT
int u_dig;
float u_ust=0;
int h,reg=0;
const float pop = 5.39; // порвочный коэффициент калибровки напряжения без нагрузки
const float pop1=1.75; // поправочный коэффициент калибровки напряжения под нагрузкой
long oldPosition = -999,newPosition;
void setup() {
MsTimer2::set(1, to_Timer);MsTimer2::start();
// 31 250 Гц 9 бит
TCCR1A = TCCR1A & 0xe0 | 2;
TCCR1B = TCCR1B & 0xe0 | 0x09;
pinMode(9,OUTPUT);
pinMode(A0,INPUT);
pinMode(4,INPUT);
u_ust = float(EEPROM.read(0))/10;
analogWrite(9,h);
tm.brig(7); // ЯРКОСТЬ 0...7
newPosition=0;tm.print_float(u_ust,1, 0b00111110,0,0,0);
}
void loop() {
if(digitalRead(4)==LOW&®==0){analogWrite(9, 0);reg=1;MsTimer2::start();tm.print_float(u_ust,1,0b01010000,0,0,0);delay(300);}
if(digitalRead(4)==LOW&®==1){reg=0;MsTimer2::stop();tm.print_float(u_ust,1,0b00111110,0,0,0);delay(300);EEPROM.update(0,round(u_ust*10));}
if(reg==0){
while(5.00/1023*analogRead(A0)*pop > u_ust+float(h*pop1)/1000){
if(5.00/1023*analogRead(A0)*pop > u_ust*1.2){h=h-20;}
h--;if(h<0){h=0;}analogWrite(9,h);}
while(5.00/1023*analogRead(A0)*pop < u_ust+float(h*pop1)/1000){h++;if(h>511){h=511;}analogWrite(9,h);delayMicroseconds(100);
if(h>450){h=0; tm.print_float(0,0, 0b01111001,0b01010000,0b01010000,0);
analogWrite(9,h);MsTimer2::start();newPosition=0;delay(2000);reg=1;}
}
}
if(reg==1){analogWrite(9, 0);tm.print_float(u_ust,1, 0b01010000,0,0,0);
if (newPosition != oldPosition) {
oldPosition = newPosition;
u_ust=u_ust+float(newPosition)/10;
if(u_ust<0){u_ust=0;}if(u_ust>25){u_ust=25;}
newPosition=0;myEnc.write(0);}
}
}// loop
void to_Timer(){newPosition = myEnc.read()/4;}