Тема: 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;}