17-06-2020, 13:37
Mam problem z algorytmem zliczającym Ah i obliczającym z tego średni prąd.
Może Wy znajdziecie błąd
Algorytm jest taki, że robię pomiary prądu ileś tam razy/s sumuję je obliczając średnią / s.
Potem mając pobrana Ah i czas wyliczam średni prąd.
Niestety gdzieś mam błąd i nie potrafię się zorientować gdzie - efekt jest taki,
że na początku pomiarów średni prąd obliczony jest mniejszy niż zmierzony
ale z upływem czasu różnica dąży do zera. Np tak (patrz "pomiarA (INA)": i "Prąd obliczony"):
Kod wygląda tak:
Z góry dzięki, za pomoc
Jakub
Może Wy znajdziecie błąd

Algorytm jest taki, że robię pomiary prądu ileś tam razy/s sumuję je obliczając średnią / s.
Potem mając pobrana Ah i czas wyliczam średni prąd.
Niestety gdzieś mam błąd i nie potrafię się zorientować gdzie - efekt jest taki,
że na początku pomiarów średni prąd obliczony jest mniejszy niż zmierzony
ale z upływem czasu różnica dąży do zera. Np tak (patrz "pomiarA (INA)": i "Prąd obliczony"):
Kod:
12:50:04.351 -> V: 4.05; korektA (INA): 1.00300002; pomiarA (INA): 0.004299999713; Prąd obliczony: 0.004167931556; As: 0.01034064; Ah: 0.00000287
12:50:06.895 -> V: 4.05; korektA (INA): 1.00300002; pomiarA (INA): 0.004299999713; Prąd obliczony: 0.004190599441; As: 0.02111643; Ah: 0.00000587
12:50:09.444 -> V: 4.05; korektA (INA): 1.00199997; pomiarA (INA): 0.004299999713; Prąd obliczony: 0.004197888374; As: 0.03189136; Ah: 0.00000886
12:50:12.026 -> V: 4.05; korektA (INA): 1.00199997; pomiarA (INA): 0.004299999713; Prąd obliczony: 0.004201507091; As: 0.04266630; Ah: 0.00001185
12:50:14.574 -> V: 4.05; korektA (INA): 1.00199997; pomiarA (INA): 0.004299999713; Prąd obliczony: 0.004203668117; As: 0.05344123; Ah: 0.00001484
12:50:17.121 -> V: 4.05; korektA (INA): 1.00199997; pomiarA (INA): 0.004299999713; Prąd obliczony: 0.004205078125; As: 0.06421575; Ah: 0.00001784
12:50:19.698 -> V: 4.05; korektA (INA): 1.00199997; pomiarA (INA): 0.004299999713; Prąd obliczony: 0.004206106185; As: 0.07499068; Ah: 0.00002083
12:50:22.244 -> V: 4.05; korektA (INA): 1.00199997; pomiarA (INA): 0.004299999713; Prąd obliczony: 0.004206877708; As: 0.08576560; Ah: 0.00002382
.....
.....
.....
.....
13:31:59.750 -> V: 4.05; korektA (INA): 1.00199997; pomiarA (INA): 0.004299999713; Prąd obliczony: 0.004284609794; As: 10.78647422; Ah: 0.00299624
13:32:02.331 -> V: 4.05; korektA (INA): 1.00199997; pomiarA (INA): 0.004299999713; Prąd obliczony: 0.004284537315; As: 10.79725265; Ah: 0.00299924
13:32:04.875 -> V: 4.05; korektA (INA): 1.00199997; pomiarA (INA): 0.004299999713; Prąd obliczony: 0.004284465789; As: 10.80803108; Ah: 0.00300223
13:32:07.455 -> V: 4.05; korektA (INA): 1.00199997; pomiarA (INA): 0.004299999713; Prąd obliczony: 0.004284393310; As: 10.81880950; Ah: 0.00300522
13:32:10.003 -> V: 4.05; korektA (INA): 1.00199997; pomiarA (INA): 0.004299999713; Prąd obliczony: 0.004284321784; As: 10.82958793; Ah: 0.00300822
13:32:12.553 -> V: 4.05; korektA (INA): 1.00199997; pomiarA (INA): 0.004299999713; Prąd obliczony: 0.004284249305; As: 10.84036636; Ah: 0.00301121
13:32:15.099 -> V: 4.05; korektA (INA): 1.00199997; pomiarA (INA): 0.004299999713; Prąd obliczony: 0.004284177780; As: 10.85114574; Ah: 0.00301421
13:32:17.680 -> V: 4.05; korektA (INA): 1.00199997; pomiarA (INA): 0.004299999713; Prąd obliczony: 0.004284105777; As: 10.86192512; Ah: 0.00301720
13:32:20.226 -> V: 4.05; korektA (INA): 1.00199997; pomiarA (INA): 0.004299999713; Prąd obliczony: 0.004284032821; As: 10.87270355; Ah: 0.00302020
13:32:22.810 -> V: 4.05; korektA (INA): 1.00199997; pomiarA (INA): 0.004299999713; Prąd obliczony: 0.004283960342; As: 10.88348293; Ah: 0.00302319
13:32:25.355 -> V: 4.05; korektA (INA): 1.00199997; pomiarA (INA): 0.004299999713; Prąd obliczony: 0.004283888339; As: 10.89426136; Ah: 0.00302618
13:32:27.901 -> V: 4.05; korektA (INA): 1.00199997; pomiarA (INA): 0.004299999713; Prąd obliczony: 0.004283815860; As: 10.9Kod wygląda tak:
Kod:
czasSTART=millis();
gestoscPOMIARU=10; //ilosc pomiarow na 1s
} // setup()
void loop()
{
if (millis() > msA + (1000/gestoscPOMIARU))
{
czasAKT=millis();
pomiarA=ina.readShuntCurrent();
czasPOMIARU=((czasAKT-czasSTART)/1000); //czas trwania okna pomiaru [s] - czasSTART to początek startu pomiarów
korektA=1+(czasAKT-(czasOLD+(1000/gestoscPOMIARU)))/1000; // korekta na realny czas między pomiarami
As=As+((pomiarA/gestoscPOMIARU)*korektA);
Ah=As/3600;
czasOLD=czasAKT;
msA = millis();
}
if (millis() > msLCD + 2500)
{
czaspracy = (millis()-czasSTART)/1000; //czas pracy [s]
prad=As/czaspracy;
lcd.setCursor( 0, 0); lcd.print("V"); lcd.setCursor( 2, 0); lcd.print(ina.readBusVoltage(),1);
lcd.setCursor( 6, 0); lcd.print("A"); lcd.setCursor( 8, 0); lcd.print(prad,6);
lcd.setCursor( 0, 1); lcd.print("WD "); lcd.setCursor( 3, 1); lcd.print(2/(prad*24),0);
lcd.setCursor( 7 ,1); lcd.print("Ah "); lcd.setCursor(10, 1); lcd.print(Ah,4);
Serial.print("V: "); Serial.print(ina.readBusVoltage());
Serial.print("; korektA (INA): "); Serial.print(korektA,8);
Serial.print("; pomiarA (INA): "); Serial.print(pomiarA,12);
Serial.print("; Prąd obliczony: "); Serial.print(prad,12);
Serial.print("; As: "); Serial.print(As,8);
Serial.print("; Ah: "); Serial.println(Ah,8);
msLCD = millis();
}
}Z góry dzięki, za pomoc

Jakub

