1

Тема: ШИМ регулятор от 0 до 25 В (2,5А) + защита от КЗ

Проект на стадии тестирования и доработки!!!

http://forum.rcl-radio.ru/uploads/images/2020/04/1d4e3a8e187a90dc6e6a31f462f6738e.png

http://forum.rcl-radio.ru/uploads/images/2020/04/40d71826e126b10af652622b82d192ed.png

.......................................................................................................................................................

http://forum.rcl-radio.ru/uploads/images/2020/04/c78551c84c685a04713700f6b15210e8.png
http://forum.rcl-radio.ru/uploads/images/2020/04/d08ce9cbd9139956a69af1ef172c97ba.png
http://forum.rcl-radio.ru/uploads/images/2020/04/85bf45f74d6073513cb8cea744364fe1.png

ШИМ регулятор выдает стабилизированное напряжение от 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>  // https://rcl-radio.ru/wp-content/uploads/2019/05/Encoder.zip
#include <MsTimer2.h> // https://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&&reg==0){analogWrite(9, 0);reg=1;MsTimer2::start();tm.print_float(u_ust,1,0b01010000,0,0,0);delay(300);}
  if(digitalRead(4)==LOW&&reg==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;}

2

Re: ШИМ регулятор от 0 до 25 В (2,5А) + защита от КЗ

STM32 ШИМ регулятор от 0 до 25 В (2,5А) + защита от КЗ

http://forum.rcl-radio.ru/uploads/images/2020/04/aa794aac90780936b24204eed76b1ed7.jpg


http://forum.rcl-radio.ru/uploads/images/2020/04/777c701d0f2e5ed9eb152bc728fd6cc7.png
http://forum.rcl-radio.ru/uploads/images/2020/04/b6fc4adc3b1c20059b8ee6b6cc8dd5d7.png
http://forum.rcl-radio.ru/uploads/images/2020/04/5fc186f94431517b083ef8382721ad3a.png
http://forum.rcl-radio.ru/uploads/images/2020/04/628b3bb8f20a74aa1bd1e4b8325d139d.png

  #include <STM32_TM1637.h>
 STM32_TM1637 tm(PB10,PB1);// CLK, DIO
 #include <EEPROM.h>
 HardwareTimer pwmtimer3(3);

 int u_dig,w,off;
 float u_ust=10;
 int h,reg=0;
 const float pop = 7.79; // попрвочный коэффициент калибровки напряжения без нагрузки
 const float pop1=0.1; // поправочный коэффициент калибровки напряжения под нагрузкой
 unsigned long times,times0;

void setup() {
  pinMode(PB0, PWM);  // имп. выход
  pinMode(PA5, INPUT_ANALOG);
  pinMode(PA0, INPUT); // up
  pinMode(PA1, INPUT); // down
  pinMode(PA2, INPUT); // OFF/ON
  tm.brig(7); // ЯРКОСТЬ 0...7
  pwmtimer3.pause();
  pwmtimer3.setPrescaleFactor(3); //1 - 72 кГц, 2 - 36 кГц, 3 - 24 кГц     
  pwmtimer3.setOverflow(1000-1);        
  pwmtimer3.setCompare(TIMER_CH3, h);// ШИМ 0-1000
  pwmtimer3.refresh();
  pwmtimer3.resume();
  if(float(EEPROM.read(0))/10>25){EEPROM.update(0,0);}
  u_ust = float(EEPROM.read(0))/10;
  tm.print_float(u_ust,1, 0b00111110,0,0,0);
}

void loop() {
  if(off==0){
  while(3.30/4095*analogRead(PA5)*pop > u_ust+float(h*pop1)/1000){h--;if(h<0){h=0;}
        pwmtimer3.setCompare(TIMER_CH3, h);}
    
  while(3.30/4095*analogRead(PA5)*pop < u_ust+float(h*pop1)/1000){h++;if(h>1000){h=1000;}
        if(h>900){h=0; tm.print_float(0,0, 0b01111001,0b01010000,0b01010000,0);
        pwmtimer3.setCompare(TIMER_CH3, h);delay(5000); tm.print_float(u_ust,1, 0b00111110,0,0,0);times=millis();}
        pwmtimer3.setCompare(TIMER_CH3, h);}
  }

  if(digitalRead(PA0)==HIGH&&millis()-times>150){u_ust+=0.1; if(u_ust>25){u_ust=25;}
  if(off==0){tm.print_float(u_ust,1, 0b00111110,0,0,0);}else{tm.print_float(u_ust,1, 0,0,0,0);}times=millis();times0=millis();w=1;} 
  if(digitalRead(PA1)==HIGH&&millis()-times>150){u_ust-=0.1; if(u_ust<0){u_ust=0;}
  if(off==0){tm.print_float(u_ust,1, 0b00111110,0,0,0);}else{tm.print_float(u_ust,1, 0,0,0,0);}times=millis();times0=millis();w=1;}

  if(digitalRead(PA2)==HIGH&&off==0&&millis()-times>300){off=1;tm.print_float(u_ust,1, 0,0,0,0);times=millis();pwmtimer3.setCompare(TIMER_CH3, 0);}  
  if(digitalRead(PA2)==HIGH&&off==1&&millis()-times>300){off=0;tm.print_float(u_ust,1, 0b00111110,0,0,0);times=millis();pwmtimer3.setCompare(TIMER_CH3, h);}  

  if(w=1&&millis()-times0>5000){w=0;EEPROM.update(0,round(u_ust*10));}    

}// loop

3

Re: ШИМ регулятор от 0 до 25 В (2,5А) + защита от КЗ

Доработка токовой защиты

http://forum.rcl-radio.ru/uploads/images/2020/04/641e1eb0f50cd1392016a802e2f3dc26.gif


  #include <STM32_TM1637.h>
 STM32_TM1637 tm(PB10,PB1);// CLK, DIO
 #include <EEPROM.h>
 HardwareTimer pwmtimer3(3);

 int u_dig,w,off;
 float u_ust=10;
 int h,reg=0;
 const float pop = 7.82; // попрвочный коэффициент калибровки напряжения без нагрузки
 float pop1 = 1.3;
 unsigned long times,times0;

void setup() { Serial.begin(9600);
  pinMode(PB0, PWM);  // имп. выход
  pinMode(PA5, INPUT_ANALOG);
  pinMode(PA4, INPUT_ANALOG);
  pinMode(PA0, INPUT_PULLUP); // up
  pinMode(PA1, INPUT_PULLUP); // down
  pinMode(PA2, INPUT_PULLUP); // OFF/ON
  tm.brig(7); // ЯРКОСТЬ 0...7
  pwmtimer3.pause();
  pwmtimer3.setPrescaleFactor(2); //1 - 72 кГц, 2 - 36 кГц, 3 - 24 кГц     
  pwmtimer3.setOverflow(1000-1);        
  pwmtimer3.setCompare(TIMER_CH3, h);// ШИМ 0-1000
  pwmtimer3.refresh();
  pwmtimer3.resume();
  if(float(EEPROM.read(0))/10>25){EEPROM.update(0,0);}
  u_ust = float(EEPROM.read(0))/10;
 // u_ust=15;
  tm.print_float(u_ust,1, 0b00111110,0,0,0);
}

void loop() {
  
  if(off==0){
  while(3.25/4095*analogRead(PA5)*pop > u_ust+float(h*pop1)/1000){h--;if(h<0){h=0;}
        pwmtimer3.setCompare(TIMER_CH3, h);}
    
  while(3.25/4095*analogRead(PA5)*pop < u_ust+float(h*pop1)/1000){h++;if(h>1000){h=1000;}
        if(3.25/4095*analogRead(PA4)>2.20){h=0; tm.print_float(0,0, 0b01111001,0b01010000,0b01010000,0);
        pwmtimer3.setCompare(TIMER_CH3, h);delay(5000); tm.print_float(u_ust,1, 0b00111110,0,0,0);times=millis();}
        pwmtimer3.setCompare(TIMER_CH3, h);}
  }

  if(digitalRead(PA0)==LOW&&millis()-times>150){u_ust+=0.1; if(u_ust>22){u_ust=22;}
  if(off==0){tm.print_float(u_ust,1, 0b00111110,0,0,0);}else{tm.print_float(u_ust,1, 0,0,0,0);}times=millis();times0=millis();w=1;} 
  if(digitalRead(PA1)==LOW&&millis()-times>150){u_ust-=0.1; if(u_ust<0){u_ust=0;}
  if(off==0){tm.print_float(u_ust,1, 0b00111110,0,0,0);}else{tm.print_float(u_ust,1, 0,0,0,0);}times=millis();times0=millis();w=1;}

  if(digitalRead(PA2)==LOW&&off==0&&millis()-times>300){off=1;tm.print_float(u_ust,1, 0,0,0,0);times=millis();pwmtimer3.setCompare(TIMER_CH3, 0);}  
  if(digitalRead(PA2)==LOW&&off==1&&millis()-times>300){off=0;tm.print_float(u_ust,1, 0b00111110,0,0,0);times=millis();pwmtimer3.setCompare(TIMER_CH3, h);}  

  if(w=1&&millis()-times0>5000){w=0;EEPROM.update(0,round(u_ust*10));}    

}// loop

4 (2020-07-31 13:47:46 отредактировано sanj76a)

Re: ШИМ регулятор от 0 до 25 В (2,5А) + защита от КЗ

Доброе утро!
Заинтересовала ваша статья. Хочу развить и протестить.

5 (2020-07-24 17:27:36 отредактировано sanj76a)

Re: ШИМ регулятор от 0 до 25 В (2,5А) + защита от КЗ

какая точно модель модуля STM32
какой версией Arduino IDE вы пользуетесь?
закажу все необходимое и начну делать.

6

Re: ШИМ регулятор от 0 до 25 В (2,5А) + защита от КЗ

Все подробности про STM32 - https://rcl-radio.ru/?p=68376

7 (2020-07-31 13:49:54 отредактировано sanj76a)

Re: ШИМ регулятор от 0 до 25 В (2,5А) + защита от КЗ

приношу извинения, указал не ту ссылку,
вот правильная.
http://we.easyelectronics.ru/citizen/ne … llere.html

заработало, но что-то пошло не так,не помню, отложил в долгий ящик и забросил.
В том проекте применен не дорогой LS020 Siemens CX65 , если-бы его приспособить и и сделать подобное
в вашем проекте.

8

Re: ШИМ регулятор от 0 до 25 В (2,5А) + защита от КЗ

В планах есть переделать схему шим регулятора на stm32, добавить рег. ток. но немного позже.

9 (2020-07-31 20:14:11 отредактировано sanj76a)

Re: ШИМ регулятор от 0 до 25 В (2,5А) + защита от КЗ

уточните, заказывать такую плату
https://aliexpress.ru/item/32918062954.html
STM32F103C8T6

10 (2020-08-02 17:25:53 отредактировано sanj76a)

Re: ШИМ регулятор от 0 до 25 В (2,5А) + защита от КЗ

соберу пока это....

Заказ завис, жду уточнения!

уточните, заказывать такую плату
https://aliexpress.ru/item/32918062954.html
STM32F103C8T6

11

Re: ШИМ регулятор от 0 до 25 В (2,5А) + защита от КЗ

плата именно эта, так же нужен USB переходник для ее программирования
http://forum.rcl-radio.ru/uploads/images/2020/08/825be0c34f07b344c6420c9df42d9a14.png

12 (2020-08-02 17:48:00 отредактировано sanj76a)

Re: ШИМ регулятор от 0 до 25 В (2,5А) + защита от КЗ

http://forum.rcl-radio.ru/uploads/images/2020/08/81d313b7d2e300e54086a4a6e908c834.jpg

такой пойдет? просто есть уже

ST-LINK V2 есть. а тот что вы пишете покупать надо

вот такой есть

https://aliexpress.ru/item/1766455290.html

13

Re: ШИМ регулятор от 0 до 25 В (2,5А) + защита от КЗ

Тогда покупать не надо