Re: Vodoměr

Miroslav Mraz mrazik na volny.cz
Úterý Srpen 9 18:39:00 CEST 2016


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
>


Další informace o konferenci Hw-list