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

В статье http://rcl-radio.ru/?p=77435 был рассмотрен пример создания ШИМ регулятора постоянного напряжения на базе Arduino, в этой статье будет рассмотрен пример создания ШИМ регулятора на базе отладочной платы STM32 (STM32F103C8T6). Характеристики ШИМ регулятора аналогичны предыдущему проекту, но благодаря высокому быстродействию микроконтроллера STM32F103C8T6 по сравнению с ATmega328 (Arduino Nano), улучшена стабильность работы ШИМ регулятора, повышена точность установки и поддержания напряжения (12 бит) при различной токовой нагрузке.

Управление ШИМ регулятором происходит при помощи трех кнопок, первая кнопка «ON/OFF» отключает и включает выходное напряжение, остальные кнопки регулируют выходное напряжение. Регулировка выходного напряжения может осуществляться в двух режимах, с отключенным выходным напряжением и включенным. В ШИМ регуляторе предусмотрена токовая защита от КЗ выхода на уровне 4,5 А от тока потребления ШИМ регулятора. Фактически ШИМ регулятор может выдавать ток в нагрузку до 6-7 А, но только незначительный период времени (сильный нагрев транзисторов и дросселя), при длительном использовании ток нагрузки не должен превышать 2,5 А.

Информация об установленном напряжении выводится на семисегментный четырех разрядный индикатор на базе TM1637.

При КЗ выхода выходное напряжение пропадает, на 5 секунд и выводится сообщение Err0, после чего выходное напряжение восстанавливается.

При включенном выходном напряжении на индикаторе отображается установленное напряжение U10.0 , при выключенном выходном напряжении индикатор отображает выставленное напряжение без символа U.

Сборка:

Транзисторы КТ818Б и КТ815Б необходимо установить на теплоотвод.
Дроссель — намотан на кольце диаметром 25-30 мм, проводом 0,8-1 мм, намотка в один слой до заполнения.

Настройка:
1. Установить значение 20 В, подключить к выходу вольтметр, подобрать значение переменной float pop (вольтметр должен показывать 20+/-0,05 В)
2. При выходном напряжении 20 В, подключить нагрузку 10 Ом, подобрать значение переменной float pop1 (вольтметр должен показывать 20+/-0,05 В).
3. Выходное напряжение во всем диапазоне выходных напряжений должен иметь погрешность +/-0,1 В  с подключенной нагрузкой и без нее.

Перед заливкой скетча в STM32 Вам необходимо ознакомиться со следующей статьей — STM32 Arduino IDE

  // Библиотека Arduino_STM32-master.zip
#include <STM32_TM1637.h> // http://rcl-radio.ru/wp-content/uploads/2020/02/STM32_TM1637_V1_3.zip
 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

Форум — http://forum.rcl-radio.ru/viewtopic.php?pid=1263#p1263

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

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

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

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