1

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

Основная статья - http://rcl-radio.ru/?p=53330

http://rcl-radio.ru/wp-content/uploads/2018/11/arduino8888888999.gif

http://rcl-radio.ru/wp-content/uploads/2018/11/54378968713689.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.970;// калибровка вольтметра А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(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(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_SIXTEEN);
   a2 = ads.readADC_SingleEnded(2);a_2 = a2*0.0078125*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.0078125*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;}
}

2

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

уменьшал значение delay(200); на 100, 50
У меня не получалось точно регулировать  в сотых, показания перескакивали, например с 0 сразу на 4,
из за дребезга контакта.
Менял несколько кнопок, результат тот же.

оставил так, с двумя кнопками:

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){

3 (2022-01-29 13:48:32 отредактировано sanj76a)

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

const float kalib0=7.970; Пдобрал коєф. при входном 30в.
При входе с бп. 30в - показания 29.999
При .1в - показания 2.999
При отсутствии на входе напряжения показание - 2.230 (нет нуля)

И еще. Зачем показания с тремя знаками после 0, достаточно формат - 0.00 (два знака после 0)

4

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

При отсутствии на входе напряжения показание - 2.230 (нет нуля)

Замкните вход накоротко (резистор R1 на GND)

Проверьте будет ли ноль.

5

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

замкнул, нет нуля

6

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

Показания амперметра на нуле?

7

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

liman324 пишет:

Показания амперметра на нуле?

да на нуле

8

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();

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

9

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

может это что-то значит:
показания скачут: 2.272-2.237в, при замыкании на 0 - 2.128-2.155в

10

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

Входы ацп А1 А3 измеряют напряжение на GND, убедитесь что эти входы замкнуты на GND через резисторы 6,8 К

11 (2022-01-29 16:17:23 отредактировано sanj76a)

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

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

что это значит?

12

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

liman324 пишет:

Входы ацп А1 А3 измеряют напряжение на GND, убедитесь что эти входы замкнуты на GND через резисторы 6,8 К

замкнуты

13

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

У Вас вход А0 измеряет какое то напряжение которого не должно быть при замкнутом входе. Замкните вход А0 на gnd и посмотрите результат измерения в мониторе порта

14 (2022-01-29 16:30:27 отредактировано sanj76a)

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

liman324 пишет:

У Вас вход А0 измеряет какое то напряжение которого не должно быть при замкнутом входе. Замкните вход А0 на gnd и посмотрите результат измерения в мониторе порта

R1 был замкнут когда запускал монитор.
Заметил когда включаю питание секунд 5-8 - нули, затем появляются показания -2. в

15

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

удалите временно строку:

u_0=u_0-(a_2/100);// компенсация напряжения шунта

замкните А0 на ацп на замлю и откройте монитор порта

16

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

Вход ацп может быть неисправен.

17

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

liman324 пишет:

Вход ацп может быть неисправен.

как проверить?

18

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

удалите временно строку:

u_0=u_0-(a_2/100);// компенсация напряжения шунта

замкните А0 на ацп на замлю и откройте монитор порта

19

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

Есть еще тестовый скетч:

#include <Wire.h>
#include <Adafruit_ADS1015.h>
Adafruit_ADS1115 ads; 
/*Adafruit_ADS1115 ads(0x48);          задайте адрес устройства по которому 
будем работать на I2C шине (если уст-во одно, задавать адрес необязательно)*/

void setup(void) {
  Serial.begin(9600);
 
  // ads.setGain(GAIN_TWOTHIRDS);  // 2/3x gain +/- 6.144V  1 bit = 0.1875mV (default)
  // ads.setGain(GAIN_ONE);        // 1x gain   +/- 4.096V  1 bit = 0.125mV
   ads.setGain(GAIN_TWO);          // 2x gain   +/- 2.048V  1 bit = 0.0625mV
  // ads.setGain(GAIN_FOUR);       // 4x gain   +/- 1.024V  1 bit = 0.03125mV
  // ads.setGain(GAIN_EIGHT);      // 8x gain   +/- 0.512V  1 bit = 0.015625mV
  // ads.setGain(GAIN_SIXTEEN);    // 16x gain  +/- 0.256V  1 bit = 0.0078125mV
 
  ads.begin();
}
int16_t adc0, adc1, adc2, adc3;
void loop(void) {
  adc0 = ads.readADC_SingleEnded(0);
  adc1 = ads.readADC_SingleEnded(1);
  adc2 = ads.readADC_SingleEnded(2);
  adc3 = ads.readADC_SingleEnded(3);
  Serial.print("AIN0: "); Serial.println(adc0);
  Serial.print("AIN1: "); Serial.println(adc1);
  Serial.print("AIN2: "); Serial.println(adc2);
  Serial.print("AIN3: "); Serial.println(adc3);
  Serial.println(" ");
 
  delay(1000);
}

20

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

liman324 пишет:

удалите временно строку:

u_0=u_0-(a_2/100);// компенсация напряжения шунта

замкните А0 на ацп на замлю и откройте монитор порта

сделал, показания 0.035 в

21

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

liman324 пишет:

удалите временно строку:

u_0=u_0-(a_2/100);// компенсация напряжения шунта

замкните А0 на ацп на замлю и откройте монитор порта

u_0=u_0-(a_2/100)-вставил на место, А0 на земле
пказания 0.035 в

22 (2022-01-29 17:04:34 отредактировано sanj76a)

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

liman324 пишет:

Есть еще тестовый скетч:

#include <Wire.h>
#include <Adafruit_ADS1015.h>
Adafruit_ADS1115 ads; 
/*Adafruit_ADS1115 ads(0x48);          задайте адрес устройства по которому 
будем работать на I2C шине (если уст-во одно, задавать адрес необязательно)*/

void setup(void) {
  Serial.begin(9600);
 
  // ads.setGain(GAIN_TWOTHIRDS);  // 2/3x gain +/- 6.144V  1 bit = 0.1875mV (default)
  // ads.setGain(GAIN_ONE);        // 1x gain   +/- 4.096V  1 bit = 0.125mV
   ads.setGain(GAIN_TWO);          // 2x gain   +/- 2.048V  1 bit = 0.0625mV
  // ads.setGain(GAIN_FOUR);       // 4x gain   +/- 1.024V  1 bit = 0.03125mV
  // ads.setGain(GAIN_EIGHT);      // 8x gain   +/- 0.512V  1 bit = 0.015625mV
  // ads.setGain(GAIN_SIXTEEN);    // 16x gain  +/- 0.256V  1 bit = 0.0078125mV
 
  ads.begin();
}
int16_t adc0, adc1, adc2, adc3;
void loop(void) {
  adc0 = ads.readADC_SingleEnded(0);
  adc1 = ads.readADC_SingleEnded(1);
  adc2 = ads.readADC_SingleEnded(2);
  adc3 = ads.readADC_SingleEnded(3);
  Serial.print("AIN0: "); Serial.println(adc0);
  Serial.print("AIN1: "); Serial.println(adc1);
  Serial.print("AIN2: "); Serial.println(adc2);
  Serial.print("AIN3: "); Serial.println(adc3);
  Serial.println(" ");
 
  delay(1000);
}

А схема подключения?

как входа? На землю?

23

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

u_0=u_0-(a_2/100)-вставил на место, А0 на земле
пказания 0.035 в

Если у Вас 0,035 В при замыкании входа, откуда берется лишнее напряжении при замыкании R1 на землю?
Может наводка по питанию? Стоит конденсатор по питанию 5 В?

24

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

А схема подключения?

как входа? На землю?

Да. Если будут нули, то входа рабочие, так же можно подать 1,5 В и померить напряжение.

25

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

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

показания монитора,
входа на земле.
А0 не порядок. ДА?