Определение уровня заряда с помощью датчика тока (ACS758) с arduino uno

Я работаю над университетским проектом и пытаюсь оценить уровень заряда наших аккумуляторов с помощью счета кулонов.

Предыстория: Мы должны построить блок питания для преимущественно постоянной нагрузки 100 Вт (может быть увеличена до 140 Вт), который будет размещен на открытом воздухе в течение двух лет. План состоит в том, чтобы подключить небольшую ветряную турбину и несколько фотоэлектрических солнечных батарей к большой аккумуляторной батарее. Система должна работать круглосуточно и без выходных с ограниченным временем простоя.

Я купил несколько двунаправленных датчиков тока ACS758 50A, а также Arduino UNO. Я очень новичок в Arduino, и я был бы очень признателен за помощь с кодированием. План состоит в том, чтобы Arduino выполняла выборку тока и интеграцию, которые затем переводились в SOC в процентах и отправлялись на Raspberry Pi, который будет отправлять оповещения по электронной почте, если SOC ниже определенного уровня.

Я рассматривал пример кода, описывающий, как извлекать необработанные данные с датчика ACS: https://www.dfrobot.com/wiki/index.php/50A_Current_Sensor(SKU:SEN0098), а также пример кода, который выполняет интеграцию (Интеграция аналоговый сигнал с использованием ARDUINO UNO SMD), который я бы использовал для подсчета кулонов.

Скорее всего, мне нужно сочетание этих двух способов, однако я даже не знаю, с чего начать.

Заранее спасибо!

, 👍0

Обсуждение

Я бы просто измерил напряжение и использовал его для расчета уровня заряда. Или хотя бы использовать его для "сброса" тока, когда батарея заряжена. Простое измерение входного и выходного тока в конечном итоге приведет к некоторому дрейфу. Из-за саморазряда аккумулятора и/или потерь., @Gerben

Почему бы не сделать и то, и другое?, @Avamander

Есть ли прогресс в этом проекте? Было бы здорово, если бы он был, потому что наш проект чем-то похож на этот., @smg


2 ответа


2

Вместо того, чтобы использовать отдельный компонент для каждой вещи, вы можете использовать правильное решение, которое само по себе уже является комбинацией обоих: интегрированный аккумулятор тока DS2438. Эта ссылка довольно хорошо объясняет это, а также библиотека, чтобы использовать ее с arduino. Они довольно дешевы (несколько долларов) и работают очень хорошо!

Хотя на вашем месте я бы выбрал другой подход. Я не знаю, какой тип аккумулятора (литий-ионный, LiPo, свинцово-кислотный и т. д.) вы используете, но во многих случаях, если вы контролируете напряжение аккумулятора, вы можете получить достаточно информации о состоянии аккумулятора. Я пока не могу спросить вас в комментариях, потому что я здесь новичок и у меня недостаточно репутации, но если вы можете лучше описать тип батареи, которую вы используете, и то, что вы собираетесь контролировать, какую вашу схему, я могу отредактировать. сообщение, чтобы предложить вам лучшее решение.

,

Привет, я ценю помощь. Мы используем несколько аккумуляторов Rolls 4000 серии общей мощностью 12 кВтч (http://www.windandsun.co.uk/products/Batteries/Rolls-Batteries#.WPNJtmmGPIU). И солнечная фотоэлектрическая батарея, и ветряная турбина имеют контроллеры заряда, и вместе с батареей все они будут подключены к положительной и отрицательной шине. Мы хотим отслеживать SOC батареи, чтобы гарантировать, что если уровень заряда батареи опустится ниже определенного уровня, кому-то будет отправлено предупреждение. Мы также попытаемся оценить SOC с помощью измерения напряжения (что предложил Гербен), однако подсчет кулонов является требованием проекта :(, @Matei Predescu

Какое напряжение у вашей аккумуляторной батареи?, @rvbarreto


-1

вам, вероятно, следует определить soc, используя метод интегрирования тока и напряжения холостого хода. Можно скрыть недостатки обоих методов и обеспечить точный метод мониторинга. Я могу предоставить вам коды, если вам нужно,

#include <LiquidCrystal.h>                                                                                
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
const int mVperAmp = 100;const float chargingdfficiency= 0.7;
int RawValue= 0, ACSoffset = 2500;
double Voltage = 0, Amps = 0;
double g,q;
int m=0,c=0,d;
void resett(){
digitalWrite(8,LOW);
digitalWrite(7,LOW);}

void setup() {
pinMode(A0, INPUT);pinMode(A1, INPUT);
pinMode(7,OUTPUT);pinMode(8,OUTPUT);
pinMode(9,OUTPUT);
Serial.begin(9600);
delay(10);lcd.begin(20, 4); delay(10);}

void loop() {
resett();
double vini=analogRead(1);vini = vini*5/1023;
vini=5*vini;Serial.print(vini,3);vini=vini/6;
double soc=((666.6667)*vini)-1300;delay(10);
q=soc*.42;
if(soc<30){m=1;resett(); digitalWrite(7,HIGH);} // зарядка
if(soc>=100){m=0;resett();digitalWrite(8,HIGH); } // РАЗРЯДКА
if(m==0){resett();digitalWrite(8,HIGH);}
delay(10);
while(1){
RawValue = analogRead(0);
Voltage = (RawValue / 1024.0) * 5000;
Amps = ((Voltage - ACSoffset) / mVperAmp);Amps=-Amps;
if((Amps<.098)&&(Amps>-.098)){Amps=0;}
if(Amps>9){
resett();
lcd.clear();
lcd.display();
lcd.setCursor(1,0);
lcd.print("Overload");digitalWrite(9,HIGH);
while(1);}
if(m==0){
if(Amps<=1.5){g=1.183;}
else if(Amps<=2){g=0.042*Amps+1.12;}
else if(Amps<=4){g=0.028*Amps+1.148;}
else if(Amps<=5){g=0.032*Amps+1.132;}
else if(Amps<=6){g=0.03*Amps+1.142;}
else if(Amps<=7){g=0.325*Amps-0.628;}
else if(Amps<=7.5){g=0.066*Amps+1.185;}
else if(Amps<=8){g=0.028*Amps+1.47;}
else if(Amps<=10){g=1.694;}
soc=(q-Amps*g*0.0002778)*2.38095; q=soc*.42;
if(soc<5){m=1;resett();digitalWrite(7,HIGH);} }
if(m==1){
soc=(q-Amps*chargingdfficiency*0.0002778)*2.38095;
q=soc*.42;
if(soc>=100){m=0;resett();digitalWrite(8,HIGH);}}
lcd.clear();
lcd.display();
lcd.setCursor(1,0);
lcd.print("Soc = ");
lcd.setCursor(13,0);
lcd.print(soc,1);
lcd.setCursor(19,0);
lcd.print("%");
lcd.setCursor(1,1);
lcd.print("Amps= ");
lcd.setCursor(13,1);
lcd.print(Amps,1);
if(m==1){lcd.setCursor(1,2);lcd.print("Charging");}
else{lcd.setCursor(1,2);lcd.print("Discharge");}
lcd.setCursor(1,3);lcd.print("Normal");
Serial.println((vini),3);
Serial.print("Amps = ");
Serial.println(Amps,9);
Serial.print(" Soc = ");
Serial.println(soc,9);

for(d=0;((Amps==0)&&(d<=1200));d++){RawValue = analogRead(0);
Voltage = (RawValue / 1024.0) * 5000;
Amps = ((Voltage - ACSoffset) / mVperAmp);Amps=-Amps;
if(d==1200){vini=analogRead(1);vini = vini*25/(6*1023);
soc=((666.6667)*vini)-1300;d=0;}}

delay(1000);
}
}
,