Регулируем стабилизатор на напрежение и ток базиран на Atmega8 с Arduino UNO bootloader

Arduino Rectifier Device

Токоизправител с регулируемо напрежение и ток, 0-20v,0-5А и регулируемо изключване на на напрежението 0-20v и ток над 5А, термична защита на изходния транзистор

Устройството представлява регулируем стабилизатор на напрежение с регулируема защита от късо съединение. Той е базиран на параметричния регулируем стабилизатор на напрежение LM317 с краен(изходен) транзистор за повишаване на максимално допустимия изходен ток от 0 до 5А. Софтуерната защита от късо съединение, базирана на контролера “Atmega8” изключва в два случея:

  • Когато тока дръпнат от консулатора надвиши 5А (ампера)
  • При изсходящо напрежение над 20V (волта)

В схемата съм прибавил и термична защита на изходния транзистор базирана на аналоговият термодатчик LM35DZ. Неговата спецификация може да свалите от тук: LM35. С помоща на бутоните разположени фронталния панел се избират показанията на дисплея, както и се регулира и терминирането на изходното напрежение, след което е необходимо ръчното му пускане. Схемното решение е вземато от списание “Радио и телевизия” от 03,2002 година. Модифицираната схемата може да видите долу:

Схема на изправителната част:

Rectifier_Part

Схема на процесорната част:

Processor_Part

Платка (PCB):

PCB_stabiliter

LCD диспля е с отделна драйверна част базирана на осем битовият шифт регистърен чип “SN74HC595”, за намаляване на използваните пинове на контролера. По този начин се използват три пина на контролера вместо шесте пина излолзвани за комуникация към дисплея, това не е повишава трудноста на изписване на софтуера защото има удобна библиотека за Arduino платформите. Пълна спецификация на шифт регистъра може да свалите от тук: SN74HC595. Схемното решение и платката на драйвера може да видите долу:

Схема на LCD дривера:

sheme_LCD

Платка на LCD драйвера:

PCB_lcd

Примерен софтуер:

Софтуерът е примерен защото в процеса на изработка на изработка на изделието може да решите да смените стойностите на делителите на напрежение, шунтовото съпротивление за измерване на ток, RC филтрите за избягване на външните смущения на аналоговите входове както и да решите да променяте части от кода.

#include <LiquidCrystal595.h>
LiquidCrystal595 lcd(3,4,2);

float R1 = 31900.0;   // first on devider
float R2 = 5000.0;    // seconf form devider
float R3 = 0.109;       // shunt

long valV = 0;
float Vin = 0.0;
float Vout = 0.0;

long valI = 0;
float Ain = 0.0;
float Aout = 0.0;


int button1 = 5;
int button1Read = 0;
int button1Count = 0;

int button2 = 6;
int button2Read = 0;
int button2Count = 200;
float Vcompare = 0.0;

int button3 = 7;
int button3Read = 0;
int button3Count = 0;

int relay = 12;
int relayStat = 0;

int blinkLED = 13;
int LEDcount = 0;

float valTemp = 0;
float temp = 0;


void setup() {
  
 // Serial.begin(115200);
  
  pinMode(button1 , INPUT);
  pinMode(button2 , INPUT);
  pinMode(button3 , INPUT);
  pinMode(relay , OUTPUT);
  pinMode(blinkLED , OUTPUT);
  
  lcd.begin(16,2);
  lcd.setCursor(2,0);
  lcd.setCursor(3 , 0);
  lcd.print("Loading ...");
  delay(500);
  lcd.clear();
  lcd.print("made my");
  lcd.setCursor(2 , 1);
  lcd.print("IcEbReAkEr 'TM'");
  delay(600);
  lcd.clear();
  lcd.setCursor(0 , 0);
  lcd.print("Press Red Button");
  lcd.setCursor(4 , 1);
  lcd.print("to Select");

}

void loop() {

 for (int i = 0 ; i < 100 ; i++) {
    valV = valV + analogRead(A4);
    valI = valI + analogRead(A5);
 }
 
  valV = (valV / 100);
  valI = (valI / 100);
  
  Vin = (valV * 5.0) / 1024;
  Vout = (Vin / (R2 / (R1+R2)));

  Ain = (valI * 5.0) / 1024;
  Aout = (Ain / R3);
    
  if (Aout > 5.0) {
    digitalWrite(relay , HIGH);
  }
  
  button2Read = digitalRead(button2);
   if ( button2Read == HIGH) {
    button2Count++;
     }
   delay(50);
   
        if ( button2Count > 200) {
          button2Count = 0;
        }
      Vcompare = ( map (button2Count , 0 , 200 , 0 , 200) / 10.0);

   if (Vout > Vcompare) {
    digitalWrite(relay , HIGH);
    relayStat = 1;
  }
  
  button3Read = digitalRead(button3);
    if (button3Read == HIGH) {
      digitalWrite(relay , LOW);
      relayStat = 2;
       delay(200);
    }
   
  button1Read = digitalRead(button1);
   if(button1Read == HIGH) {
     button1Count++;
     delay(50);
   }
       if (button1Count == 2) {
         lcd.clear();
          lcd.setCursor(0 , 0);
          lcd.print("V term.=");
          lcd.setCursor(9 , 0);
          lcd.print(Vcompare);
            if (relayStat == 1) {
              lcd.setCursor(0 , 1);
              lcd.print("Status = OFF");
              delay(25);
            }
            if (relayStat == 2) {
              lcd.setCursor(0 , 1);
              lcd.print("Status = ON");
              delay(25);
            }
       }
   
      
       if (button1Count == 1) {
         lcd.clear();
          lcd.setCursor(0 , 0);
          lcd.print("V=");
          lcd.print(Vout);
          lcd.setCursor(8 , 0);
          lcd.print("A=");
          lcd.print(Aout);
          lcd.setCursor(3 , 1);
          lcd.print("temp=");
          lcd.print(temp);
           delay(25);
       }
       
       if (button1Count == 3) {
         button1Count = 1;
        // delay(50);
       }
       
  valTemp = analogRead(A3);
  temp = valTemp * 0.485;
   if (temp > 80) {
    digitalWrite(relay , HIGH);
   } 
   
   LEDcount++;
    if(LEDcount == 10) {
      digitalWrite(blinkLED , HIGH);
    }
    if (LEDcount == 20) {
      digitalWrite(blinkLED , LOW);
      LEDcount = 0;
    }
   //delay(50);
 }

Снимки от процесът на изработване на сизделието моде да разгледате надолу:

(Направата и качеството на снимките е лошо поради отдавнашното му конструиране.)