Re: Вольтамперметр для блока питания (Arduino)
Да, это плохо, а это на пределе 2 В, если перевести на предел 0,256 В, значения будут еще больше.
Опубликуйте Вас скетч, я перекину основной вход на другой исправный.
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
forum.rcl-radio.ru → Тестирование скетчей → Вольтамперметр для блока питания (Arduino)
Да, это плохо, а это на пределе 2 В, если перевести на предел 0,256 В, значения будут еще больше.
Опубликуйте Вас скетч, я перекину основной вход на другой исправный.
#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 Ом
уберите в показаниях 3-й знак(тысячный) после нуля, он ни к чему
Измените схему:
убрал лишний знак
#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;}
}
Менять местами А1 с А0?
Да, на А0 можно подать землю.
хочу знать в каких местах скетча убрали третий знак
lcd.setCursor(0,0);if(u_0<=9.999){lcd.print(" ");}lcd.print(abs(u_0),2);lcd.print(" B");
коментарий думаю лишний. Подправил 3-й знак в показаниях тока.
const float kalib0=7.633; подбирал методом научного тыка
Как нужно высчитывать коэф.?
const float kalib2=1.000;// калибровка амперметра А2 по максимальному току 10 А
Калибровка так же? задать максимум и подбирать?
как временно отключить защиту по току
Отличные измерения. По току так же нужно подбирать коэффициент, 1,000 это для шунта 100,00 Ом, если шунт немного отличается от 100,00 Ом, то потребуется корректировка коэффициента.
if(a_2>=i_reg){digitalWrite(10,LOW);stop=1;break;}else{digitalWrite(10,HIGH);}delay(20);
если эту строку закоментировать, защита отключица?
да
Отличные измерения. По току так же нужно подбирать коэффициент, 1,000 это для шунта 100,00 Ом, если шунт немного отличается от 100,00 Ом, то потребуется корректировка коэффициента.
шунт 0.1 Ом какой коэф.
При 10 А на шунте 0,01 Ом у Вас падение напряжения будет 0,1 В, при 0,1 Ом падение напряжение при 10 А будет 1 В. Это очень много, такой шунт использовать не рекомендую. Да и сам вход АЦП рассчитан на напряжение 0,256 В.
Используйте манганиновую проволоку для шунта.
хочу уменьшить время защиты до 5 с.
вывод на лсд сделал, а как уменьшить само время
if(stop==1){lcd.setCursor(9,0);lcd.print(" 10sOFF ");stop=0;delay(10000);}
Уменьшите до 5000
ток хочу сделать для начала 3А максимум и оставить шунт 2 параллельно пол 0.1А
Сейчас без изменения скетча Вы можете измерять ток до 2,56 А, при коэффициенте 0,100
До 5,12 А при коэффициенте 0,200
на входе 1в, нагрузка 0А
На входе 0в, нагрузка 0А
при настройке напряжения питал схему от USB, сейчас переключил питание и вот какой ток.
что подправить в скетче?
В loop сделайте вставку кода:
Serial.print(u0);Serial.print(" ");
Serial.print(u1);Serial.print(" ");
Serial.print(a2);Serial.print(" ");
Serial.print(a3);Serial.print(" ");
Serial.println();
Откройте монитор порта.
За показания тока отвечает эта строка:
a2 = ads.readADC_SingleEnded(2);a_2 = a2*0.0078125*kalib2/10;
Менять местами А2 и А3
forum.rcl-radio.ru → Тестирование скетчей → Вольтамперметр для блока питания (Arduino)
Форум работает на PunBB, при поддержке Informer Technologies, Inc
|