Satura rādītājs:
- 1. darbība: vecās skolas biežuma skaitīšana
- 2. solis: savstarpējs ceļš
- 3. darbība: aparatūra un tās shēma
- 4. solis: kods
- 5. solis: precizitāte un precizitāte
Video: Augstas izšķirtspējas frekvenču skaitītājs: 5 soļi (ar attēliem)
2024 Autors: John Day | [email protected]. Pēdējoreiz modificēts: 2024-01-30 10:51
Šī pamācība parāda savstarpēju frekvenču skaitītāju, kas spēj ātri un ar saprātīgu precizitāti mērīt frekvences. Tas ir izgatavots no standarta sastāvdaļām, un to var izgatavot nedēļas nogalē (man tas aizņēma mazliet ilgāku laiku:-))
EDIT: Kods tagad ir pieejams vietnē GitLab:
gitlab.com/WilkoL/high-resolution-frequency-counter
1. darbība: vecās skolas biežuma skaitīšana
Vecais skolas veids, kā izmērīt signāla frekvenci, ir izmantot loģiskus AND vārtus, ievadīt mērāmo signālu vienā ostā un signālu ar precīzi 1 sekundi augstu laiku otram portam un saskaitīt izvadi. Tas darbojas diezgan labi dažu kHz signāliem GHz. Bet ko darīt, ja vēlaties izmērīt zemas frekvences signālu ar labu izšķirtspēju? Pieņemsim, ka vēlaties izmērīt tīkla frekvenci (šeit 50 Hz). Izmantojot veco skolu metodi, veiksmes gadījumā displejā redzēsiet nemainīgu 50, bet, visticamāk, displeja slēdzi no 49 uz 50 vai 50 līdz 51. Izšķirtspēja ir 1 Hz, un viss. Jūs nekad neredzēsiet 50,002 Hz, ja vien nevēlaties palielināt vārtu laiku līdz 1000 sekundēm. Tas ir vairāk nekā 16 minūtes vienam mērījumam!
Labāks veids zemas frekvences signālu mērīšanai ir tā perioda mērīšana. Atkal ņemot piemēru elektrotīklam, periods ir 20 milisekundes. Ņemiet to pašu loģisko AND-vārtu, barojiet to ar, teiksim, 10 MHz (0,1 us impulsi), un jūsu signāls otrā ostā un ārā nāk no 200 000 impulsiem, tāpēc laika periods ir 20000,0 uS un tas tiek pārveidots 50 Hz. Mērot tikai 199650 impulsus, frekvence ir 50,087 Hz, tas ir daudz labāk, un tas notiek tikai vienas sekundes laikā. Diemžēl tas nedarbojas labi ar augstākām frekvencēm. Piemēram, tagad mēs vēlamies izmērīt 40 kHz. Ar tādu pašu 10 MHz ieejas frekvenci kā atsauce mēs tagad mērām tikai 250 impulsus. Kad mēs saskaitām tikai 249 impulsus, aprēķins dod 40161 Hz, un ar 251 rezultāts ir 39840 Hz. Tā nav pieņemama rezolūcija. Protams, atsauces frekvences palielināšana uzlabo rezultātus, taču mikrokontrollera izmantošanai ir ierobežojums.
2. solis: savstarpējs ceļš
Risinājums, kas darbojas gan zemām, gan augstākām frekvencēm, ir savstarpējs frekvenču skaitītājs. Es mēģināšu izskaidrot tā principu. Jūs sākat ar mērīšanas laiku, kas ir aptuveni 1 sekunde, tam nav jābūt ļoti precīzam, bet tas ir saprātīgs laiks mērīšanai. Padevējiet šo 1 Hz signālu D-ieejas D-flipflop. Izejā (-os) vēl nekas nenotiek. Pievienojiet signālu, kuru vēlaties izmērīt, D-flipflop CLOCK ieejai.
Tiklīdz šis signāls pāriet no LOW uz HIGH, D-flipflop izeja pārsūta D-ievades stāvokli uz izeju (Q). Šis RISING signāls tiek izmantots, lai sāktu skaitīt ieejas signālu, kā arī atskaites pulksteņa signālu.
Tātad jūs skaitāt DIVUS signālus tieši tajā pašā laikā, signālu, kuru vēlaties izmērīt, un atskaites pulksteni. Šim atskaites pulkstenim ir jābūt precīzai vērtībai un jābūt stabilam, normāls kristāla oscilators ir piemērots. Vērtībai nav lielas nozīmes, ja tā ir augsta frekvence un tās vērtība ir labi zināma.
Pēc kāda laika, teiksim, dažas milisekundes, jūs atkal padarīsit D-flipflop D ievadi zemu. Nākamajā CLOCK ievadē izeja Q seko ievades stāvoklim, bet nekas cits nenotiek, jo mikrokontrolleris ir iestatīts reaģēt tikai uz RISING signālu. Pēc tam, kad mērīšanas laiks ir beidzies (aptuveni 1 sekunde), jūs veicat D ievadi HIGH.
Atkal pie nākamās CLOCK ievades seko Q izeja un šis RISING signāls iedarbina mikrokontrolleri, šoreiz, lai pārtrauktu abu skaitītāju skaitīšanu.
Rezultāts ir divi skaitļi. Pirmais skaitlis ir impulsu skaits, kas skaitīts no atsauces. Kā mēs zinām atsauces frekvenci, mēs zinām arī laiku, kas bija vajadzīgs šo impulsu skaitīšanai.
Otrais skaitlis ir impulsu skaits no ieejas signāla, kuru mēs mērām. Sākot tieši no šī signāla RISING malām, mēs esam ļoti pārliecināti par šī ievades signāla impulsu skaitu.
Tagad tas ir tikai aprēķins, lai noteiktu ieejas signāla frekvenci.
Piemēram, pieņemsim, ka mums ir šie signāli un mēs vēlamies izmērīt f ievadi. Atsauce ir 10 MHz, ko ģenerē kvarca kristāla oscilators. f_input = 31,416 Hz f_reference = 10000000 Hz (10 MHz), mērīšanas laiks ir apm. 1 sekunde
Šajā laikā mēs saskaitījām 32 impulsus. Tagad viens šī signāla periods aizņem 1/31,416 = 31830,9 uS. Tātad 32 periodi mums prasīja 1,0185892 sekundes, kas ir nedaudz vairāk par 1 sekundi.
Šajā 1.0186 sekundē mēs arī saskaitīsim 10185892 atsauces signāla impulsus.
Tādējādi mēs iegūstam šādu informāciju: input_count = 32 reference_count = 10185892 f_reference = 10000000 Hz
Iegūtās frekvences aprēķināšanas formula ir šāda: freq = (input_count * f_reference) / ref_count
Mūsu piemērā tas ir: f-ievade = (32 * 10000000) / 10185892 = 31,416 Hz
Un tas labi darbojas gan zemām, gan augstām frekvencēm, tikai tad, kad ieejas signāls ir tuvu (vai pat augstākam) atskaites frekvencei, labāk ir izmantot standarta mērīšanas metodi. Bet tad mēs varētu vienkārši pievienot frekvences dalītāju ieejas signālam, jo šai savstarpējai metodei ir tāda pati izšķirtspēja jebkurai frekvencei (līdz atsaucei vēlreiz). Tātad, neatkarīgi no tā, vai mēra 100 kHz tieši no dalījuma ar ārēju 1000x dalītāju, izšķirtspēja ir vienāda.
3. darbība: aparatūra un tās shēma
Esmu izgatavojis dažus šāda veida frekvenču skaitītājus. Jau sen es izveidoju vienu ar ATMEGA328 (tāds pats kontrolieris kā Arduino), vēlāk ar ARM mikrokontrolleriem no ST. Jaunākais tika izgatavots ar STM32F407, kura frekvence bija 168 MHz. Bet tagad es domāju, kā būtu, ja es darītu to pašu ar * daudz * mazāku. Es izvēlējos ATTINY2313 ar FLASH atmiņu tikai 2 kbitu un 128 baitu RAM. Displejs man ir MAX7219 ar 8 septiņu segmentu displejiem, šie displeji ir pieejami ebay tikai par 2 eiro. ATTINY2313 var iegādāties par aptuveni 1,5 eiro, pārējās manis izmantotās detaļas maksā tikai centus gabalā. Visdārgākā, iespējams, bija plastmasas projekta kaste. Vēlāk es nolēmu to darbināt ar litija jonu akumulatoru, tāpēc man vajadzēja pievienot (LDO) 3.3V sprieguma stabilizatoru, akumulatora uzlādes moduli un pašu akumulatoru. Tas nedaudz palielina cenu, bet es domāju, ka to var būvēt par mazāk nekā 20 eiro.
4. solis: kods
Kods tika uzrakstīts C ar Atmel (Microchip) Studio 7 un ieprogrammēts ATTINY2313, izmantojot OLIMEX AVR_ISP (klons?). Atveriet (main.c) zemāk esošajā zip failā, ja vēlaties sekot aprakstam šeit.
INICIALIZĀCIJA
Vispirms ATTINY2313 tika iestatīts izmantot ārēju kristālu, jo iekšējais RC oscilators ir bezjēdzīgs, lai kaut ko mērītu. Es izmantoju 10 MHz kristālu, kuru ar nelielu mainīgu kondensatoru noskaņoju uz pareizo 10 000 000 Hz frekvenci. Inicializācija rūpējas par portu iestatīšanu ieejām un izejām, taimeru iestatīšanu un MAX7219 pārtraukumu un inicializācijas iespējošanu. TIMER0 ir iestatīts, lai saskaitītu ārējo pulksteni, TIMER1-iekšējo pulksteni, kā arī, lai fiksētu skaitītāja vērtību ICP augšupejošajā malā, kas nāk no D-flipflop.
Pēdējo es diskutēšu par galveno programmu, tāpēc nākamā ir pārtraukšanas kārtība.
TIMER0_OVF
Tā kā TIMER0 tiek skaitīts līdz 255 (8 bitiem) un pēc tam tiek pārvietots uz 0, mums ir nepieciešams pārtraukums, lai skaitītu pārplūdes. Tas ir viss, ko TIMER0_OVF dara, tikai saskaitiet pārpildes skaitu. Vēlāk šis skaitlis tiek apvienots ar paša skaitītāja vērtību.
TIMER1_OVF
TIMER1 var saskaitīt līdz 65536 (16 bitiem), tāpēc pārtraukums TIMER1_OVF arī skaita pārplūdes. Bet tas dara vairāk. Tas arī samazinās no 152 līdz 0, kas aizņem apmēram 1 sekundi, un pēc tam nosaka izejas tapu, pārejot uz flipflop D ieeju. Un pēdējā lieta, kas tiek darīta šajā pārtraukuma režīmā, ir samazināt taimauta skaitītāju, pārejot no 765 uz 0, kas aizņem apmēram 5 sekundes.
TIMER1_CAPT
Tas ir TIMER1_CAPT pārtraukums, kas tiek aktivizēts ikreiz, kad D-flipflop nosūta tam signālu pie ieejas signāla augšupejošās malas (kā paskaidrots iepriekš). Uzņemšanas loģika rūpējas par TIMER1 skaitītāja vērtības saglabāšanu uztveršanas brīdī, tā tiek saglabāta, kā arī pārplūdes skaitītājs. Diemžēl TIMER0 nav ieejas uztveršanas funkcijas, tāpēc šeit tiek nolasīta tā pašreizējā vērtība un pašreizējā pārplūdes skaitītāja vērtība. Ziņojuma mainīgais ir iestatīts uz vienu galvenajai programmai, lai pateiktu, ka tie ir jauni dati.
Tālāk ir divas funkcijas, lai kontrolētu MAX7219
SPI
Lai gan mikroshēmā ir pieejams universālais seriālais interfeiss (USI), es izvēlējos to neizmantot. MAX7219 displejs ir jākontrolē, izmantojot SPI, un tas ir iespējams ar USI. Bet bitbanging SPI ir tik vienkāršs, ka man nebija laika to darīt ar USI.
MAX7219
Arī MAX7219 iestatīšanas protokols ir diezgan vienkāršs, tiklīdz esat izlasījis tā rokasgrāmatu. Tam ir nepieciešama 16 bitu vērtība katram ciparam, kas sastāv no 8 bitiem ciparu skaitlim (no 1 līdz 8), kam seko 8 biti skaitlim, kas tam jāparāda.
GALVENĀ PROGRAMMA
Pēdējā lieta ir izskaidrot galveno programmu. Tas darbojas bezgalīgā ciklā (kamēr (1)), bet faktiski kaut ko dara tikai tad, ja no pārtraukuma rutīnas ir saņemts ziņojums (1) vai kad taimauta skaitītājs ir samazinājies līdz nullei (nav ievades signāla).
Pirmā lieta, kas jādara, ja mainīgais ziņojums ir iestatīts uz vienu, ir atiestatīt taimauta skaitītāju, galu galā mēs zinām, ka ir signāls. D-flipflop ir atiestatīts, lai tas būtu gatavs nākamajam sprūda signālam, kas pienāks pēc mērīšanas laika (pagaidiet sekundi).
Uzņemšanas pārtraukumā reģistrētie skaitļi tiek pievienoti, lai iegūtu atsauces un ievades frekvenču skaitu. (mums jāpārliecinās, ka atsauce nekad nevar būt nulle, jo mēs ar to dalīsimies vēlāk)
Nākamais ir faktiskās frekvences aprēķins. Es noteikti nevēlos izmantot peldošus skaitļus mikrokontrollerī, kurā ir tikai 2kbyte zibspuldzes un tikai 128 baiti RAM. Bet frekvences var būt līdzīgas 314,159 Hz ar vairākām zīmēm aiz komata. Tāpēc es reizinu ievades frekvenci ne tikai ar atsauces frekvenci, bet arī ar reizinātāju, un pēc tam pievienoju skaitli, kur jāiet aiz komata. To darot, šie skaitļi kļūs ļoti lieli. Piem. ar ievadi 500 kHz, atsauci 10 MHz un reizinātāju 100, tas dod 5 x 10^14, tas ir patiešām milzīgs! Tie nebūs piemēroti 32 bitu skaitlim, tāpēc es izmantoju 64 bitu ciparus, kas būs līdz 1,8 x 10^19 (tas labi darbojas ar ATTINY2313)
Un pēdējais, kas jādara, ir nosūtīt rezultātu uz displeju MAX7219.
Kods tiek apkopots aptuveni 1600 baitos, tāpēc tas atbilst 2048 baitu zibspuldzei, kas pieejama ATTINY2313.
Drošinātāju reģistri jālasa šādi:
Paplašināts 0xFF
AUGSTS 0xDF
Zems 0xBF
5. solis: precizitāte un precizitāte
Precizitāte un precizitāte ir divi atsevišķi zvēri. Precizitāte šeit ir septiņi cipari, un faktiskā precizitāte ir atkarīga no aparatūras un kalibrēšanas. Es kalibrēju 10 MHz (5 MHz testa vietā) ar citu frekvences skaitītāju, kuram ir GPS disciplinēts oscilators.
Un tas darbojas diezgan labi, zemākā frekvence, ko izmēģināju, ir 0,2 Hz, augstākā - 2 MHz. Tas ir uz vietas. Virs 2 MHz kontrolieris sāk pārtraukt pārtraukumus, kas nav pārsteidzoši, ja zināt, ka ar 2 MHz ieejas signālu TIMER0 rada vairāk nekā 7800 pārtraukumu sekundē. Un ATTINY2313 ir jādara arī citas lietas, pārtraukumi no TIMER1, vēl 150 pārtraukumi sekundē un, protams, jāveic aprēķini, kontrolējot displeju un D-flipflop. Aplūkojot faktisko ierīci, jūs redzēsit, ka es izmantoju tikai septiņus no astoņiem displeja cipariem. Es to daru vairāku iemeslu dēļ.
Pirmkārt, ievades frekvences aprēķins ir dalījums, tam gandrīz vienmēr būs atlikums, ko jūs neredzat, jo tas ir vesels skaitlis. Otrkārt, kvarca kristāla oscilators nav stabilizēts temperatūrā.
Kondensatori, kas to noskaņo uz pareizo 10 MHz, ir keramiski, ļoti jutīgi pret temperatūras izmaiņām. Tad ir fakts, ka TIMER0 nav iebūvēta uztveršanas loģika, un pārtraukšanas funkcijām ir vajadzīgs zināms laiks, lai veiktu savu darbu. Es domāju, ka septiņi cipari ir pietiekami labi.
Ieteicams:
Frekvenču skaitītājs ar Arduino: 8 soļi (ar attēliem)
Frekvenču skaitītājs ar Arduino: Šis ir vienkāršs un lēts uz arduino balstīts frekvences skaitītājs, kas maksā mazāk nekā 4 USD, bija ļoti noderīgi izmērīt nelielas shēmas
Augstas izšķirtspējas tīmekļa kamera: 9 soļi (ar attēliem)
Augstas izšķirtspējas tīmekļa kamera: dažus gadus es izmantoju uz RPi balstītu tīmekļa kameru (ar PiCam moduli). Sagatavotie attēli bija labi, bet tad bija brīdis, kad mani vairs neapmierināja kvalitāte. Es nolēmu izveidot augstas izšķirtspējas tīmekļa kameru. Sekojošās daļas
OpenLogger: augstas izšķirtspējas, iespējots Wi-Fi, atvērtā koda, pārnēsājamais datu reģistrētājs: 7 soļi
OpenLogger: augstas izšķirtspējas, iespējots Wi-Fi, atvērtā koda, pārnēsājamais datu reģistrētājs: OpenLogger ir pārnēsājams, atvērtā pirmkoda, lēts un augstas izšķirtspējas datu reģistrētājs, kas paredzēts augstas kvalitātes mērījumu nodrošināšanai, neprasot dārgu programmatūru vai rakstīšanas programmatūru. no nekā. Ja esat inženieris, zinātnieks vai entuziasts, kurš ne
Augstas izšķirtspējas PWM signālu ģenerēšana RC servos ar STM32 ierīcēm: 3 soļi
Augstas izšķirtspējas PWM signālu ģenerēšana RC servos ar STM32 ierīcēm: Pašlaik es būvēju RC raidītāju/uztvērēju, pamatojoties uz SX1280 RF mikroshēmu. Viens no projekta mērķiem ir tas, ka es vēlos 12 bitu servo izšķirtspēju no nūjām līdz servos. Daļēji tāpēc, ka mūsdienu digitālajiem servos ir 12 bitu reso
Kā iegūt augstas izšķirtspējas attēlus no instrukcijām: 4 soļi
Kā izvadīt augstas izšķirtspējas attēlus no instrukcijām: vai jums patiešām patika šis pamācošais attēls un vēlaties saglabāt tā augstas izšķirtspējas kopiju? Šī lieliskā mazā iezīme ir viegli aizmirstama