RE: Vodoměr

Miroslav Draxal evik na volny.cz
Úterý Srpen 9 20:02:04 CEST 2016


Tady narážíme na mechanické vlastnosti vodoměru. Mám k dispozici 7 vodoměrů
Kaden a zkouškou jsme zjistil, že ten nejhorší se "ještě točí" při délce
jednoho impulzu 2.72s. Zde si nedělám žádné iluze o tom, že je to nějaký
přesný naměřený objem proteklé vody. Pouze to indikuje nějaký průtok. Takže
vše co je nad 3s/imp, mám jako nulový průtok. 

-----Original Message-----
From: Hw-list [mailto:hw-list-bounces na list.hw.cz] On Behalf Of Miroslav Mraz
Sent: Tuesday, August 09, 2016 6:39 PM
To: HW-news
Subject: Re: Vodoměr

Počítat průtok tím, že dělíte časem který uplyne mezi dvěma impulsy je sice
poměrně přesné, ale jen v době příchodu impulsu. Ad absurdum nulový průtok
získáte přesně až po nekonečně dlouhé době. Co s tím ?
Zvolit konstantní dobu měření, tj. měření opakovat s konstantní vzorkovací
frekvencí a počítat vždy v této periodě počet pulsů. No a pak to
zprůměrovat. To, že budete mít v periodě obvykle jen 0 nebo 1, vůbec nevadí
- nakonec sigma-delta převodníky fungují podobně. Klíčová je v tomto případě
filtrace. Není nutné používat FIR typu sinc, stačí obyčejný klouzavý průměr
s exponenciálním zapomínáním, což se dá napsat jako IIR filtr 1. řádu. To se
dá počítat v aritmetice s pevnou řádovou čárkou (tedy v celých číslech) a
není to žádná velká věda ani to není tak náročné na prostředky
(nepotřebujete dělení).
Násobení kalibrační konstantou zatím nebudeme řešit.
Jinak si to můžete představit analogově - pokud jste někdy stavěl analogový
otáčkoměr, pak vstupní pulsy zkrátíte (prodloužíte) na konstantní délku - to
jsou ty 0 a 1 na vstupu - a za to připojíte integrační RC článek - to je ten
IIR filtr - klouzavý průměr s exponenciálním zapomínáním. A na konci už
můžete mít analogový budík. On sice neměří úplně přesně, ale dává v reálném
čase údaje se kterými se už dá něco dělat. Přesně v každém čase to stejně
mít nemůžete, protože co se děje mezi impulsy, to se nemáte jak nedozvědět.

Mrazík

Dne 9.8.2016 v 17:35 Miroslav Draxal napsal(a):
> Mam (zjednodušeně) vodoměr Kaden, dvě teplotní čidla ds18b20, pic 
> 18f2620,
> XC8 PRO (koupený). Vodoměr jsem rozebral, tvoří ho dvě části spojené s 
> magnetickou spojkou. Do suché části, hned vedle druhé poloviny 
> magnetické spojky jsem umístil jazýčkové relé (v současné době je tam 
> už hal.sonda, protože na jeden litr to má moc impulzu, tudíž nevěřím v 
> dlouhou životnost jazýčkového relé). Nejprve potřebuji změřit průtok 
> kapaliny a pak z rozdílů teplot vypočítat množství předaného tepla. 
> Přesnost? Aby to co se odečetlo na vodoměru, aby sedělo s tím, co se 
> spočítalo v proc.  Ten průtokoměr s indikací úniku vody (samozřejmě, 
> záleží na definování, co je únik a co ne), to je jen vedlejší, rychlý
produkt pro souseda.
>
> A teď původní otázka?
> "Potřebuji do jednočipu nacpat přepočet průtoku, mám vodoměr, z 
> kterého leze
> 60.75 impulzu na 1l průtoku. Nenapadá vás nějaká zkratka 
> (optimalizace), jak to přepočítat?
>
> Měřím dobu, dvou po sobě náběžných hran, ale pak jsem nějak v koncích. 
> Mám volno cca 0,5 paměti, a žádné složité výpočty se mi tam nevejdou."
>
> Ptal jsem se, jestli někoho nenapadá nějaká zkratka či optimalizace.
> Zkratka, ne hrubá matematika. V dalších příspěvcích se probíralo cca. 
> dva, jak přepočítat impulzy na litry.
>
> Byly odpovědi ve stylu
> Ale pokud umí word, tedy 0 až 65535, pak třeba tak, že za každý impuls 
> připočtete do nějaké proměnné round(65536/60.75), t.j. 1079. Jakmile 
> nastane přetečení, přičtete 1 do počitadla litrů. Jednodušeji to snad už
nejde.
>
> Jde to tak. Ale já se ptal na zkratky či optimalizace. "Optzimalizaci" 
> na výpočet litru jsem poslal. Stačí si uvědomit, že každý čtvrtý litr 
> je celé číslo počet impulzů z vodoměru, které se vejde do charu a 
> korigovat.... Ale to už jsem sem do konve poslal i s popisem.
>
> char VodomerImpulz;
> char VodomerImpulz243;
> int Litru;
> // přišel impulz z vodoměru
> if (++VodomerImpulz == 60){
>     Litru++;
>     VodomerImpulz = 0;
> }
> if (++VodomerImpulz243 == 243) {
>     VodomerImpulz = 0;
>     VodomerImpulz243 = 0;
> }
> S wordem dobrý, tohle lepší.
>
> Tak nějak jsem doufal v to, že někoho napadne zjednodušení i pro 
> výpočet průtoku. Pak tady padla poznámka od pana Zdeňka, že jsem 
> napsal zásadní informaci , že mám volno 0,5k paměti. Pokud nepracuji 
> přímo v asm, ale v nějakém vyšším jazyce, tak mi přijde, že je to dost 
> málo. Čili, když píši, že mám pouze 0,5k, tak to znamená, že jí mám 
> málo. Takže mám Free: 576 jak to píše překladač. A zatím jsem dělení 
> long int a vyšších nepoužíval, čili překladač si zatím nezavedl 
> podprogramy (knihovny) pro dělení či násobení těchto čísel. A ty se do
zbylé paměti nevejdou.
>
> Tímto děkuji Jančurovy, který mi soukromě zaslal stručný popis jak na to.
> Jak píše, inspirace z amára 7/2016. Bohužel amáro už neodebírám, takže 
> jsem to zatím nečetl, ale podle jeho popisu, jsem zjistil, že tak 
> nějak podobně jsem to nakonec napsal.
>
> Takže mě osobně připadá, ale je to můj názor, nikomu ho nevnucuji, že 
> o jaký procesor, či co je to za aplikaci či jaká přesnost ( i když 
> tady by se dalo diskutovat), je nad rámec dotazu. Šlo mi pouze o 
> nápad, třeba jako je to načítání litrů. Jednoduché, rychlé, krátké, přesné
na každém čtvrtém litru.
> Ještě jsem ho zpřesnil korekcí na třetím litru.
>
> Fakt mi nejde o přestřelku.
> Mira
>
_______________________________________________
HW-list mailing list  -  sponsored by www.HW.cz Hw-list na list.hw.cz
http://list.hw.cz/mailman/listinfo/hw-list



Další informace o konferenci Hw-list