1

Тема: Источник питания с токовой стабилизацией и микроконтроллерным управл.

Разработка

Схема регулятора

http://forum.rcl-radio.ru/uploads/images/2024/02/5589edae4e555cda8ec35e24122c3fa2.png

2

Re: Источник питания с токовой стабилизацией и микроконтроллерным управл.

#define KALL_U 214
#define KALL_I 1325
#define KALL_I_IZ 0.820 
#define KALL_U_IZ 1.090 

#include <Wire.h> 
#include <U8glib.h>             // https://github.com/olikraus/u8glib/ 
#include <EEPROM.h>
#include <MsTimer2.h>           // http://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip  
#include <Encoder.h>            // http://rcl-radio.ru/wp-content/uploads/2019/05/Encoder.zip    
Encoder myEnc(6, 5);// DT, CLK
 
U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_DEV_0|U8G_I2C_OPT_FAST);

 
float u=0,i=0,u_iz,i_iz;
long times,oldPosition  = -999,newPosition,times0,i_sum,u_sum;
bool iu,w,w1,power;
int n,m;
float i_dig,u_dig;


void setup() {
  delay(200);Wire.begin();Serial.begin(9600);
  pinMode(7,INPUT);        // SW ENCODER
  pinMode(11,INPUT_PULLUP);// ON OFF OUTPUT
  MsTimer2::set(1, to_Timer);MsTimer2::start();
  if(EEPROM.read(100)!=0){for(int i=0;i<101;i++){EEPROM.update(i,0);}}// очистка памяти при первом включении  
  u = float(EEPROM.read(0));i=float(EEPROM.read(1));
  analogReadResolution(12);// АЦП 12 БИТ
  analogReference(INTERNAL4V096);
  pinMode(A0,INPUT);
  pinMode(A1,INPUT);
    cli();
  // TIMER_1 D9 OUTPUT
  DDRB = 1 << PB1;
  TCCR1A = 0;TCCR1B = 0;
  TCCR1A = 1 << COM1A1 | 1 << WGM11;
  TCCR1B = 1 << WGM13 | 1 << WGM12 | 1 << CS10;
  ICR1 = 10000;
  OCR1A = 0;
  // TIMER_3 D2 OUTPUT
  TCCR3A=0;TCCR3B=0;
  DDRF |= (1<<PF2);
  HDR = 1 << HDR3;
  TCCR3A = 1 << COM3B1 | 1 << WGM31;
  TCCR3B = 1 << WGM33 | 1 << WGM32 | 1 << CS30;
  ICR3 = 5000;
  OCR3B = 0;
  sei();
  u8g.firstPage();  
   do {
  u8g.setFont(u8g_font_profont12r); 
  u8g.drawStr(30,10,"POWER SUPPLY");
  u8g.drawStr(30,25,"0-25V 0-2.5A");
  u8g.drawStr(30,55,"rcl-radio.ru");
  } while( u8g.nextPage() );
  delay(2000);
  OCR1A = KALL_U*u/10;
  OCR3B = KALL_I*i/100.0;
}

void loop() {
  if(digitalRead(7)==LOW &&iu==0){iu=1;times=millis();w=1;w1=1;delay(200);}
  if(digitalRead(7)==LOW &&iu==1){iu=0;times=millis();w=1;w1=1;delay(200);}

  if(digitalRead(11)==LOW &&power==0){power=1;OCR1A=0;times=millis();w=1;w1=1;delay(200);}
  if(digitalRead(11)==LOW &&power==1){power=0;OCR1A = KALL_U*u/10;times=millis();w=1;w1=1;delay(200);}  

  i_dig = analogRead(A0);
  i_sum = i_sum+i_dig;
  n++;if(n>9){n=0;i_iz=i_sum/10;i_sum=0;} 


  u_dig = analogRead(A1);
  u_sum = u_sum+u_dig;
  m++;if(m>9){m=0;u_iz=u_sum/10;u_sum=0;w=1;} 

  if(iu==0){
  if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
  u=u+newPosition;myEnc.write(0);newPosition=0;
  if(u<0){u=0;}if(u>250){u=250;}times=millis();if(power==0){OCR1A = KALL_U*u/10;}w=1;w1=1;}
  }
  if(iu==1){
  if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
  i=i+newPosition;myEnc.write(0);newPosition=0;
  if(i<0){i=0;}if(i>250){i=250;}times=millis();if(power==0){OCR3B = KALL_I*i/100.0;}w=1;w1=1;}
  }

u8g.firstPage();  
   do {
  u8g.drawLine(0, 26, 128, 26);u8g.drawLine(0, 53, 128, 53);
  u8g.setFont(u8g_font_profont29r); 
  if(iu==0){u8g.drawStr(0,22,"U>");}else{u8g.drawStr(0,22,"U ");}u8g.setPrintPos(35, 22);u8g.print(u_iz*KALL_U_IZ/100.0,1);
  if(iu==1){u8g.drawStr(0,50,"I>");}else{u8g.drawStr(0,50,"I ");}u8g.setPrintPos(35, 50);u8g.print(i_iz*KALL_I_IZ/1000.0,2);
  u8g.setFont(u8g_font_profont12r);
  u8g.setPrintPos(105, 22);u8g.print(u/10.0,1);
  u8g.setPrintPos(105, 50);u8g.print(i/100.0,2);
  if(power==0){u8g.drawStr(35,64,"OUTPUT ON ");}else{u8g.drawStr(35,64,"OUTPUT OFF");}
  u8g.setPrintPos(60, 64);
  } while( u8g.nextPage() );
  
if(millis()-times>5000 && w1==1){EEPROM.update(0,u);EEPROM.update(1,i);w1=0;w=1;iu=0;myEnc.write(0);} 
}

void to_Timer(){newPosition = myEnc.read()/4;}  

3

Re: Источник питания с токовой стабилизацией и микроконтроллерным управл.

http://forum.rcl-radio.ru/uploads/images/2024/02/f5dce69b33b7eb1bbb3bf745105acc84.png

http://forum.rcl-radio.ru/uploads/images/2024/02/c2696e3762dd410510e7b74520de1238.png

http://forum.rcl-radio.ru/uploads/images/2024/02/5664af8613300d3bb895725eead92a14.png

http://forum.rcl-radio.ru/uploads/images/2024/02/3657ffcf03d79f24f3d39bf768e87f5e.png

http://forum.rcl-radio.ru/uploads/images/2024/02/20944fc778b10c5dc0c266a618a454be.png

http://forum.rcl-radio.ru/uploads/images/2024/02/4845c112101966000621cb5bbed94f07.png

http://forum.rcl-radio.ru/uploads/images/2024/02/7a254c1537dca6b6dc5172cf62e9cef1.png

4

Re: Источник питания с токовой стабилизацией и микроконтроллерным управл.

lcd1602

http://forum.rcl-radio.ru/uploads/images/2024/02/3a622832f6c3727f7e277fa7ed1ee577.png

http://forum.rcl-radio.ru/uploads/images/2024/02/0fbd1022983c2a5eaaeff353e1ca0643.png

http://forum.rcl-radio.ru/uploads/images/2024/02/d3e49b1fa4b0fc35da27f85d25f7d98d.png


#define KALL_U 214
#define KALL_I 1325
#define KALL_I_IZ 0.820 
#define KALL_U_IZ 1.090 

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>           // http://forum.rcl-radio.ru/misc.php?action=pan_download&item=45&download=1 
#include <EEPROM.h>
#include <MsTimer2.h>           // http://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip  
#include <Encoder.h>            // http://rcl-radio.ru/wp-content/uploads/2019/05/Encoder.zip    
Encoder myEnc(6, 5);// DT, CLK
 
LiquidCrystal_I2C lcd(0x27,16,2);  // Устанавливаем дисплей 

 
float u=0,i=0,u_iz,i_iz;
long times,oldPosition  = -999,newPosition,times0,i_sum,u_sum;
bool iu,w,w1,power;
int n,m;
float i_dig,u_dig;


void setup() {
  delay(200);Wire.begin();Serial.begin(9600);
  lcd.init();lcd.backlight();
  pinMode(7,INPUT);        // SW ENCODER
  pinMode(11,INPUT_PULLUP);// ON OFF OUTPUT
  MsTimer2::set(1, to_Timer);MsTimer2::start();
  if(EEPROM.read(100)!=0){for(int i=0;i<101;i++){EEPROM.update(i,0);}}// очистка памяти при первом включении  
  u = float(EEPROM.read(0));i=float(EEPROM.read(1));
  analogReadResolution(12);// АЦП 12 БИТ
  analogReference(INTERNAL4V096);
  pinMode(A0,INPUT);
  pinMode(A1,INPUT);
    cli();
  // TIMER_1 D9 OUTPUT
  DDRB = 1 << PB1;
  TCCR1A = 0;TCCR1B = 0;
  TCCR1A = 1 << COM1A1 | 1 << WGM11;
  TCCR1B = 1 << WGM13 | 1 << WGM12 | 1 << CS10;
  ICR1 = 10000;
  OCR1A = 0;
  // TIMER_3 D2 OUTPUT
  TCCR3A=0;TCCR3B=0;
  DDRF |= (1<<PF2);
  HDR = 1 << HDR3;
  TCCR3A = 1 << COM3B1 | 1 << WGM31;
  TCCR3B = 1 << WGM33 | 1 << WGM32 | 1 << CS30;
  ICR3 = 5000;
  OCR3B = 0;
  sei();
  lcd.setCursor(2,0);lcd.print("POWER SUPPLY");
  lcd.setCursor(2,1);lcd.print("0-25V 0-2.5A");
  delay(2000);
  OCR1A = KALL_U*u/10;
  OCR3B = KALL_I*i/100.0;
  lcd.clear();
}

void loop() {
  if(digitalRead(7)==LOW &&iu==0){iu=1;times=millis();w=1;w1=1;delay(200);}
  if(digitalRead(7)==LOW &&iu==1){iu=0;times=millis();w=1;w1=1;delay(200);}

  if(digitalRead(11)==LOW &&power==0){power=1;OCR1A=0;times=millis();w=1;w1=1;delay(200);}
  if(digitalRead(11)==LOW &&power==1){power=0;OCR1A = KALL_U*u/10;times=millis();w=1;w1=1;delay(200);}  

  i_dig = analogRead(A0);
  i_sum = i_sum+i_dig;
  n++;if(n>99){n=0;i_iz=i_sum/100;i_sum=0;} 


  u_dig = analogRead(A1);
  u_sum = u_sum+u_dig;
  m++;if(m>99){m=0;u_iz=u_sum/100;u_sum=0;w=1;} 

  if(iu==0){
  if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
  u=u+newPosition;myEnc.write(0);newPosition=0;
  if(u<0){u=0;}if(u>250){u=250;}times=millis();if(power==0){OCR1A = KALL_U*u/10;}w=1;w1=1;}
  }
  if(iu==1){
  if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
  i=i+newPosition;myEnc.write(0);newPosition=0;
  if(i<0){i=0;}if(i>250){i=250;}times=millis();if(power==0){OCR3B = KALL_I*i/100.0;}w=1;w1=1;}
  }
  
if(w==1){w=0;
  lcd.setCursor(0,0);if(iu==0){lcd.print("U>");}else{lcd.print("U ");}lcd.print(u_iz*KALL_U_IZ/100.0,1);
    if(u_iz*KALL_U_IZ/100.0<10){lcd.setCursor(5,0);lcd.print(" ");}lcd.setCursor(6,0);lcd.print("V ");
  lcd.setCursor(0,1);if(iu==1){lcd.print("I>");}else{lcd.print("I ");}lcd.print(i_iz*KALL_I_IZ/1000.0,2);lcd.setCursor(6,1);lcd.print("A ");
  lcd.setCursor(8,0);lcd.print(u/10.0,1);
  lcd.setCursor(8,1);lcd.print(i/100.0,2);
  lcd.setCursor(13,0);lcd.print("OUT");
  lcd.setCursor(13,1);if(power==0){lcd.print("ON ");}else{lcd.print("OFF");}
 }
  
if(millis()-times>5000 && w1==1){EEPROM.update(0,u);EEPROM.update(1,i);w1=0;w=1;iu=0;myEnc.write(0);} 
}

void to_Timer(){newPosition = myEnc.read()/4;}  

5

Re: Источник питания с токовой стабилизацией и микроконтроллерным управл.

XL4016 в качестве источника питания регулятора тока и напряжения для повышения КПД

#define KALL_U 214
#define KALL_I 1325
#define KALL_I_IZ 0.820 
#define KALL_U_IZ 1.090 

#include <Wire.h> 
#include <U8glib.h>             // https://github.com/olikraus/u8glib/ 
#include <EEPROM.h>
#include <MsTimer2.h>           // http://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip  
#include <Encoder.h>            // http://rcl-radio.ru/wp-content/uploads/2019/05/Encoder.zip    
Encoder myEnc(6, 5);// DT, CLK
 
U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_DEV_0|U8G_I2C_OPT_FAST);

 
float u=0,i=0,u_iz,i_iz;
long times,oldPosition  = -999,newPosition,times0,i_sum,u_sum;
bool iu,w,w1,power;
int n,m;
float i_dig,u_dig;


void setup() {
  delay(200);Wire.begin();Serial.begin(9600);
  pinMode(7,INPUT);        // SW ENCODER
  pinMode(11,INPUT_PULLUP);// ON OFF OUTPUT
  MsTimer2::set(1, to_Timer);MsTimer2::start();
  if(EEPROM.read(100)!=0){for(int i=0;i<101;i++){EEPROM.update(i,0);}}// очистка памяти при первом включении  
  u = float(EEPROM.read(0));i=float(EEPROM.read(1));
  analogReadResolution(12);// АЦП 12 БИТ
  analogReference(INTERNAL4V096);
  pinMode(A0,INPUT);
  pinMode(A1,INPUT);
  pinMode(DAC0, ANALOG);// d4 output
    cli();
  // TIMER_1 D9 OUTPUT
  DDRB = 1 << PB1;
  TCCR1A = 0;TCCR1B = 0;
  TCCR1A = 1 << COM1A1 | 1 << WGM11;
  TCCR1B = 1 << WGM13 | 1 << WGM12 | 1 << CS10;
  ICR1 = 10000;
  OCR1A = 0;
  // TIMER_3 D2 OUTPUT
  TCCR3A=0;TCCR3B=0;
  DDRF |= (1<<PF2);
  HDR = 1 << HDR3;
  TCCR3A = 1 << COM3B1 | 1 << WGM31;
  TCCR3B = 1 << WGM33 | 1 << WGM32 | 1 << CS30;
  ICR3 = 5000;
  OCR3B = 0;
  sei();
  u8g.firstPage();  
   do {
  u8g.setFont(u8g_font_profont12r); 
  u8g.drawStr(30,10,"POWER SUPPLY");
  u8g.drawStr(30,25,"0-25V 0-2.5A");
  u8g.drawStr(30,55,"rcl-radio.ru");
  } while( u8g.nextPage() );
  delay(2000);
  OCR1A = KALL_U*u/10;
  OCR3B = KALL_I*i/100.0;
}

void loop() {
  
  if(u<100){analogWrite(DAC0, 80);}else{analogWrite(DAC0, 150.0/25.0*(u/10.0+3));}
   
  if(digitalRead(7)==LOW &&iu==0){iu=1;times=millis();w=1;w1=1;delay(200);}
  if(digitalRead(7)==LOW &&iu==1){iu=0;times=millis();w=1;w1=1;delay(200);}

  if(digitalRead(11)==LOW &&power==0){power=1;OCR1A=0;times=millis();w=1;w1=1;delay(200);}
  if(digitalRead(11)==LOW &&power==1){power=0;OCR1A = KALL_U*u/10;times=millis();w=1;w1=1;delay(200);}  

  i_dig = analogRead(A0);
  i_sum = i_sum+i_dig;
  n++;if(n>9){n=0;i_iz=i_sum/10;i_sum=0;} 


  u_dig = analogRead(A1);
  u_sum = u_sum+u_dig;
  m++;if(m>9){m=0;u_iz=u_sum/10;u_sum=0;w=1;} 

  if(iu==0){
  if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
  u=u+newPosition;myEnc.write(0);newPosition=0;
  if(u<0){u=0;}if(u>250){u=250;}times=millis();if(power==0){OCR1A = KALL_U*u/10;}w=1;w1=1;}
  }
  if(iu==1){
  if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
  i=i+newPosition;myEnc.write(0);newPosition=0;
  if(i<0){i=0;}if(i>250){i=250;}times=millis();if(power==0){OCR3B = KALL_I*i/100.0;}w=1;w1=1;}
  }

u8g.firstPage();  
   do {
  u8g.drawLine(0, 26, 128, 26);u8g.drawLine(0, 53, 128, 53);
  u8g.setFont(u8g_font_profont29r); 
  if(iu==0){u8g.drawStr(0,22,"U>");}else{u8g.drawStr(0,22,"U ");}u8g.setPrintPos(35, 22);u8g.print(u_iz*KALL_U_IZ/100.0,1);
  if(iu==1){u8g.drawStr(0,50,"I>");}else{u8g.drawStr(0,50,"I ");}u8g.setPrintPos(35, 50);u8g.print(i_iz*KALL_I_IZ/1000.0,2);
  u8g.setFont(u8g_font_profont12r);
  u8g.setPrintPos(105, 22);u8g.print(u/10.0,1);
  u8g.setPrintPos(105, 50);u8g.print(i/100.0,2);
  if(power==0){u8g.drawStr(35,64,"OUTPUT ON ");}else{u8g.drawStr(35,64,"OUTPUT OFF");}
  u8g.setPrintPos(60, 64);
  } while( u8g.nextPage() );
  
if(millis()-times>5000 && w1==1){EEPROM.update(0,u);EEPROM.update(1,i);w1=0;w=1;iu=0;myEnc.write(0);} 
}

void to_Timer(){newPosition = myEnc.read()/4;} 

6

Re: Источник питания с токовой стабилизацией и микроконтроллерным управл.

Фото проекта

http://forum.rcl-radio.ru/uploads/images/2024/02/87c28ca53b39fc856d01d77265589b23.png

http://forum.rcl-radio.ru/uploads/images/2024/02/c84c9e5b57cf749bde52a549e3d8fa0e.png

http://forum.rcl-radio.ru/uploads/images/2024/02/c049aaf608f4a80914c9b513497a44f5.png

http://forum.rcl-radio.ru/uploads/images/2024/02/ed5fee22e582a9a5bc1436ac66bd2a33.png

http://forum.rcl-radio.ru/uploads/images/2024/02/7404a6ada5dc64537e1756024b9391d0.png

http://forum.rcl-radio.ru/uploads/images/2024/02/c7479ee557c6fc832116e412089e9fb6.png

http://forum.rcl-radio.ru/uploads/images/2024/02/3692b2c0c71f0666b127d5bc003a98de.png

http://forum.rcl-radio.ru/uploads/images/2024/02/27ada6580237689fd6b56e18013cef90.png

http://forum.rcl-radio.ru/uploads/images/2024/02/2d2fa9844b43bd945e7fe39d7e8c1443.png

7

Re: Источник питания с токовой стабилизацией и микроконтроллерным управл.

Добрый день.
Все это интересно! Но опять вопрос, на ардуинке будет работать? Меня интересует схема на XL4016, в качестве блока питания, есть большое желание ее повторить.

В прошлой статье Вы мне ответили:
                                     --------------------
  -В принципе должно, но показания тока будут неверные. Используется lgt, так как иметься АЦП 12 бит и внутренний ИОН 4.096В.
                                     --------------------
Сдесь таже история?

8

Re: Источник питания с токовой стабилизацией и микроконтроллерным управл.

Да, тоже надо lgt8f328

9 (2024-02-21 16:02:25 отредактировано sanj76a)

Re: Источник питания с токовой стабилизацией и микроконтроллерным управл.

А как адаптировать под ардуино? Это сложно?
Если возможно, то очень прошу, если нет, то буду lgt заказывать в китае.

10

Re: Источник питания с токовой стабилизацией и микроконтроллерным управл.

Доброго времени суток! Здорово, что взялись за гибридный БП, назовем эту связку так. Основной минус  схемы оконечного каскада и схемы БП, что мы мучали год назад - использование ШИМ сигнала для регулирования.

11

Re: Источник питания с токовой стабилизацией и микроконтроллерным управл.

А как адаптировать под ардуино? Это сложно?
Если возможно, то очень прошу, если нет, то буду lgt заказывать в китае.

Лучше заказать, нет ни какой гарантии что с ардуино будет работать корректно.

12

Re: Источник питания с токовой стабилизацией и микроконтроллерным управл.

Добрый день. Как изменить максимальное напряжение до 18в. и ток до 0,80 А.
Спасибо. Андрей.

13

Re: Источник питания с токовой стабилизацией и микроконтроллерным управл.

if(u<0){u=0;}if(u>250){u=250;}
>>
if(u<0){u=0;}if(u>180){u=180;}

if(i<0){i=0;}if(i>250){i=250;}
>>
if(i<0){i=0;}if(i>80){i=80;}

14

Re: Источник питания с токовой стабилизацией и микроконтроллерным управл.

Благодарю. Андрей.