26

Re: Вольтамперметр для блока питания (Arduino)

Да, это плохо, а это на пределе 2 В, если перевести на предел 0,256 В, значения будут еще больше.

Опубликуйте Вас скетч, я перекину основной вход на другой исправный.

27

Re: Вольтамперметр для блока питания (Arduino)

#include <Wire.h>
#include <Adafruit_ADS1015.h> // Adafruit_ADS1X15-master.zip
#include <EEPROM.h>//#include <EEPROMex.h>
Adafruit_ADS1115 ads;
#include <LiquidCrystal.h>
  LiquidCrystal lcd(7, 6, 2, 3, 4, 5);// RS,E,D4,D5,D6,D7

  int u0,u1,a2,a3,i;
  byte w,stop;
  float u_0,u_1,u_ob0,u_ob1,a_2,a_3,a_ob2,a_ob3,i_reg;
  unsigned long time=millis();
  const float kalib0=7.656;// калибровка вольтметра А0 по максимальному напряжению 30V I=0
  const float kalib2=1.000;// калибровка амперметра А2 по максимальному току 10 А

void setup(void){
  Serial.begin(9600);
  lcd.begin(16, 2);
  pinMode(12,INPUT);
  pinMode(11,INPUT);
  pinMode(9,INPUT);
  pinMode(8,INPUT);
  pinMode(10,OUTPUT);
  i_reg = EEPROM.read(0)+(float)EEPROM.read(1)/100;// reg eeprom
  ads.begin();delay(100);
}

void loop()
{
  if(digitalRead(12)==HIGH){i_reg=i_reg+0.01;if(i_reg>=9.99){i_reg=9.99;}time=millis();delay(200);w=1;}
  if(digitalRead(11)==HIGH){i_reg=i_reg-0.01;if(i_reg<0){i_reg=0.01;}time=millis();delay(200);w=1;}
  if(digitalRead(9)==HIGH){i_reg=i_reg+1.00;if(i_reg>=9.99){i_reg=9.99;}time=millis();delay(200);w=1;}
  if(digitalRead(8)==HIGH){i_reg=i_reg-1.00;if(i_reg<0){i_reg=0.01;}time=millis();delay(200);w=1;}
  if(millis()-time>3000){
////////////////////////////////// вольтметр ////////////////////////////////////////////
while(i<10){i++;ads.setGain(GAIN_ONE);
   u0 = ads.readADC_SingleEnded(0);u_0 = u0*0.125*kalib0/1000;delay(20);
   u1 = ads.readADC_SingleEnded(1);u_1 = u1*0.125*kalib0/1000;delay(5);
   u_ob0=u_ob0+u_0;u_ob1=u_ob1+u_1;}
   u_0=u_ob0/10;u_ob0=0;u_1=u_ob1/10;u_ob1=0;i=0;  u_0=u_0-u_1;
  ///////////////////////////////// амперметр /////////////////////////////////////////////
while(i<10){i++;ads.setGain(GAIN_FOUR);
   a2 = ads.readADC_SingleEnded(2);a_2 = a2*0.03125*kalib2/10;
   if(a_2>=i_reg){digitalWrite(10,LOW);stop=1;break;}else{digitalWrite(10,HIGH);}delay(20);
   a3 = ads.readADC_SingleEnded(3);a_3 = a3*0.03125*kalib2/10;delay(5);
   a_ob2=a_ob2+a_2;a_ob3=a_ob3+a_3;}
   a_3=a_ob3/10;a_ob3=0;a_2=a_ob2/10;a_ob2=0;i=0;a_2=a_2-a_3;
    ///////////////////////////////// вывод на экран ///////////////////////////////////////
   if(a_2<0.005){a_2=0;}if(u_0<0.005){u_0=0;}// измерения начинаются с 0,005 В и с 0,005 А
   u_0=u_0-(a_2/100);// компенсация напряжения шунта
  }
   lcd.setCursor(0,0);if(u_0<=9.999){lcd.print(" ");}lcd.print(abs(u_0),3);lcd.print(" B");
   if(millis()-time<3000){lcd.print("  REG    ");}
   lcd.setCursor(0,1);lcd.print(" ");lcd.print(abs(a_2),3);lcd.print(" A  ");lcd.print(i_reg,2);lcd.print(" A ");
   if(stop==1){lcd.setCursor(9,0);lcd.print(" 10sOFF ");stop=0;delay(10000);}
   if(stop==0&&millis()-time>3000){lcd.setCursor(9,0);lcd.print(" ON    ");}

   if(w==1){EEPROM.update(0,(int)i_reg);EEPROM.update(1,i_reg*100-(int)i_reg*100);w=0;}
}

шунт 0.1 Ом

28 (2022-01-29 18:17:00 отредактировано sanj76a)

Re: Вольтамперметр для блока питания (Arduino)

уберите в показаниях 3-й знак(тысячный) после нуля, он ни к чему

29

Re: Вольтамперметр для блока питания (Arduino)

Измените схему:
http://forum.rcl-radio.ru/uploads/images/2022/01/fda2d5f2309299995cee610834747dfa.png

убрал лишний знак

#include <Wire.h>
#include <Adafruit_ADS1015.h> // Adafruit_ADS1X15-master.zip
#include <EEPROM.h>//#include <EEPROMex.h>
Adafruit_ADS1115 ads;
#include <LiquidCrystal.h>
  LiquidCrystal lcd(7, 6, 2, 3, 4, 5);// RS,E,D4,D5,D6,D7

  int u0,u1,a2,a3,i;
  byte w,stop;
  float u_0,u_1,u_ob0,u_ob1,a_2,a_3,a_ob2,a_ob3,i_reg;
  unsigned long time=millis();
  const float kalib0=7.656;// калибровка вольтметра А0 по максимальному напряжению 30V I=0
  const float kalib2=1.000;// калибровка амперметра А2 по максимальному току 10 А

void setup(void){
  Serial.begin(9600);
  lcd.begin(16, 2);
  pinMode(12,INPUT);
  pinMode(11,INPUT);
  pinMode(9,INPUT);
  pinMode(8,INPUT);
  pinMode(10,OUTPUT);
  i_reg = EEPROM.read(0)+(float)EEPROM.read(1)/100;// reg eeprom
  ads.begin();delay(100);
}

void loop()
{
  if(digitalRead(12)==HIGH){i_reg=i_reg+0.01;if(i_reg>=9.99){i_reg=9.99;}time=millis();delay(200);w=1;}
  if(digitalRead(11)==HIGH){i_reg=i_reg-0.01;if(i_reg<0){i_reg=0.01;}time=millis();delay(200);w=1;}
  if(digitalRead(9)==HIGH){i_reg=i_reg+1.00;if(i_reg>=9.99){i_reg=9.99;}time=millis();delay(200);w=1;}
  if(digitalRead(8)==HIGH){i_reg=i_reg-1.00;if(i_reg<0){i_reg=0.01;}time=millis();delay(200);w=1;}
  if(millis()-time>3000){
////////////////////////////////// вольтметр ////////////////////////////////////////////
while(i<10){i++;ads.setGain(GAIN_ONE);
   u0 = ads.readADC_SingleEnded(1);u_0 = u0*0.125*kalib0/1000;delay(20);
   u1 = 0;u_1 = u1*0.125*kalib0/1000;delay(5);
   u_ob0=u_ob0+u_0;u_ob1=u_ob1+u_1;}
   u_0=u_ob0/10;u_ob0=0;u_1=u_ob1/10;u_ob1=0;i=0;  u_0=u_0-u_1;
  ///////////////////////////////// амперметр /////////////////////////////////////////////
while(i<10){i++;ads.setGain(GAIN_FOUR);
   a2 = ads.readADC_SingleEnded(2);a_2 = a2*0.03125*kalib2/10;
   if(a_2>=i_reg){digitalWrite(10,LOW);stop=1;break;}else{digitalWrite(10,HIGH);}delay(20);
   a3 = ads.readADC_SingleEnded(3);a_3 = a3*0.03125*kalib2/10;delay(5);
   a_ob2=a_ob2+a_2;a_ob3=a_ob3+a_3;}
   a_3=a_ob3/10;a_ob3=0;a_2=a_ob2/10;a_ob2=0;i=0;a_2=a_2-a_3;
    ///////////////////////////////// вывод на экран ///////////////////////////////////////
   if(a_2<0.005){a_2=0;}if(u_0<0.005){u_0=0;}// измерения начинаются с 0,005 В и с 0,005 А
   u_0=u_0-(a_2/100);// компенсация напряжения шунта
  }
   lcd.setCursor(0,0);if(u_0<=9.999){lcd.print(" ");}lcd.print(abs(u_0),2);lcd.print(" B");
   if(millis()-time<3000){lcd.print("  REG    ");}
   lcd.setCursor(0,1);lcd.print(" ");lcd.print(abs(a_2),3);lcd.print(" A  ");lcd.print(i_reg,2);lcd.print(" A ");
   if(stop==1){lcd.setCursor(9,0);lcd.print(" 10sOFF ");stop=0;delay(10000);}
   if(stop==0&&millis()-time>3000){lcd.setCursor(9,0);lcd.print(" ON    ");}

   if(w==1){EEPROM.update(0,(int)i_reg);EEPROM.update(1,i_reg*100-(int)i_reg*100);w=0;}
}

30

Re: Вольтамперметр для блока питания (Arduino)

Менять местами А1 с А0?

31

Re: Вольтамперметр для блока питания (Arduino)

Да, на А0 можно подать землю.

32 (2022-01-29 18:21:40 отредактировано sanj76a)

Re: Вольтамперметр для блока питания (Arduino)

хочу знать в каких местах скетча убрали третий знак

33

Re: Вольтамперметр для блока питания (Arduino)

lcd.setCursor(0,0);if(u_0<=9.999){lcd.print(" ");}lcd.print(abs(u_0),2);lcd.print(" B");

34

Re: Вольтамперметр для блока питания (Arduino)

http://forum.rcl-radio.ru/uploads/images/2022/01/b6639d554820ac4eded00f2baec4e16c.jpg

http://forum.rcl-radio.ru/uploads/images/2022/01/fe1554af792891366e28a29d0c603979.jpg

http://forum.rcl-radio.ru/uploads/images/2022/01/f3c81d665c5e94dd69985c0b237df0ce.jpg

http://forum.rcl-radio.ru/uploads/images/2022/01/0ce8c7c3a9d52fee60b9a1dc74156b67.jpg

http://forum.rcl-radio.ru/uploads/images/2022/01/f4ec415f9692b36cf7e9ae51158fc524.jpg

коментарий думаю лишний. Подправил 3-й знак в показаниях тока.
const float kalib0=7.633; подбирал методом научного тыка
Как нужно высчитывать коэф.?

35 (2022-01-30 11:19:07 отредактировано sanj76a)

Re: Вольтамперметр для блока питания (Arduino)

const float kalib2=1.000;// калибровка амперметра А2 по максимальному току 10 А
Калибровка так же? задать максимум и подбирать?

как временно отключить защиту по току

36

Re: Вольтамперметр для блока питания (Arduino)

Отличные измерения. По току так же нужно подбирать коэффициент, 1,000 это для шунта 100,00 Ом, если шунт немного отличается от 100,00 Ом, то потребуется корректировка коэффициента.

37

Re: Вольтамперметр для блока питания (Arduino)

if(a_2>=i_reg){digitalWrite(10,LOW);stop=1;break;}else{digitalWrite(10,HIGH);}delay(20);

если эту строку закоментировать, защита отключица?

38

Re: Вольтамперметр для блока питания (Arduino)

да

39

Re: Вольтамперметр для блока питания (Arduino)

liman324 пишет:

Отличные измерения. По току так же нужно подбирать коэффициент, 1,000 это для шунта 100,00 Ом, если шунт немного отличается от 100,00 Ом, то потребуется корректировка коэффициента.

шунт 0.1 Ом какой коэф.

40

Re: Вольтамперметр для блока питания (Arduino)

При 10 А на шунте 0,01 Ом у Вас падение напряжения будет 0,1 В, при 0,1 Ом падение напряжение при 10 А будет 1 В. Это очень много, такой шунт использовать не рекомендую. Да и сам вход АЦП рассчитан на напряжение 0,256 В.

41

Re: Вольтамперметр для блока питания (Arduino)

Используйте манганиновую проволоку для шунта.

42 (2022-01-30 11:37:44 отредактировано sanj76a)

Re: Вольтамперметр для блока питания (Arduino)

хочу уменьшить время защиты до 5 с.

вывод на лсд сделал, а как уменьшить само время

43

Re: Вольтамперметр для блока питания (Arduino)

if(stop==1){lcd.setCursor(9,0);lcd.print(" 10sOFF ");stop=0;delay(10000);}

Уменьшите до 5000

44

Re: Вольтамперметр для блока питания (Arduino)

http://forum.rcl-radio.ru/uploads/images/2022/01/d985dc240a1890ad6d02874c9c5795ce.jpg


ток хочу сделать для начала 3А максимум и оставить шунт 2 параллельно пол 0.1А

45

Re: Вольтамперметр для блока питания (Arduino)

Сейчас без изменения скетча Вы можете измерять ток до 2,56 А, при коэффициенте 0,100

46

Re: Вольтамперметр для блока питания (Arduino)

До 5,12 А при коэффициенте 0,200

47

Re: Вольтамперметр для блока питания (Arduino)

на входе 1в, нагрузка 0А

http://forum.rcl-radio.ru/uploads/images/2022/01/9b50d080d4650087c715279d08729cb7.jpg


На входе 0в, нагрузка 0А

http://forum.rcl-radio.ru/uploads/images/2022/01/51a6e2b9a70ebe7033d1fc7279d6ff98.jpg

при настройке напряжения питал схему от USB, сейчас переключил питание и вот какой ток.
что подправить в скетче?

48

Re: Вольтамперметр для блока питания (Arduino)

В loop сделайте вставку кода:

Serial.print(u0);Serial.print(" ");
Serial.print(u1);Serial.print(" ");
Serial.print(a2);Serial.print(" ");
Serial.print(a3);Serial.print(" ");
Serial.println();

Откройте монитор порта.

49

Re: Вольтамперметр для блока питания (Arduino)

За показания тока отвечает эта строка:

a2 = ads.readADC_SingleEnded(2);a_2 = a2*0.0078125*kalib2/10;

50

Re: Вольтамперметр для блока питания (Arduino)

http://forum.rcl-radio.ru/uploads/images/2022/01/f53109c7de41bb04890288a974f9a506.png

Менять местами А2 и А3