<HTML><HEAD>
<META content="text/html; charset=utf-8" http-equiv=Content-Type></HEAD>
<BODY dir=ltr>
<DIV dir=ltr>
<DIV style="FONT-SIZE: 12pt; FONT-FAMILY: 'Calibri'; COLOR: #000000">
<DIV>To bude nějaké nedorozumění.</DIV>
<DIV> </DIV>
<DIV>Z přerušení máme dvě čísla:</DIV>
<DIV>součet součinů, dejme tomu volatile uint64 pSum</DIV>
<DIV>počet součinů, dejme tomu volatile uint32 pCnt</DIV>
<DIV> </DIV>
<DIV>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):</DIV>
<DIV>zakazatInt();</DIV>
<DIV>pTmp = pSum/(uint64)pCnt;</DIV>
<DIV>pSum=0; pCnt=0;</DIV>
<DIV>povolitInt();</DIV>
<DIV
style='FONT-SIZE: small; TEXT-DECORATION: none; FONT-FAMILY: "Calibri"; FONT-WEIGHT: normal; COLOR: #000000; FONT-STYLE: normal; DISPLAY: inline'>
<DIV style="FONT: 10pt tahoma">
<DIV><FONT size=3 face=Calibri></FONT> </DIV>
<DIV><FONT size=3 face=Calibri>Nyní spočítáme výkon a energii:</FONT></DIV>
<DIV><FONT size=3 face=Calibri>p = (float)pTmp * epCalConst;</FONT></DIV>
<DIV><FONT size=3 face=Calibri>E+= p/3600.0; // pokud to děláme 1x za s a chceme
Wh</FONT></DIV>
<DIV><FONT size=3 face=Calibri></FONT> </DIV>
<DIV><FONT size=3 face=Calibri>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.</FONT></DIV>
<DIV><FONT size=3 face=Calibri></FONT> </DIV>
<DIV><FONT size=3 face=Calibri>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í)</FONT></DIV>
<DIV><FONT size=3 face=Calibri></FONT> </DIV>
<DIV><FONT size=3 face=Calibri>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).</FONT></DIV>
<DIV><FONT size=3 face=Calibri></FONT> </DIV>
<DIV><FONT size=3 face=Calibri>(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)</FONT></DIV>
<DIV><FONT size=3 face=Calibri></FONT> </DIV>
<DIV><FONT size=3 face=Calibri>PH</FONT></DIV>
<DIV><FONT size=3 face=Calibri></FONT> </DIV>
<DIV style="BACKGROUND: #f5f5f5">
<DIV style="font-color: black"><B>From:</B> <A title=michal.grunt@gmail.com
href="mailto:michal.grunt@gmail.com">Michal Grunt</A> </DIV>
<DIV><B>Sent:</B> Saturday, June 11, 2016 1:19 PM</DIV>
<DIV><B>To:</B> <A title=hw-list@list.hw.cz
href="mailto:hw-list@list.hw.cz">HW-news</A> </DIV>
<DIV><B>Subject:</B> RE: Jednoduchý měřák</DIV></DIV></DIV>
<DIV> </DIV></DIV>
<DIV
style='FONT-SIZE: small; TEXT-DECORATION: none; FONT-FAMILY: "Calibri"; FONT-WEIGHT: normal; COLOR: #000000; FONT-STYLE: normal; DISPLAY: inline'>
<DIV>
<DIV style="FONT-SIZE: 11pt; FONT-FAMILY: calibri,sans-serif">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.</DIV></DIV>
<DIV dir=ltr>
<HR>
<SPAN
style="FONT-SIZE: 11pt; FONT-FAMILY: calibri,sans-serif; FONT-WEIGHT: bold">Od:</SPAN><SPAN
style="FONT-SIZE: 11pt; FONT-FAMILY: calibri,sans-serif"><A
href="mailto:edizon@seznam.cz">Pavel Hudecek</A></SPAN><BR><SPAN
style="FONT-SIZE: 11pt; FONT-FAMILY: calibri,sans-serif; FONT-WEIGHT: bold">Odesláno:</SPAN><SPAN
style="FONT-SIZE: 11pt; FONT-FAMILY: calibri,sans-serif">10. 6. 2016
16:48</SPAN><BR><SPAN
style="FONT-SIZE: 11pt; FONT-FAMILY: calibri,sans-serif; FONT-WEIGHT: bold">Komu:</SPAN><SPAN
style="FONT-SIZE: 11pt; FONT-FAMILY: calibri,sans-serif"><A
href="mailto:hw-list@list.hw.cz">HW-news</A></SPAN><BR><SPAN
style="FONT-SIZE: 11pt; FONT-FAMILY: calibri,sans-serif; FONT-WEIGHT: bold">Předmět:</SPAN><SPAN
style="FONT-SIZE: 11pt; FONT-FAMILY: calibri,sans-serif">Re: Jednoduchý
měřák</SPAN><BR><BR></DIV>Nevím jak rychlý je ten procesor, jestli to přerušení
tahle nebude trvat moc <BR>dlouho.<BR><BR>Já bych v něm jen vynásobil ty dvě
hodnoty, výsledek přičetl do nějaké <BR>proměnné a inkrementoval nějaký čítač
vzorků.<BR><BR>V rámci zobrazování bych pak jednou za čas (např. 1 s) zakázal
přerušení, tu <BR>proměnnou vydělil počtem vzorků, výsledek vynásobil kalibrační
konstantou, <BR>aby vznikly W. Obě původní hodnoty vynulovat, povolit přerušení.
Zůstal nám <BR>průměrný výkon ve W za poslední 1 s, tedy taky energie v J,
kterou lze někam <BR>připočítat a při zobrazování třeba vydělit 3,6M, aby z toho
byly např. kWh.<BR><BR>PH<BR><BR>-----Původní zpráva----- <BR>From: Michal
Grunt<BR>Zdravím, potřeboval bych tedy zkontrolovat zda mám u STM32F103
dobře<BR>nastavený ADC. Záměr je následující:<BR>Je použit ADC1 a dva kanály
(PA0, PA1). Na ADC je nastaven trigr<BR>časovač TIM3 (nyní 1hz, aby to šlo
sledovat i okem) a DMA v circle<BR>mode.<BR><BR>Potřebuji vzorkovat určitou
frekvencí (napětí a proud) a tedy znát i<BR>přesně interval mezi měřením a z
toho vypočítat Wh. Jak je to<BR>nastaveno nyní tak to funguje (při tom 1hz), ale
je otázka jestli je<BR>toto dobré řešení a zda když změním vzorkování třeba na
10khz a<BR>upravím vzoreček pro výpočet tak zda to bude
fungovat.<BR><BR>http://pastebin.com/f8y9jEuh</DIV></DIV></DIV></BODY></HTML>