Тема: LM723 + ARDUINO = ИСТОЧНИК ПИТАНИЯ 0-28В 0-2.5А С ЗАЩИТОЙ ПО ТОКУ
 
Данный контент доступен только зарегистрированным пользователям. 
 
 
#include <Wire.h>
#include <EEPROM.h>
#include <MCP3421.h>  // http://rcl-radio.ru/?p=62308
#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 <LiquidCrystal_I2C.h> // http://forum.rcl-radio.ru/misc.php?action=pan_download&item=45&download=1
 Encoder myEnc(8, 9);//CLK, DT
 MCP3421 mcp;
 LiquidCrystal_I2C lcd(0x27,16,2);  // Устанавливаем дисплей 
 
 unsigned long times,oldPosition  = -999,newPosition;
 int u_out,u_dig,menu,i_out;
 const float u_k = 7.08; // калибровка регулятора напряжения
 const float i_k = 1.007;// каибровка ограничителя тока 
 const float r = 0.01;   // сопротивение шунта
 byte power = 1; // при подачи питания выходное напряжение 0 В - OFF
 float i;
 byte w;
void setup(){
  Wire.begin();lcd.init();lcd.backlight();
  mcp.setConfig(3,3); 
  MsTimer2::set(3, to_Timer);MsTimer2::start();
  pinMode(10,INPUT);//  SW энкодер MENU
  pinMode(2,INPUT_PULLUP); // кнопка ON/OFF
  u_out=EEPROM.read(0)*256+EEPROM.read(1);i_out=EEPROM.read(2);
  }
void loop(){
  i_kz();
  if(digitalRead(10)==LOW){menu++;if(menu>1){menu=0;}delay(200);}
  if(digitalRead(2)==LOW&&power==0){power = 1;delay(300);}
  if(digitalRead(2)==LOW&&power==1){power = 0;delay(300);}
  //////// set out 0-28 V
  if(menu==0){
  if (newPosition != oldPosition){oldPosition = newPosition;
     u_out=u_out+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;
     if(u_out<0){u_out=0;}if(u_out>280){u_out=280;}u_dig = float(u_out/10.00)/u_k*4096/5.00;}}
  //////// set i 0-2.5 A
  if(menu==1){
  if (newPosition != oldPosition){oldPosition = newPosition;
     i_out=i_out+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;
     if(i_out<0){i_out=0;}if(i_out>250){i_out=250;}}}
  
  //////// lcd
  i_kz();
  lcd.setCursor(0, 0);if(menu==0){lcd.print("U*= ");}else{lcd.print("U = ");}if(u_out<100){lcd.print(" ");}
  lcd.print(float(u_out/10.00),1);lcd.print(" V ");  
  lcd.setCursor(11, 0);lcd.print(abs(i),3);
  lcd.setCursor(0, 1);if(menu==1){lcd.print("A*= ");}else{lcd.print("I = ");}lcd.print(float(i_out/100.00),2);lcd.print(" A ");
  i_kz();
  
  //////////////// EEPROM
  if(millis()-times>5000&&w==1){EEPROM.update(0,highByte(u_out));EEPROM.update(1,lowByte(u_out));EEPROM.update(2,i_out);menu=0;times=millis();w=0;}
  }//loop
void MCP4725(int data){  
  byte buffer[3];
  buffer[0] = 0b01000000;
  // data=0;
  // buffer[0] = 0b01100000; // запись в память ЦАП 0 В 
  buffer[1] = data >> 4;              
  buffer[2] = data << 4;
  Wire.beginTransmission(0x60);
  Wire.write(buffer[0]);
  Wire.write(buffer[1]);
  Wire.write(buffer[2]);
  Wire.endTransmission();
  }  
void i_kz(){  
  i = mcp.readWire()*0.256/131071*i_k/r;
  if(i > float(i_out/100.0)){MCP4725(0);lcd.setCursor(12, 1);lcd.print("ERR");delay(5000);power=1;}
  else{lcd.setCursor(12, 1);
  if(power==0){MCP4725(u_dig+i*5);lcd.print("ON ");}
  if(power==1){MCP4725(0);lcd.print("OFF");}
  }}
  
void to_Timer(){newPosition = myEnc.read()/4;}  
