Obsah:

Jak měřit vysokou frekvenci a pracovní cyklus současně pomocí mikrokontroléru: 4 kroky
Jak měřit vysokou frekvenci a pracovní cyklus současně pomocí mikrokontroléru: 4 kroky

Video: Jak měřit vysokou frekvenci a pracovní cyklus současně pomocí mikrokontroléru: 4 kroky

Video: Jak měřit vysokou frekvenci a pracovní cyklus současně pomocí mikrokontroléru: 4 kroky
Video: Současné výzvy strojového učení a AI - Tomáš Mikolov || Seminář MPN 26.2.2020 2024, Listopad
Anonim
Jak měřit vysokofrekvenční a pracovní cyklus současně pomocí mikrokontroléru
Jak měřit vysokofrekvenční a pracovní cyklus současně pomocí mikrokontroléru
Jak měřit vysokofrekvenční a pracovní cyklus současně pomocí mikrokontroléru
Jak měřit vysokofrekvenční a pracovní cyklus současně pomocí mikrokontroléru
Jak měřit vysokofrekvenční a pracovní cyklus současně pomocí mikrokontroléru
Jak měřit vysokofrekvenční a pracovní cyklus současně pomocí mikrokontroléru

Vím, co si myslíte: "Co? Existuje mnoho instrukcí, jak pomocí mikrokontrolérů měřit frekvenci signálu. Zívnutí." Ale počkejte, v tomto je novinka: popisuji způsob měření frekvencí mnohem vyšších, než unese mikrokontrolér (MCU), a pracovní cyklus signálu - vše současně!

Frekvenční rozsah zařízení se pohybuje od ~ 43 Hz do ~ 450 kHz, zatímco pracovní cyklus se pohybuje od 1% do 99%.

Vysvětlím část „může nést“: MCU měří periodu signálu čtvercové vlny T sledováním času mezi dvěma následujícími přechodovými událostmi. Například nízké až vysoké napětí přeskočí na jeden ze svých I/O pinů. Dělá to tak, že počítá počet pulzů vlastních vnitřních hodin. Naivně by se horní limit pro měřené frekvence měl řídit vzorkovací větou Nyqvist-Shannon; tj. zhruba by se rovnala polovině hodinové frekvence MCU. Ve skutečnosti je limit mnohem, mnohem nižší, protože MCU musí spouštět kód, aby zvládl přerušení, ukládal proměnné, prováděl aritmetické operace, zobrazoval výsledky atd. V mých experimentech s 48 MHz MCU byl minimální počet hodinových cyklů mezi měřitelnými přechody asi 106. Horní mez měřitelného frekvenčního rozsahu by tedy v tomto případě byla 48 000 /212 /2 = 226,4 kHz.

Zatímco MCU měří periodu signálu, může také určit jeho šířku impulsu, P: čas zbývajícího vysokého napětí signálu. Jinými slovy, čas mezi přechody od nízkých k vysokým a od vysokých k nízkým. Pracovní cyklus signálu je pak definován jako následující procento:

Duty = 100% * P / T

Stejně jako v případě frekvence existuje praktická hranice šířky impulsu. Při použití výše uvedeného příkladu by 106 hodinových cyklů omezilo šířku impulsu na ne méně než 2,21 mikrosekundy. Nebo ne méně než 50% při 226,4 kHz.

Jedním ze způsobů, jak zvýšit horní frekvenční limit signálů čtvercových vln, je použití digitálních děličů, které využívají klopné obvody. Dělením vstupní frekvence o n prodloužíme měřitelný horní rozsah nkrát. To je skvělá zpráva, digitální děliče mají jednu zásadní chybu: rozdělený signál ztrácí informace o šířce pulzu (a pracovním cyklu)! Vzhledem ke způsobu, jakým děliče fungují, má jejich výkon vždy 50% pracovní cyklus. Bummer…

Na následujících stránkách však ukážu, jak digitálně rozdělit frekvenci a zachovat původní šířku impulsu, což mi umožňuje měřit signály daleko za limity stanovené přímým počítáním.

Krok 1: Digitální frekvenční dělení

Digitální frekvenční dělení
Digitální frekvenční dělení
Digitální frekvenční dělení
Digitální frekvenční dělení
Digitální frekvenční dělení
Digitální frekvenční dělení

Tradiční digitální děliče frekvence používají klopné obvody; tento tutoriál pěkně vysvětluje principy konstrukce děličů pomocí standardních JK žabek. To řeší problém příliš vysokých vstupních frekvencí pro MCU, ale má jednu velkou nevýhodu: dělený signál má 50% pracovní cyklus bez ohledu na povinnost vstupního signálu! Chcete -li zjistit, proč tomu tak je, podívejte se na první dvě čísla. Původní signál s periodou T a šířkou impulsu P je přiváděn do hodinového kolíku klopného obvodu JK, zatímco jeho kolíky J a K jsou vždy drženy vysoko (první obrázek). Logika 3,3 V se předpokládá po celou dobu. Předpokládejme, že klopný obvod je spuštěn kladnou (tj. Stoupající) hranou hodin. Za těchto podmínek dochází ke změnám stavu výstupního pinu (jednotlivá „převrácení“a „propadnutí“) pokaždé, když hodinový kolík přejde z nízké na vysokou. Přechod hodin na vysoký a nízký (tj. Záporná hrana) hodin je zcela ignorován. Viz druhý obrázek. Výstupní pin Q vysílá signál, jehož perioda je dvakrát delší než původní perioda, tj. Její frekvence je poloviční. Šířka impulzu výstupu je vždy rovna T. V důsledku toho se původní šířka impulzu P ztratí.

Přidáním dalšího JK klopného obvodu v konfiguraci zobrazené na třetím obrázku se původní frekvence dělí číslem 4. Přidáním dalších klopných obvodů stejným sekvenčním způsobem se frekvence dělí následnými mocninami 2: 8, 16, 32 atd.

Problém: Jak rozdělit frekvenci čtvercové vlny při zachování její šířky pulsu?

Cílem je správně přidat do mixu JK flip-flop spuštěný s negativním okrajem. Říkejme tomu „Neg FF“; viz čtvrtý obrázek. Zde „správně“znamená, že piny J a K nového klopného obvodu jsou svázány s výstupními piny Q a Qbar děliče-4 („Pos FF“) znázorněnými na předchozím obrázku. (Zde „bar“je vodorovný pruh nad symbolem Q označujícím logickou negaci.) Chcete -li zjistit, čeho se tím dosáhne, podívejte se na funkční tabulku „Neg FF“na pátém obrázku: Negovy výstupní piny, Q a Qbar, zrcadlí stav jeho vstupních pinů, J a K, v daném pořadí. Což znamená, že zrcadlí stav Pos 'Q a Qbar. Negova klopná akce ale musí počkat na zápornou hranu původního signálu, která dorazí v čase P za kladnou hranu. Aha!

Výsledné průběhy jsou znázorněny na šestém obrázku. „Pos Q“vydává signál na 1/4 frekvenci, „Pos Qbar“je inverzní, „Neg Q“následuje za „Pos Q“posunutým o šířku impulsu P a „Neg Qbar“je jeho inverzní. Můžete ověřit, že logické AND „Pos Qbar“a „Neg Q“vytváří sled impulsů charakterizovaný původní šířkou impulsu P a 1/4 frekvence. Bingo!

Zpočátku jsem pro napájení MCU používal přesně tento výstupní signál. Ukázalo se však, že je to velmi problematické pro velmi krátké šířky impulzů kvůli omezení 106 cyklů MCU zmíněnému v úvodu. Tento malý problém jsem vyřešil zvolením jiného výstupu: „Pos Qbar“A „Neg Qbar“. Jeden pohled na průběhy by vás měl přesvědčit, že šířka pulsu tohoto konkrétního průběhu, P ', se pohybuje mezi T a 2T místo (0, T) rozsahu pro P. P lze snadno obnovit z P':

P = 2T - P '

Krok 2: Doporučený hardware

Doporučený hardware
Doporučený hardware
Doporučený hardware
Doporučený hardware
Doporučený hardware
Doporučený hardware

Opravdu se mi líbí relativní nováček mezi elektronickými fandy: MCU Atmel SAM D21 založené na 32bitovém procesoru ARM Cortex M0+ pracujícím s taktovací frekvencí 48 MHz, mnohem vyšší než u starších Atmelů. Pro tento projekt jsem koupil:

  • Deska MCU ItsyBitsy M0 Express od společnosti Adafruit
  • Náhodou jsem měl dobíjecí LiPo baterii od Adafruit
  • Monochromatický 128x32 SPI OLED displej (uhodli jste: Adafruit)
  • Duální JK klopný obvod J74 SN74HC109 od Texas Instruments
  • Dvojitý klopný obvod JK SN74HC112 spouštěný negativním okrajem od společnosti Texas Instruments
  • Čtyřnásobný AND gate CD74AC08E od Texas Instruments
  • Čtyřnásobná brána CD74AC32E NEBO brány od společnosti Texas Instruments

Krok 3: Okruh

Okruh
Okruh
Okruh
Okruh

První obrázek ukazuje zjednodušené schéma měřiče frekvence/zatížení. Logika 3,3 V CMOS se předpokládá v celém textu. V důsledku toho musí být amplituda vstupní čtvercové vlny mezi odpovídajícím VIH úroveň (tj. 2 V) a 3,3 V. Pokud tomu tak není, musíte ji podle toho zvětšit nebo snížit. Ve většině případů by stačil jednoduchý dělič napětí. Pokud chcete navrhnout svou verzi měřiče na jiné logické úrovni, musíte použít jiný mikrořadič (MCU), baterii a displej, který pracuje na požadované úrovni. Logické brány a klopné obvody použité v tomto projektu fungují s logickými úrovněmi kdekoli mezi 2 V a 6 V a ve většině případů by měly být v pořádku.

Jak je znázorněno, ItsyBitsy MCU používá piny 9-13 ke komunikaci s displejem prostřednictvím softwarového protokolu SPI. 3V pin dodává energii do celého obvodu. Digitální vstupní pin 3 přijímá analyzovaný signál, zatímco piny 2 a 4 ovládají zdroj signálu: buď přímý signál procházející bránou AND3 (nízké vstupní frekvence), nebo signál dělený 4 branou AND4 (vysoké vstupní frekvence), jak je popsáno v kroku 2 Kód, diskutovaný v dalším kroku, automaticky detekuje příchozí frekvenční rozsah a vhodně přepne zdroj signálu.

Schéma neukazuje skutečnou složitost připojení digitálních čipů. Druhý obrázek ukazuje, jak by projekt vypadal na prkénku. Vstupní signál přichází červeným vodičem na pin 2CLK dvojitého kladného hranového klopného obvodu. UPOZORNĚNÍ: Normálně by měly být všechny kolíky J a K tohoto klopného obvodu drženy vysoko, ale zejména SN74HC109 má místo toho pin Kbar - převrácený K pin. Tento pin tedy musí být uzemněn! První klopný obvod se záporným okrajem v SN74HC112 má svůj pin 1K a 1J připojený k pinům 1Q a 1Qbar SN74HC109. Druhý klopný obvod v SN74HC112 je nepoužitý a jeho vstupní piny (2K, 2J, 2CLRbar) jsou uzemněny. Všechny ostatní extra piny PREbar (přednastavené) a CLRbar (čisté) ve všech klopných obvodech musí být připojeny k logické výšce. Nepoužité hodinové a výstupní piny zůstanou nezapojeny. Podobně jsou nepoužité vstupní piny ve všech branách uzemněny, zatímco nepoužité výstupní piny jsou ponechány nezapojené. Jak jsem diskutoval ve svém instruktu "Neviditelný zabiják telefonního prstenu", uzemnění nepoužívaných vstupních pinů logických čipů eliminuje náhodné oscilace a šetří energii baterie.

Krok 4: Kód a měření nízkých frekvencí

Veškerá akce se přirozeně děje v níže uvedeném kódu. Když vstup přicházející na pin 3 přepne z digitálního nízkého na vysoký, MCU začne počítat impulsy svých interních 48 MHz hodin. Zaznamenává okamžik přechodu z vysokého na nízký a pokračuje v počítání až do dalšího přepnutí z nejnižší na nejvyšší, kdy celý proces znovu restartuje. První počet představuje šířku impulsu, zatímco celý počet představuje periodu signálu. A v tom je celé tajemství.

CPU si tyto přechody všimne prostřednictvím hardwarových přerušení. SAMD21 má několik hodin; můj kód používá TC3 one. Zpočátku jsem začal tím, že jsem si přečetl vyztužení datového listu M0 a vynaložil spoustu úsilí při kódování obsluhy přerušení, ale brzy jsem v příspěvcích na fóru Arduino objevil velmi podobný kód od uživatelů electro_95, MartinL a Rucus, jejichž přínos je řádně uznáno. Začlenil jsem a upravil jejich kombinovaný kód do mého; ušetří mi spoustu času!

Jak jsem již zmínil, rozlišení signálu je omezeno ~ 106 cykly CPU pro spuštění kódu mezi přerušeními. Digitální dělení se zachováním šířky pulsu se stará o vysoké frekvence. Nízké frekvence naopak představují další výzvu: protože čítač hodin TC3 je 16 bitů dlouhý, přetéká po překročení limitu 65, 536 počítání. Tuto situaci lze zvládnout přidáním přetečení přerušení, ale zvolili jiné řešení: TC3 může místo hardwarového 48 MHz použít přednastavené (tj. Softwarově dělené) hodiny CPU. Pokud se tedy perioda signálu blíží limitu přetečení, kód může instruovat TC3, aby pro další období použil 24 MHz počty a, voilá, čítač klesne pod 32 768 počtů. U ještě nižších frekvencí lze TC3 instruovat, aby počítal impulsy 12 MHz atd. Příslušný předzesilovač se automaticky určí na základě frekvence signálu s hysterezí, aby se čítač TC3 udržel v limitu přetečení. V důsledku toho je spodní konec rozsahu zařízení asi 43 Hz.

Vítáme vás, když kód rozšíříte a použijete ve svém projektu, ale při publikování výsledků prosím uveďte jeho zdroj.

Odkaz na kód.

Doporučuje: