Taula de continguts:

Comptador de freqüències d'alta resolució: 5 passos (amb imatges)
Comptador de freqüències d'alta resolució: 5 passos (amb imatges)

Vídeo: Comptador de freqüències d'alta resolució: 5 passos (amb imatges)

Vídeo: Comptador de freqüències d'alta resolució: 5 passos (amb imatges)
Vídeo: ЗАПРЕЩЁННЫЕ ТОВАРЫ с ALIEXPRESS 2023 ШТРАФ и ТЮРЬМА ЛЕГКО! 2024, De novembre
Anonim

Aquest instructable mostra un comptador de freqüències recíproc capaç de mesurar freqüències ràpides i amb una precisió raonable. Està fabricat amb components estàndard i es pot fabricar en un cap de setmana (he trigat una mica més:-))

EDIT: El codi ja està disponible a GitLab:

gitlab.com/WilkoL/high-resolution-frequency-counter

Pas 1: recompte de freqüències de la vella escola

Compte de freqüències de la vella escola
Compte de freqüències de la vella escola
Compte de freqüències de la vella escola
Compte de freqüències de la vella escola

La forma de mesurar la freqüència d’un senyal de la vella escola és utilitzar una porta AND lògica, alimentar el senyal a mesurar en un port i un senyal amb un temps d’exactitud d’1 segon a l’altre port i comptar la sortida. Això funciona bastant bé per a senyals d’uns pocs kHz fins a GHz. Però, i si voleu mesurar un senyal de baixa freqüència amb una bona resolució? Suposem que voleu mesurar la freqüència de xarxa (aquí 50 Hz). Amb el mètode de la vella escola, veureu una constant de 50 a la pantalla si teniu sort, però és més probable que vegeu el canvi de pantalla de 49 a 50 o de 50 a 51. La resolució és d'1 Hz, i ja està. Mai veuràs 50.002 Hz tret que estiguis disposat a augmentar el temps de la porta fins a 1000 segons. Això supera els 16 minuts per a una sola mesura.

Una millor manera de mesurar senyals de baixa freqüència és mesurar-ne el període. Prenent de nou la xarxa principal com a exemple, té un període de 20 mil·lisegons. Agafeu la mateixa porta lògica AND, alimenteu-la amb, per exemple, 10 MHz (0,1 us pulsacions) i el vostre senyal a l’altre port i surt de 200000 impulsos, de manera que el període de temps és de 20000,0 uS i això es tradueix de nou a 50Hz. Quan es mesuren només 199650 polsos, la freqüència és de 50,087 Hz, això és molt millor, i és en només un segon de mesura. Malauradament, això no funciona bé amb freqüències més altes. Per exemple, ara volem mesurar 40 kHz. Amb la mateixa freqüència d'entrada de 10 MHz que la referència, ara mesurem només 250 impulsos. Quan comptem només 249 polsos, el càlcul dóna 40161 Hz i amb 251 el resultat és de 39840 Hz. No és una resolució acceptable. Per descomptat, augmentar la freqüència de referència millora els resultats, però hi ha un límit al que podeu utilitzar en un microcontrolador.

Pas 2: la manera recíproca

El camí recíproc
El camí recíproc
El camí recíproc
El camí recíproc

Una solució que funciona tant per a freqüències baixes com per a altes és un comptador de freqüències recíproc. Intentaré explicar el seu principi. Comenceu amb un temps de mesura d’aproximadament 1 segon, no ha de ser molt precís, però és un temps raonable per a una mesura. Introduïu aquest senyal d’1 Hz a un flipflop D de l’entrada D. Encara no passa res a les sortides. Connecteu el senyal que voleu mesurar a l'entrada CLOCK del flipflop D.

Tan aviat com aquest senyal passa de BAIX a ALT, la sortida del D-flipflop transfereix l’estat de l’entrada D a la sortida (Q). Aquest senyal RISING en marxa s'utilitza per començar a comptar el senyal d'entrada, així com un senyal de rellotge de referència.

Per tant, compteu DOS senyals exactament al mateix temps, el senyal que voleu mesurar i un rellotge de referència. Aquest rellotge de referència ha de tenir un valor precís i ser estable, un oscil·lador de cristall normal està bé. El valor no és molt important sempre que sigui una freqüència alta i se’n conegui bé el valor.

Passat el temps, diguem uns quants mil·lisegons, tornareu a baixar l’entrada D del flipflop D. A la següent entrada de CLOCK, la sortida Q segueix l'estat de l'entrada, però no passa res més perquè el microcontrolador està configurat per reaccionar només a un senyal RISING. Després, un cop finalitzat el temps de mesura (aproximadament 1 segon), feu que l’entrada D sigui ALTA.

De nou a la següent entrada de RELLOTGE, segueix la sortida Q i aquest senyal RISING activa el microcontrolador, aquesta vegada per acabar el recompte dels dos comptadors.

El resultat són dos nombres. El primer número és el nombre d’impulsos comptats a partir de la referència. Com coneixem la freqüència de referència, també sabem el temps que es va trigar a comptar aquests impulsos.

El segon número és el nombre de polsos del senyal d'entrada que mesurem. Com que vam començar exactament a les vores creixents d’aquest senyal, estem molt segurs del nombre de polsos d’aquest senyal d’entrada.

Ara només és un càlcul per determinar la freqüència del senyal d’entrada.

Un exemple, diguem que tenim aquests senyals i que volem mesurar l'entrada f. La referència és de 10 MHz, generada per un oscil·lador de cristall de quars. f_input = 31.416 Hz f_reference = 10000000 Hz (10 MHz), el temps de mesura és d'aprox. 1 segon

En aquest temps hem comptabilitzat 32 impulsos. Ara, un període d’aquest senyal pren 1 / 31,416 = 31830,9 uS. Així doncs, 32 períodes ens van portar 1,0185892 segons, és a dir, poc més d’un segon.

En aquest 1,0186 segon també haurem comptabilitzat 10185892 impulsos del senyal de referència.

Això ens proporciona la informació següent: input_count = 32 reference_count = 10185892 f_reference = 10000000 Hz

La fórmula per calcular la freqüència resultant és la següent: freq = (input_count * f_reference) / ref_count

En el nostre exemple, és: f-input = (32 * 10000000) / 10185892 = 31.416 Hz

I això funciona bé tant per a freqüències baixes com per a freqüències altes, només quan el senyal d’entrada s’acosta (o fins i tot és superior a) a la freqüència de referència, és millor utilitzar la forma de mesurar estàndard “tancada”. Però llavors també podríem afegir un divisor de freqüència al senyal d’entrada ja que aquest mètode recíproc té la mateixa resolució per a qualsevol freqüència (fins a la referència de nou). Així doncs, si es mesura directament 100 kHz de dividit per un divisor extern de 1000x, la resolució és la mateixa.

Pas 3: maquinari i el seu esquema

El maquinari i el seu esquema
El maquinari i el seu esquema
Maquinari i el seu esquema
Maquinari i el seu esquema

He fet alguns d'aquest tipus de comptadors de freqüències. Fa molt de temps en vaig fer un amb un ATMEGA328 (el mateix controlador que hi ha en un Arduino), més endavant amb microcontroladors ARM de ST. La darrera versió es va fer amb un STM32F407 registrat a 168 MHz. Però ara em preguntava si passaria el mateix amb un de molt més petit. He escollit un ATTINY2313, que té només 2kbyte de memòria FLASH i 128 bytes de memòria RAM. La pantalla que tinc és un MAX7219 amb 8 pantalles de 7 segments, disponibles a Ebay per només 2 euros. Es pot comprar un ATTINY2313 per uns 1,5 euros, la resta de les peces que he fet servir només costen cèntims per peça. Probablement el més car era la caixa del projecte de plàstic. Més tard, vaig decidir fer-lo funcionar amb una bateria de ions de liti, de manera que calia afegir un estabilitzador de tensió (LDO) de 3,3 V, un mòdul de càrrega de bateria i la bateria mateixa. Això augmenta una mica el preu, però suposo que es pot construir per menys de 20 euros.

Pas 4: el codi

El codi
El codi
El codi
El codi

El codi es va escriure en C amb Atmel (Microchip) Studio 7 i es va programar a l'ATTINY2313 mitjançant un OLIMEX AVR_ISP (clon?). Obriu el fitxer (main.c) al fitxer zip següent si voleu seguir la descripció aquí.

INICIALITZACIÓ

Primer, l'ATTINY2313 es va configurar per utilitzar un cristall extern, ja que l'oscil·lador RC intern no serveix per mesurar res. Utilitzo un cristall de 10 MHz que sintonitzo amb la freqüència correcta de 10 000 000 Hz amb un petit condensador variable. La inicialització s’encarrega de configurar els ports d’entrada i sortida, configurar els temporitzadors i habilitar les interrupcions i la inicialització del MAX7219. TIMER0 està configurat per comptar un rellotge extern, TIMER1 el rellotge intern i també per capturar el valor del comptador a la vora ascendent d’ICP, provinent del flipflop D.

Discutiré el darrer programa principal, així que a continuació es detallen les rutines d’interrupció.

TIMER0_OVF

Com que TIMER0 compta fins a 255 (8 bits) i després passa a 0, necessitem una interrupció per comptar el nombre de desbordaments. Això és tot el que fa TIMER0_OVF, només cal comptar el nombre de desbordament. Més tard, aquest número es combina amb el valor del comptador en si.

TIMER1_OVF

TIMER1 pot comptar fins a 65536 (16 bits), de manera que la interrupció TIMER1_OVF també compta el nombre de desbordaments. Però fa més. També disminueix de 152 a 0, que triga aproximadament 1 segon i, a continuació, estableix un pin de sortida, anant a l'entrada D del xanclet. I l’últim que es fa en aquesta rutina d’interrupcions és disminuir el comptador d’espera, passant de 765 a 0, que triga uns 5 segons.

TIMER1_CAPT

Es tracta de la interrupció TIMER1_CAPT que s'activa cada vegada que el D-flipflop li envia un senyal a la vora ascendent del senyal d'entrada (com s'ha explicat anteriorment). La lògica de captura s’encarrega d’estalviar el valor del comptador TIMER1 en el moment de la captura, es guarda així com el comptador de desbordament. Malauradament, TIMER0 no té cap funció de captura d’entrada, de manera que aquí es llegeix el seu valor actual i el seu valor actual del comptador de desbordament. Una variable de missatge s'estableix a una perquè el programa principal li digui que es tracta de dades noves.

A continuació, es mostren dues funcions per controlar el MAX7219

SPI

Tot i que hi ha una interfície universal (USI) disponible al xip, he decidit no utilitzar-la. La pantalla MAX7219 s’ha de controlar mitjançant SPI i això és possible amb l’USI. Però el SPI bitbanging és tan senzill que no em vaig prendre el temps de fer-ho amb l’USI.

MAX7219

El protocol per configurar el MAX7219 també és bastant senzill un cop llegit el manual. Necessita un valor de 16 bits per a cada dígit que consti de 8 bits per al número de dígits (1 a 8) seguit de 8 bits per al nombre que ha de mostrar.

PRINCIPAL-PROG

L’últim és explicar el programa principal. S’executa en un bucle infinit (mentre que (1)), però només fa alguna cosa quan hi ha un missatge (1) de la rutina d’interrupcions o quan el comptador de temps d’espera s’ha reduït a zero (no hi ha cap senyal d’entrada).

El primer que cal fer quan el missatge variable es defineix en un és restablir el comptador de temps d’espera, al cap i a la fi sabem que hi ha un senyal present. El D-flipflop es restableix perquè estigui preparat per al següent activador que vindrà després del temps de mesura (esperar un segon).

Els números registrats a la interrupció de captura s'afegeixen per donar el recompte de referència i el recompte de freqüència d'entrada. (hem d'assegurar-nos que la referència mai no sigui zero, ja que la dividirem per més endavant)

El següent és el càlcul de la freqüència real. Segur que no vull fer servir números flotants en un microcontrolador amb només 2kbytes de flash i només 128 bytes de RAM que faig servir enters. Però les freqüències poden ser com 314,159 Hz, amb diversos decimals. Per tant, multiplico la freqüència d'entrada no només amb la freqüència de referència, sinó també amb un multiplicador, i després afegeixo un número a on ha d'anar el punt decimal. Aquests números es faran molt grans quan ho feu. Per exemple. amb una entrada de 500 kHz, una referència de 10 MHz i un multiplicador de 100, això dóna 5 x 10 ^ 14, és realment enorme. No encaixaran en un número de 32 bits, així que faig servir números de 64 bits que arribaran fins a 1,8 x 10 ^ 19 (funciona bé en un ATTINY2313)

I l’últim que cal fer és enviar el resultat a la pantalla MAX7219.

El codi es compila en uns 1600 bytes, de manera que s’adapta al flash de 2048 bytes disponible a ATTINY2313.

Els registres de fusibles haurien de ser així:

0xFF AMPLIAT

ALTA 0xDF

BAIX 0xBF

Pas 5: Precisió i precisió

Precisió i precisió
Precisió i precisió
Precisió i precisió
Precisió i precisió
Precisió i precisió
Precisió i precisió

La precisió i la precisió són dues bèsties separades. La precisió aquí és de set dígits, la precisió real depèn del maquinari i del calibratge. He calibrat els 10 MHz (5 MHz al punt de prova) amb un altre comptador de freqüències que té un oscil·lador disciplinat per GPS.

I funciona força bé, la freqüència més baixa que he provat és de 0,2 Hz, la màxima de 2 MHz. És perfecte. Per sobre de 2 MHz, el controlador comença a perdre interrupcions, cosa que no sorprèn realment quan se sap que el senyal d'entrada a 2 MHz TIMER0 genera més de 7800 interrupcions per segon. I l'ATTINY2313 també ha de fer altres coses, les interrupcions del TIMER1, amb altres 150 interrupcions per segon i, per descomptat, fer els càlculs, controlant la pantalla i el D-flipflop. Quan mireu el dispositiu real, veureu que només faig servir set dels vuit dígits de la pantalla. Ho faig per diversos motius.

La primera és que el càlcul de la freqüència d'entrada és una divisió, gairebé sempre tindrà una resta, que no veieu ja que és una divisió sencera. El segon és que l’oscil·lador de cristall de quars no està estabilitzat a la temperatura.

Els condensadors que l’ajusten als 10 MHz correctes són ceràmics, molt sensibles als canvis de temperatura. A més, hi ha el fet que TIMER0 no té cap lògica de captura incorporada, i totes les funcions d’interrupció triguen una mica a fer el seu treball. Crec que de set dígits és prou bo de totes maneres.

Recomanat: