|
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
malci Član
Pridružen-a: Sob 15 Sep 2007 21:05 Prispevkov: 792 Aktiv.: 3.92 Kraj: Polhov Gradec
|
Objavljeno: Pon Jan 13, 2020 9:19 pm Naslov sporočila: izračun povprečen porabe pri E-avtu |
|
|
Pozdravljeni!
za svoj e-avto izdelujem ene vrste "board computer" kjer mi bo izpisovalo tudi povrečno porabo, povprečno prabo za zadnji km in povp. porabo za zadnjih 10km.
Zaenkrat sem naredil kot je v spodnji kodi, samo mi je kar požrešno z spominom. Ima kdo idejo, kako to kodo optimizirati?
lp Uroš
Koda: |
long distanceMeters=0; // celotna pot v metrih
float distanceKiloMeters=0; // celotna pot v km
float SPEED=0; // hitrost v kmh
unsigned long previousMillisSpeed = 0;
int RangeKm = 0; // doseg v km glede na povprečno celotno porabo
int RangeKm1 = 0; // doseg glede na porabo v zadnjih 1 km
int distance1km=0;
float consumption1km=0;
int RangeKm10 = 0; // doseg glede na porabo v zadnjih 10 km
int distance10km=0;
float consumption10km=0;
int stateDistance[200], stateSOC[200], indState=0;
}
void loop() {
...
...
...
..,
}
void hitrost(){ // ter razdalje ter koficienti
.......
.....
....
distanceMeters=distanceMeters+distance; // metri so se dodali že prevoženim metrom
distanceKiloMeters= distanceMeters/1000; // izračun prevoženih kilometrov
int timeSpeed=millis() - previousMillisSpeed;
previousMillisSpeed=millis();
SPEED=distance * 3600; // najprej se poveča, da ni preveč decimalk med računanjem
SPEED=SPEED/float(timeSpeed); // dobljeno se deli z časom med meritvami
if (distanceMeters > (indState * 100)){ // vsakih cca 100 metrov se..,
stateDistance[indState]= distanceMeters; // zabeleži stanje metrov...
stateSOC[indState]=(socAh*100); // zabeleži stanje SOC
distance1km=(stateDistance[indState] - stateDistance[indState-10]); // razdalja1km je trenutan razdalja - razdalj izpred 10 meritev
consumption1km=(stateSOC[indState] - stateSOC[indState-10]); // poraba je trenutno stanej SOC - stanje SOC izpred 10 meritev
// podbno tudi za izračin povprečaj za 10km
Serial.print(" index:" + String(indState) + " stateDistance:" + String(stateDistance[indState])+ " stateSOC:" + String(stateSOC[indState]));
Serial.println(" distance1km: " + String(distance1km) + " consumption1km: " + String(consumption1km/100));
indState++; // poveča index
if (indState >199) indState=0; //če je več kot 100, se začne prepisovati...
} |
_________________ Elektronika za hobi |
|
Nazaj na vrh |
|
|
bostjang Član
Pridružen-a: Tor 03 Jan 2006 15:29 Prispevkov: 3173 Aktiv.: 14.25 Kraj: Postojna
|
Objavljeno: Tor Jan 14, 2020 1:22 pm Naslov sporočila: |
|
|
Če beležiš razdaljo vsakih 100 metrov, potem te razdalje ni potrebno shraniti za vsako točko. Tako lahko privarčuješ 200 intov.
Če v 100 metrih ne moreš porabiti 2,55 Ah, bi lahko shranjeval razlikov SOC za kar bi uporabil 8 bitno spremenljivko (če je sedaj 16 bitna).
Zakaj pa shranuješ 200 podatkov, ko te pa zanima zadnji 10 km, ki je 100x100 m?
Podatki so shranjeni v krožnem pomnilniku, tega pri izpisu nimaš upoštevanega. indState je pri tebi lahko 0, indState-10 je potem negativen, kar ni OK za indeks!
Pri izpisu ustrezno poračunaš.
PS: Pod SOC se običajno razume relativno napolnjenost (v %). V kodi navedeno je bolj preostali naboj (Remaining Charge). |
|
Nazaj na vrh |
|
|
malci Član
Pridružen-a: Sob 15 Sep 2007 21:05 Prispevkov: 792 Aktiv.: 3.92 Kraj: Polhov Gradec
|
Objavljeno: Tor Jan 14, 2020 2:33 pm Naslov sporočila: |
|
|
200 vrednosti za to, ker sem prvotno (in verjetno tudi končno) uporabil povprečje 20km.
Sem pa včeraj opazil, da koda deluje ok samo za prvi cikel, ob resetiranju indexa je pa težava, tudi z negativnim indexom, predvsem pa s
Koda: |
if (distanceMeters > (indState * 100)){ // vsakih cca 100 metrov se.., |
ker je razdalja vedno večjo kot 10 km.
Se bom pa zvečer "igral" dalje, kako najti drugo varianto.
lp _________________ Elektronika za hobi |
|
Nazaj na vrh |
|
|
igo Član
Pridružen-a: Sre 11 Okt 2006 19:11 Prispevkov: 3638 Aktiv.: 17.06
|
Objavljeno: Tor Jan 14, 2020 5:39 pm Naslov sporočila: |
|
|
Napisal bom tako, kakor da zajameš impulz ob vsakem vrtljaju kolesa, pri čemer kolo prevozi fiksno razdaljo enega obsega.
Ob tem se sproži prekinitev in v krožni pomnilnik porabljenCas[index] se shrani Čas med dvema zaporednima meritvama.
Če je ta čas daljši od nekega maksimalnega
if(porabljenCas > porabljenCasMax),
naj postane enak 0 ali 255, hitrost pa je takrat enaka 0.
Indeks je najlažje izvesti z 256 mesti, ko je lahko navadna 8-bitna byte spremenljivka in ni nobenega kompliciranja.
Če je velik 200 mest, se uporabi pomožni indeks, ki je od originalnega manjši za npr. 10, a se mu z if stavkom prišteje 190, če je originalni manjši od 10.
if (original < 10) kopija = original + 190;
else kopija = original - 10;
Ob vsaki prekinitvi se skupnemu času odšteje porabljenČas[kopija], doda pa se mu porabljenČas[original].
Vsota se lahko sešteje samo enkrat. _________________ Teoretično je praksa posledica teorije, praktično je pa ravno obratno. (igo 2001)
LP, Igor |
|
Nazaj na vrh |
|
|
malci Član
Pridružen-a: Sob 15 Sep 2007 21:05 Prispevkov: 792 Aktiv.: 3.92 Kraj: Polhov Gradec
|
Objavljeno: Pon Feb 24, 2020 10:28 pm Naslov sporočila: |
|
|
Ta, zgoraj opisan problem sem nekako zadovoljivo rešil. V realnosti je povprečej 20km prveliko, moram zmanjšati na 5km.
Imam pa drugo težavo, ki bi jo rad izboljšal.
V spodnji kodi ima za trenutno porabo narejeno, da se osvežuje vsakih 100m ( prvi If). Predvidevam, da bi se dalo iz hitrosti (npr Km/h) in toka (A) izračunati tudi Ah/km, a z mojo poklicno matematiko izpred 20 let mi to ne gre. Je to mogoče? Kakšna je enačba?
Koda: |
if (flag3){ // true je, če je bilo več kot 389 impulzov - to je 100m
flag3=false;
stateSOC[indState]=(socAh*100); // zabeleži stanje SOC (*100, da ni decimalk)
if (indState < 1){
consumption=(stateSOC[indState] - stateSOC[indState+199]);
}else{
consumption=(stateSOC[indState] - stateSOC[indState-1]);
}
if (indState < 10){
consumption1km=(stateSOC[indState] - stateSOC[indState+191]);
}else{
consumption1km=(stateSOC[indState] - stateSOC[indState-10]);
}
if (indState == 200){
consumption20km=(stateSOC[indState] - stateSOC[indState -200]);
}else{
consumption20km=(stateSOC[indState] - stateSOC[indState+1]);
}
indState++; // poveča index
if (indState > 200) indState=0; //če je več kot 100, se začne prepisovati..
Serial.println( "consumption1km:" + String(consumption1km/100) + " consumption20km:" + String(consumption20km/100) + " soc:" + String(soc) + " SocAh:" + String(socAh));
Serial.println(" poraba/km: " + String(consumption/10)); // deljeno s 100 da dobim Ah/100m x 10 da so kilometri, kar je isto kot deljeno z 10
} |
lp
Uroš _________________ Elektronika za hobi |
|
Nazaj na vrh |
|
|
grega09 Član
Pridružen-a: Pet 24 Okt 2014 11:17 Prispevkov: 392 Aktiv.: 3.39
|
Objavljeno: Pon Feb 24, 2020 11:42 pm Naslov sporočila: |
|
|
A že imaš kaj podatkov kakšna je povprečna poraba nekega tipa avtomobila? |
|
Nazaj na vrh |
|
|
Peter123 Član
Pridružen-a: Tor 13 Jan 2009 15:34 Prispevkov: 1366 Aktiv.: 7.35 Kraj: Lj.
|
Objavljeno: Tor Feb 25, 2020 9:02 am Naslov sporočila: |
|
|
Za podatek Ah/km bi bil postopek lahko (mogoče je kak drug bolj primeren):
-A -podatek o toku v nekem določenem času
-h -čas merjenja toka in poti (v bistvu periodičen interval, naprimer kak interupt na 1min ali pač kaj poljubnega)
-km -koliko km je bilo prevoženih v časovnem intervalu.
Primer za časovni interval 1min:
Meriš tok na 1s (lahko je tudi povprečen tok v tej 1s) to izvajaš 60x kar ustreza 1min.
Podatek o toku z vsako meritvijo sešteješ:
I = Iread + I
Podatek nato zdeliš z 60 s tem dobiš podatek o povprečnem toku v 1min.
Iz tega lahko izračunaš (cca) Ah: Povprečen tok v 1min pomnožiš z 60 (ker ima h 60 min). S tem si dobil podatek Ah. v tem primeru bi si lahko prišparal deljenje s 60 (ampak to ni tako pomembno).
Da izračunaš Ah na km moraš pa vedt koliko km si prevozil v istem časovnem intervalu. pazi da bo dobljeni podatek v km! In to številko moraš deliti/množiti z Ah. |
|
Nazaj na vrh |
|
|
bostjang Član
Pridružen-a: Tor 03 Jan 2006 15:29 Prispevkov: 3173 Aktiv.: 14.25 Kraj: Postojna
|
Objavljeno: Sre Feb 26, 2020 9:52 am Naslov sporočila: |
|
|
malci je napisal/a: |
Predvidevam, da bi se dalo iz hitrosti (npr Km/h) in toka (A) izračunati tudi Ah/km, a z mojo poklicno matematiko izpred 20 let mi to ne gre. Je to mogoče? Kakšna je enačba? |
Samo enote, ki si jih omenil poglej, pa boš videl, da moraš deliti, da boš dobil Ah/km. |
|
Nazaj na vrh |
|
|
malci Član
Pridružen-a: Sob 15 Sep 2007 21:05 Prispevkov: 792 Aktiv.: 3.92 Kraj: Polhov Gradec
|
Objavljeno: Sre Feb 26, 2020 11:31 am Naslov sporočila: |
|
|
.
Hvala Boštjan, da si mi odprl oči.Saj se mi je zdelo, da se da, ker ni bilo nobene nove enote, a sem kompliciral okrog in okrog
lp _________________ Elektronika za hobi |
|
Nazaj na vrh |
|
|
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 69 dni
Powered by phpBB © 2001, 2005 phpBB Group
|