Taula de continguts:
- Pas 1: recompte de freqüències de la vella escola
- Pas 2: la manera recíproca
- Pas 3: maquinari i el seu esquema
- Pas 4: el codi
- Pas 5: Precisió i precisió
Vídeo: Comptador de freqüències d'alta resolució: 5 passos (amb imatges)
2024 Autora: John Day | [email protected]. Última modificació: 2024-01-30 08:10
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
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
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
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 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ó
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:
Comptador de freqüències simple amb Arduino: 6 passos
Comptador de freqüències simple amb Arduino: en aquest tutorial aprendrem com fer un comptador de freqüències simple amb Arduino. Mireu el vídeo
Comptador de freqüències amb Arduino: 8 passos (amb imatges)
Comptador de freqüències amb Arduino: és un comptador de freqüències basat en arduino senzill i barat que costa menys de 4 $, ha estat molt útil per mesurar circuits petits
Càmera web d'alta resolució: 9 passos (amb imatges)
Càmera web d'alta resolució: durant alguns anys vaig utilitzar una càmera web basada en RPi (amb el mòdul PiCam). Les imatges produïdes estaven bé, però hi va haver el moment en què ja no em vaig sentir satisfet amb la qualitat. Vaig decidir fer una càmera web d'alta resolució. Les següents parts
Generació de senyal PWM d'alta resolució per a servidors RC amb dispositius STM32: 3 passos
Generació de senyal PWM d'alta resolució per a servidors RC amb dispositius STM32: actualment estic construint un transmissor / receptor RC basat en el xip RF SX1280. Un dels objectius del projecte és que vull una resolució de servo de 12 bits des dels pals fins als servos. En part, perquè els servos digitals moderns tenen una versió de 12 bits
Com treure imatges en alta resolució de les instruccions: 4 passos
Com treure imatges en alta resolució de les instruccions: realment heu gaudit d’aquesta imatge instructiva i voleu desar-ne una còpia en alta resolució? Aquesta petita característica fantàstica s’obvia fàcilment