В статье 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
Тестирование
Установленное напряжение | Без нагрузки | Ток нагрузки | С нагрузкой |