Diskuze - danyk.cz

Vlákno z kategorie: Hlavní diskuze
Celkem 18 odpovědí.


19.02.2020 (17:19:01) K # IP X
deny hoch obalka :
Když už jsme u těch STM :
Jak co nejpřesněji měřit frekvenci ? Přesnost na 0,1Hz. Opakovatelnost v 0,5Hz.
Frekvence v rozsahu 10kHz až 30kHz. Střída přesně 50%. V jeden okamžik potřebuji změřit 2, 4 nebo 8 kanálů.

Má vize :
Frekvenci přivedu na kanál Timeru v módu Input Capture, detekce náběžné hrany (třeba). Podle dvou hran dopočtu frekvenci.

Existuje nějaká kombinace timerů nebo jiná metoda, čímž by se dalo dosáhnout vyšší přesnosti ? Multiplexování není z časových důvodů možné.

CPU taktován z krystalu.
19.02.2020 (21:01:01)  # IP X
VroutekB:
Použij ETR mód a hradluj časovač jiným, který udělá časovou základnu.
20.02.2020 (08:50:12)  # IP X
deny hoch obalka :
Problém je, že pak budu potřebovat co kanál, to timer s ETR. U dvou kanálů asi problém není, u 4 ještě OK, ale co s 8 ?
22.02.2020 (00:07:33)  # IP X
VroutekB:
Tak tam dej CPLD nebo FPGA a přestaň frflat, když to sám víš dobře.
Abys změřil 30kHz s rozlišením 0.1Hz metodou měření periody, musel by ti ten čítač běžet asi na 10GHz. Nebo už mi to večer nemyslí a počítám to blbě?
Rozdíl periody pro 30000Hz a 30000.1Hz je totiž jen 111ps.
A pokud nechceš mít dobu hradlování 10 sekund pro rozlišení 0.1Hz, musíš na to nějakou ještě fikanější fintou.
Opět, pokud chceš mnohokanál čítač, tak je na to vhodný vzít aspoň nějaký to CPLD.
22.02.2020 (00:29:04)  # IP X
VroutekB:
Můžeš to udělat třeba tak, že spočteš počet period během 1s (zvolená hradlovací doba) a podělíš to časem přesně mezi první náběžnou hranou signálu spouštějícím hradlování až po první náběžnou hranu po spončení hradlovacího intervalu.
Pak na 30kHz při 1s hradlování a 48MHz reference máš rozlišení <1mHz. (rozlišení bude samozřejmě tím větší, čím menší bude měřený kmitočet, frozlis = fmeas/freference)
22.02.2020 (02:44:11)  # IP X
8-bit obalka (web) :
To už jsme tu kdysi řešili, viz https://www.invidio.us/watch?v=cgZ3r0o-hfY **02
Prostě stačí změřit dobu od jedné hrany k další co přijde cca o 1 s později a spočítat počet period mezi tím. Na víc kanálů asi bude nejlepší použít procesor s dostatečně velkým polem časovačů. Na rychlosti procesoru při požadavku na přesnost 0,1 Hz nezáleží, to splní i ta nejpomalejší lemra. CPLD nedoporučuju, muselo by být na těch 8 kanálů docela macaté a tím pádem drahé.
23.02.2020 (12:20:57)  # IP X
deny hoch obalka :
Děkuji za rady, chlapi.
Aby toho nebylo málo, musím frekvenci měřit pouze v čase 200ms až 5ms. Zařízení funguje následovně : procesor sepne výstup do čidla, čidlo vrátí frekvenci, procesor frekvenci změří a čidlo opět odepne. Toto se opakuje v frekvenci 5-200Hz (prostor pro měření je tudíž 200ms až 5ms).
23.02.2020 (22:57:05)  # IP X
StandaM (web) :
Mno, tak na to asi budes potrebovat rozliseni mereni pod 50ns. Hodne stesti s osmi kanaly. :) CPLD asi bez sance - bylo by moc velky. To tak mozna nejakej mini FPGA.
24.02.2020 (17:15:59)  # IP X
deny hoch obalka :
Na druhou stranu při použití více kanálů se dá použít stejného spínání čidla, takže je jen jeden výstup z procesoru.

Můj nápad :
- vzít nějaký rychlejší procesor, třeba STM32F429
- Na jednom časovači vytvořit PWM o frekvenci od 5Hz do 200Hz
- ve stejný okamžik náběžné hrany spustit další časovač pro měření času
- nastavit GPIO jako externí přerušení a počítat náběžné hrany. Tím by se vyřešila i otázka více kanálů
- vypočítat frekvenci.

Jen mi uniká, jak to bude s přesností, nevím jak to spočítat. Když mi procesor pojede na 168MHz, celkem přesně by se měřil čas. Co myslíte ? Nebo jiná cesta než FPGA není ?
24.02.2020 (18:56:57)  # IP X
StandaM (web) :
f_clock > f_meas/(T_int * f_resol)?
24.02.2020 (19:28:57)  # IP X
8-bit obalka (web) :
Ježiši kriste, vždyť na tom snad vůbec není co řešit. Jakou PWM? Myslel jsem, že chceš měřit frekvenci, ne? Nepotřebuješ PWM, potřebuješ jenom pro každý kanál jeden capture časovač. Normálně spusť 8 časovačů a nech je generovat input capture interrupt. K tomu ještě budeš potřebovat jeden co ti odpočítá těch 5 ms nebo kolik (ten negeneruje interrupt). Časovače se buď můžou resetovat nebo ne, je to jedno.
- Pokud ne, tak si v prvním interruptu poznamenej čas a v každém dalším inkrementuj počet period. Jak nastane další capture interrupt a už doběhl ten 5ms časovač, dostaneš dT (5 ms a něco) a celkový počet period;
- nebo pokud se mají resetovat při capture eventu (třeba pokud by to jinak mohlo přetéct), tak 1. capture interrupt ignoruj a v každém dalším inkrementuj počet period a přičítej dobu co zaznamenal časovač k celkové změřené době. Až doběhne 5 ms, budeš mít ve 2 registrech počet period a čas. Nebo alternativně můžeš změřenou dobu v každém interruptu průměrovat, pak to bude míň háklivé na jitter.

Jinak není důležitá frekvence jádra, ale frekvence periferií, tj. max. f jakou může počítat ten časovač.
24.02.2020 (19:34:40)  # IP X
8-bit obalka (web) :
A nebo oprava - ta první možnost s neresetujícím se časovačem nepotřebuje 8 časovačů ale jen 8 capture registrů. Tj. třeba na RXku 2 časovače, kolik je jich v časovači STMka nevím.
24.02.2020 (21:45:41)  # IP X
deny hoch obalka :
Děkuji, 8-bit.
Jestli jsem to pochopil správně, pokud ne - omlouvám se.

- nastavím časovač do módu Input Capture.
- sepnu výstup procesoru do čidla
- detekuji hrany (periody)
- při každé hraně zvýším počet period o 1
- po doběhnutí 5ms mám v registru počet zaznamenaných period a čas

STM má Advance Timery, které mají rovněž 4 Capture registry.

Ještě mě napadlo, nebylo by lepší počítat každou hranu ? (vzestupnou i sestupnou) Kvůli přesnosti nebo to nepomůže ?
24.02.2020 (23:10:52)  # IP X
8-bit obalka (web) :
Asi jo, jenom pro upřesnění radši dodám hrany detekuje ten timer, po každé detekci zapíše aktuální hodnotu timeru do capture registru a vygeneruje capture interrupt. Takže není zapotřebí žádný další interrupt vstup. Po uplynutí 5 ms čekej ještě na jeden další capture interrupt abys změřil celý počet period. Nejlepší bude v capture interruptu programově testovat zda těch 5 ms už uběhlo nebo ne. Takže T0 sis poznamenal v prvním interruptu, pak jsi inkrementoval registr s počtem period (třeba n) a teď máš v capture registru T1. Výsledná frekvence je Ftmr * n / (T1 - T0).

Počítat náběžnou i sestupnou hranu ti nijak nepomůže ani kdyby byla střída přesně 50 %. Přesnost této metody nezáleží na měřené frekvenci.
24.02.2020 (23:11:06)  # IP X
VroutekB:
Nejsem si jistej, jestli by to nepomohlo, podle mě ne, protože jediný, čeho tím dosáhneš, je efektivně zdvojnásobení měřenýho kmitočtu.
A stejně ti tahle metoda měření je na hovno, protože na každej měřenej vstup kmitočtu potřebuješ jeden dedikovanej ETR vstup (počítání period) a jeden (klidně společnej) timer na input capture pro měření času první a poslední hranu v hradlovacím intervalu.
Takže pokud nepotřebuješ měřit 8 vstupů naráz, tak si tam klidně zvenku dej na ETR externí 8:1 multiplexer, nebo 4:2, pokud máš dva ETR vstupy a chceš měřit aspoň po dvojicích současně.

CPLD velký je co? 240 LE stojí asi 30 korun (stovku od oficiálního distributora), 570 LE stojí asi 60 korun (nebo 130 kroun od oficiálního, v kusovce).
Hrubý odhad náročnosti je 500+ LE. Do toho většího CPLD by se to vešlo, tak akorát.
Ale záleží velmi na specifikách toho, co by to CPLD přesně mělo dělat.
24.02.2020 (23:13:37)  # IP X
VroutekB:
8bit: Tak na 8 souběžně běžících input capture interruptů každý s frekvencí 30kHz hezky zapomeň, ain't happening. Rozhodně ne na nějakém línějším ARMu.
24.02.2020 (23:24:22)  # IP X
8-bit obalka (web) :
Tak já jsem počítal že v nejhorším případě budeš mít na každý interrupt cca 400 instrukcí při 100MHz frekvenci jádra. To by se snad stihnout dalo když ten procesor nebude dělat skoro nic, tj. inkrementace, test zda to je první interrupt a zápis capture registru do paměti a test jestli uběhlo 5 ms.
25.02.2020 (08:51:35)  # IP X
VroutekB:
Je to pěkná kriplovina, i kdyby se to stíhalo dělat.
Máš tam DMA a další zavazbitelné timery, takže vono by to teoreticky vzato mělo jít hravě udělat i samočinné jen s pár interrupty na celé měření.
Každopádně, když nad tím teď přemýšlím, já to snad zkusím ve volné chvíli promyslet, ono by to koneckonců mohlo jít udělat docela hezky, TIMerů je na těch STčkách naštěstí po kokot.
25.02.2020 (14:03:39)  # IP X
8-bit obalka (web) :
Jo tak určitě by to ještě šlo optimalizovat aby metoda sežrala méně strojového času aspoň v průměhu měření, ale snažil jsem se popsat něco co bude blbuvzdorné a nezávislé na použitém HW. Pokud je v STMku něco jako Event link controller tak bys třeba mohl pomocí 8 dalších časovačů počítat capture interrupt requesty.
Přezdívka:
Heslo:
Text: