ШИМ регулятор напряжения 0…25 В 2,5 А(Arduino)

На рисунке показана схема простого ШИМ регулятора напряжения. Выходное напряжение ШИМ регулятора может меняться от 0 до 25 В, при максимальном токе нагрузки 2,5 А (при выходном напряжении 25 В). Схема ШИМ регулятора разделена на две части, первая часть силовая, в которой основными компонентами являются два транзистора и дроссель. Вторая часть схемы это плата Arduino Nano, которая отвечает за работу силовой части, управление и индикацию.

Управление ШИМ регулятором очень простое, регулировка выходного напряжения осуществляется при помощи энкодера KY-040, а информация об установленном напряжении выводится на семисегментный четырех разрядный индикатор на базе TM1637.

  1. ШИМ регулятор имеет три режима работы:
    Основной режим — на выходе присутствует напряжение установленное при помощи энкодера, напряжение отображается на индикаторе TM1637 как U10.0
  2. Режим изменения выходного напряжения —  для перехода в этот режим необходимо нажать кнопку энкодера, на индикаторе будет отображено r10.0, поворотом ручки энкодера можно изменить выходное напряжение. Напряжение на выходе в этом режиме равно 0 В. При повторном нажатии кнопки энкодера, ШИМ регулятор переходит в режим работы №1 (на выходе появляется установленное напряжение).
  3. Режим КЗ — при коротком замыкании или при токе потребления ШИМ регулятора больше 2,7 А, выходное напряжение пропадает, на 2 секунды выводится сообщение Err0, далее ШИМ регулятор переходит в режим №2.

Сборка:

Транзистор КТ818Б необходимо установить на теплоотвод.

Дроссель — намотан на ферритовом кольце диаметром 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> // http://rcl-radio.ru/wp-content/uploads/2020/02/STM32_TM1637_V1_3.zip
#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&&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;}

Форум — http://forum.rcl-radio.ru/viewtopic.php?id=150

Тестирование

Установленное напряжение Без нагрузки Ток нагрузки  С нагрузкой

 

Добавить комментарий

Войти с помощью: