Re: Jednoduchý měřák

Pavel Hudecek edizon na seznam.cz
Sobota Červen 11 14:58:19 CEST 2016


To bude nějaké nedorozumění.

Z přerušení máme dvě čísla:
součet součinů, dejme tomu volatile uint64 pSum
počet součinů, dejme tomu volatile uint32 pCnt

Protože by při zpracování mohlo nastat přerušení od AD, zakážeme přerušení, provedeme výpočty a přerušení ihned povolíme (nevím, jak se to dělá/jmenuje na tomto MCU):
zakazatInt();
pTmp = pSum/(uint64)pCnt;
pSum=0; pCnt=0;
povolitInt();

Nyní spočítáme výkon a energii:
p = (float)pTmp * epCalConst;
E+= p/3600.0; // pokud to děláme 1x za s a chceme Wh

přičemž eeprom float epCalConst je konstanta pro kalibraci výkonu a obsahuje vše potřebné k tomu, aby se z průměrného součinu hodnot těch dvou kanálů ADC stal průměrný výkon ve W, případně pokud ho nechceme k ničemu použít, může tam být i 1/3600, nebo něco jiného abychom z periody zpracování dostali hodiny. Může tam být i 1/renormalizace, když při obsluze int od AD kromě násobení AD1*AD2 ještě např. shiftujeme, aby součin nebyl moc velký. Tzn. aby se jich do pSum vešlo dost a aby byla dostatečná přesnost.

Protože přerušení bylo zakázáno mnohem kratší dobu než měřící cyklus, nic se mezitím nemohlo ztratit. První nová data se občas započítají třeba o 100 ns později, když přerušení kvůli zákazu nastane opožděně. (Předpokládám, že řadič přerušení není debilní a přerušení v době zákazu se neztratí, ale nastane ihned po povolení)

Protože ve výpočtu nefiguruje perioda měření, může AD běžet jak nejrychleji umí a je nám jedno kolik to je. Jen musíme mít jistotu, že pSum nepřeteče (viz renormalizace).

(tedy takhle bych to dělal na 8bitovém AVR při 1-16 MHz, pro 32b na stovkách MHz to bude ještě snazší, např. v přerušení možná půjde použít float a odpadne renormalizace)

PH

From: Michal Grunt 
Sent: Saturday, June 11, 2016 1:19 PM
To: HW-news 
Subject: RE: Jednoduchý měřák

Asi by to taky takto šlo. Ale to přijdu o část dat, když bude časovač nebo přerušení zastavené a budu se věnovat displeji, že? Teda ne že by to bylo zásadní, ale jestli to myslím tak jak to myslíte vy.

--------------------------------------------------------------------------------
Od:Pavel Hudecek
Odesláno:‎10. ‎6. ‎2016 16:48
Komu:HW-news
Předmět:Re: Jednoduchý měřák


Nevím jak rychlý je ten procesor, jestli to přerušení tahle nebude trvat moc 
dlouho.

Já bych v něm jen vynásobil ty dvě hodnoty, výsledek přičetl do nějaké 
proměnné a inkrementoval nějaký čítač vzorků.

V rámci zobrazování bych pak jednou za čas (např. 1 s) zakázal přerušení, tu 
proměnnou vydělil počtem vzorků, výsledek vynásobil kalibrační konstantou, 
aby vznikly W. Obě původní hodnoty vynulovat, povolit přerušení. Zůstal nám 
průměrný výkon ve W za poslední 1 s, tedy taky energie v J, kterou lze někam 
připočítat a při zobrazování třeba vydělit 3,6M, aby z toho byly např. kWh.

PH

-----Původní zpráva----- 
From: Michal Grunt
Zdravím, potřeboval bych tedy zkontrolovat zda mám u STM32F103 dobře
nastavený ADC. Záměr je následující:
Je použit ADC1 a dva kanály (PA0, PA1). Na ADC je nastaven trigr
časovač TIM3 (nyní 1hz, aby to šlo sledovat i okem) a DMA v circle
mode.

Potřebuji vzorkovat určitou frekvencí (napětí a proud) a tedy znát i
přesně interval mezi měřením a z toho vypočítat Wh. Jak je to
nastaveno nyní tak to funguje (při tom 1hz), ale je otázka jestli je
toto dobré řešení a zda když změním vzorkování třeba na 10khz a
upravím vzoreček pro výpočet tak zda to bude fungovat.

http://pastebin.com/f8y9jEuh
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20160611/105d784d/attachment.html>


Další informace o konferenci Hw-list