Talaan ng mga Nilalaman:

Counter ng Frequency ng Mataas na Resolusyon: 5 Hakbang (na may Mga Larawan)
Counter ng Frequency ng Mataas na Resolusyon: 5 Hakbang (na may Mga Larawan)

Video: Counter ng Frequency ng Mataas na Resolusyon: 5 Hakbang (na may Mga Larawan)

Video: Counter ng Frequency ng Mataas na Resolusyon: 5 Hakbang (na may Mga Larawan)
Video: 🟠 HOTWAV NOTE 12 - ДЕТАЛЬНЫЙ ОБЗОР и ТЕСТЫ 2024, Nobyembre
Anonim

Ang itinuturo na ito ay nagpapakita ng isang katumbas na counter ng dalas na may kakayahang sukatin ang mga frequency nang mabilis at may makatuwirang katumpakan. Ginawa ito sa mga karaniwang sangkap at maaaring gawin sa isang katapusan ng linggo (medyo mas matagal ako:-))

EDIT: Ang code ay magagamit na ngayon sa GitLab:

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

Hakbang 1: Nagbibilang ng Frequency ng Lumang Paaralan

Nagbibilang ng Frequency ng Lumang Paaralan
Nagbibilang ng Frequency ng Lumang Paaralan
Nagbibilang ng Frequency ng Lumang Paaralan
Nagbibilang ng Frequency ng Lumang Paaralan

Ang dating paraan ng paaralan upang sukatin ang dalas ng isang senyas ay ang paggamit ng isang lohika AT-gate, pakainin ang signal na susukat sa isang port at isang senyas na may eksaktong 1 segundong mataas na oras sa iba pang port at bilangin ang output. Gumagana ito nang maayos para sa mga signal ng ilang kHz na rin sa GHz. Ngunit paano kung nais mong sukatin ang isang mababang signal ng dalas na may mahusay na resolusyon? Sabihin na nais mong sukatin ang dalas ng mga mains (dito 50 Hz). Gamit ang lumang pamamaraan ng paaralan makikita mo ang isang pare-pareho 50 sa iyong display kung ikaw ay mapalad, ngunit mas malamang na makikita mo ang switch ng display mula 49 hanggang 50 o 50 hanggang 51. Ang resolusyon ay 1 Hz, at iyon lang. Hindi ka makakakita ng 50.002 Hz maliban kung handa kang dagdagan ang oras ng gate sa isang 1000 segundo. Iyon ay higit sa 16 minuto, para sa isang solong pagsukat!

Ang isang mas mahusay na paraan upang masukat ang mga signal ng mababang dalas ay upang masukat ang panahon nito. Ang pagkuha ng mains bilang isang halimbawa muli, ay may isang panahon ng 20 millisecond. Dalhin ang parehong lohika AT-gate, pakainin ito, sabihin ang 10 MHz (0.1 us pulses) at ang iyong signal sa iba pang port at out ay dumating 200000 pulso, kaya ang oras ng panahon ay 20000.0 uS at isinalin ito pabalik sa 50Hz. Kapag sinukat mo lamang ang 199650 na pulso ang dalas ay 50.087 Hz, mas mabuti iyan, at nasa isang segundo lamang ito ng pagsukat. Sa kasamaang palad hindi ito gumagana nang maayos sa mas mataas na mga frequency. Halimbawa, nais namin ngayon na sukatin ang 40 kHz. Gamit ang parehong 10 MHz dalas ng pag-input bilang sanggunian sinusukat namin ngayon ang 250 pulso lamang. Kapag binibilang lamang namin ang 249 pulso ang pagkalkula ay nagbibigay sa 40161 Hz at sa 251 ang resulta ay 39840 Hz. Hindi iyon isang katanggap-tanggap na resolusyon. Siyempre ang pagdaragdag ng dalas ng sanggunian ay nagpapabuti ng mga resulta ngunit mayroong isang limitasyon sa kung ano ang maaari mong gamitin sa isang micro controller.

Hakbang 2: Ang Paraan na Gantihan

Ang Paraan na Gantihan
Ang Paraan na Gantihan
Ang Paraan na Gantihan
Ang Paraan na Gantihan

Ang isang solusyon na gumagana para sa parehong mababa at mas mataas na mga frequency ay isang suklian na counter ng dalas. Susubukan kong ipaliwanag ang prinsipyo nito. Nagsisimula ka sa isang oras ng pagsukat na humigit-kumulang na 1 segundo, hindi ito kailangang maging napaka tumpak ngunit ito ay isang makatuwirang oras para sa isang pagsukat. Pakain ang signal na 1 Hz na ito sa isang D-flipflop sa D-input. Wala pang nangyayari sa (mga) output. Ikonekta ang signal na nais mong sukatin sa input ng CLOCK ng D-flipflop.

Sa sandaling ang signal na ito ay magmula sa Mababa hanggang sa Mataas, ang output ng D-flipflop ay inililipat ang estado ng D-input sa output (Q). Ang pagpunta sa signal na RISING na ito ay ginagamit upang masimulan ang pagbibilang ng input signal pati na rin isang sangguniang signal ng orasan.

Kaya't binibilang mo ang DALAWANG signal nang eksakto sa parehong oras, ang signal na nais mong sukatin at isang orasan ng sanggunian. Ang orasan ng sanggunian na ito ay kailangang magkaroon ng isang tumpak na halaga at maging matatag, ang isang normal na oscillator ng kristal ay mainam. Ang halaga ay hindi masyadong mahalaga hangga't ito ay isang mataas na dalas at ang halaga nito ay kilalang kilala.

Pagkalipas ng ilang oras, sabihin ang ilang milliseconds, ginawang mababa mo muli ang D-input ng D-flipflop. Sa susunod na pag-input ng CLOCK ang output Q ay sumusunod sa estado ng pag-input, ngunit wala nang iba pang nangyayari dahil ang micro controller ay nakatakdang mag-react sa isang RISING signal lamang. Pagkatapos, matapos ang oras ng pagsukat ay tapos na (tinatayang 1 segundo) gagawin mo ang D-input na TAAS.

Muli sa susunod na CLOCK-input ang Q output ay sumusunod at ang RISING signal na ito ay nagpapalitaw ng micro controller, oras na ito upang wakasan ang pagbibilang ng parehong mga counter.

Ang resulta ay dalawang numero. Ang unang numero ay ang bilang ng mga pulso na binibilang mula sa sanggunian. Tulad ng alam namin ang dalas ng sanggunian, alam din namin ang oras na kinakailangan upang mabilang ang mga pulso na iyon.

Ang pangalawa ang bilang ay ang bilang ng mga pulso mula sa input signal na sinusukat namin. Tulad ng pagsisimula namin nang eksakto sa RISING edge ng signal na ito tiwala kaming kumpiyansa tungkol sa bilang ng mga pulso ng input signal na ito.

Ngayon ito ay isang pagkalkula lamang upang matukoy ang dalas ng input signal.

Isang halimbawa, sasabihin na mayroon kaming mga signal na ito at nais naming sukatin ang f-input. Ang sanggunian ay 10 MHz, na nabuo ng isang quartz crystal oscillator. f_input = 31.416 Hz f_referensi = 10000000 Hz (10 MHz), ang oras ng pagsukat ay tinatayang. 1 segundo

Sa oras na ito binibilang namin ang 32 pulso. Ngayon, ang isang panahon ng signal na ito ay tumatagal ng 1 / 31.416 = 31830.9 uS. Kaya't 32 yugto ang tumagal sa amin ng 1.0185892 segundo, na higit sa 1 segundo lamang.

Sa segundo na ito ng 1.0186 ay bibilangin din namin ang 10185892 pulso ng signal ng sanggunian.

Ibinibigay sa amin ang sumusunod na impormasyon: input_count = 32 reference_count = 10185892 f_referensi = 10000000 Hz

Ang pormula upang makalkula ang nagresultang dalas ay ito: freq = (input_count * f_referensi) / ref_count

Sa aming halimbawa iyon ay: f-input = (32 * 10000000) / 10185892 = 31.416 Hz

At ito ay gumagana nang maayos para sa mababang mga frequency pati na rin ang mga mataas na frequency, kapag ang input signal ay malapit (o kahit na mas mataas kaysa sa) sa sangguniang dalas mas mahusay na gamitin ang karaniwang "gated" na paraan ng pagsukat. Ngunit pagkatapos ay maaari din kaming magdagdag ng isang frequency-divider sa input signal dahil ang kapalit na pamamaraang ito ay may parehong resolusyon para sa anumang dalas (hanggang sa muling sanggunian muli). Kaya't kung susukat mo ang 100 kHz nang direkta ng hinati ng isang panlabas na 1000x divider, ang resolusyon ay pareho.

Hakbang 3: Hardware at Ang Skematika nito

Hardware at Ang Skematika nito
Hardware at Ang Skematika nito
Hardware at Ang Skematika nito
Hardware at Ang Skematika nito

Gumawa ako ng ilan sa ganitong uri ng mga counter ng dalas. Matagal na ang nakalipas Ginawa ko ang isa sa isang ATMEGA328 (ang parehong controller tulad ng mayroong sa isang Arduino), kalaunan kasama ang mga ARM micro Controller mula sa ST. Ang pinakabagong ay ginawa gamit ang isang STM32F407 na naorasan sa 168 MHz. Ngunit ngayon nagtaka ako kung paano kung gagawin ko ang pareho sa isang mas * maliit *. Pinili ko ang isang ATTINY2313, mayroon lamang 2kbyte ng FLASH memory at 128 bytes ng RAM. Ang display na mayroon ako ay isang MAX7219 na may 8 pitong segment na ipinapakita dito, ang mga display na ito ay magagamit sa Ebay sa halagang 2 Euros lamang. Ang isang ATTINY2313 ay maaaring mabili sa humigit-kumulang na 1.5 Euro ang natitirang mga bahagi na ginamit ko na nagkakahalaga lamang ng sentimo isang piraso. Ang pinakamahal ay marahil ang kahon ng proyekto ng plastik. Nang maglaon ay nagpasya akong patakbuhin ito sa isang baterya ng lithium-ion kaya kailangan kong magdagdag ng (LDO) 3.3V boltahe pampatatag isang module ng pagsingil ng baterya at ang baterya mismo. Tumaasan nito ang presyo nang medyo, ngunit hulaan ko maaari itong bumuo ng mas mababa sa 20 Euros.

Hakbang 4: Ang Code

Ang Code
Ang Code
Ang Code
Ang Code

Ang code ay nakasulat sa C kasama ang Atmel (Microchip) Studio 7 at na-program sa ATTINY2313 gamit ang isang OLIMEX AVR_ISP (clone?). Buksan ang (main.c) sa zip file sa ibaba kung nais mong sundin ang paglalarawan dito.

INITIALIZATION

Una ang ATTINY2313 ay itinakda upang gumamit ng isang panlabas na kristal dahil ang panloob na RC-oscillator ay walang silbi para sa pagsukat ng anumang bagay. Gumagamit ako ng isang 10 MHz na kristal na tune ko sa tamang 10 000 000 Hz dalas na may isang maliit na variable capacitor. Ang pagsisimula ay nangangalaga sa pagtatakda ng mga port sa mga input at output, pagse-set up ng mga timer at pagpapagana ng mga nakakagambala at pagsisimula ng MAX7219. Ang TIMER0 ay naka-set up upang mabilang ang isang panlabas na orasan, TIMER1 ang panloob na orasan at din upang makuha ang halaga ng counter sa tumataas na gilid ng ICP, na nagmumula sa D-flipflop.

Ididiskubre ko ang huling programa sa huli, kaya susunod ang mga nakakagambala na gawain.

TIMER0_OVF

Tulad ng bilang ng TIMER0 hanggang sa 255 (8 bits) at pagkatapos ay gumulong sa 0 kailangan namin ng isang makagambala upang mabilang ang bilang ng mga overflow. Iyon lang ang ginagawa ng TIMER0_OVF, bilangin lamang ang bilang ng overflow. Mamaya ang bilang na ito ay pinagsama sa halaga ng counter mismo.

TIMER1_OVF

Ang TIMER1 ay maaaring bilangin hanggang sa 65536 (16 bits), kaya't ang nakakagambala na TIMER1_OVF ay binibilang din ang bilang ng mga overflow. Ngunit higit pa ang ginagawa nito. Nagbabawas din ito mula 152 hanggang 0 na tumatagal ng tungkol sa 1 segundo at pagkatapos ay nagtatakda ng isang output pin, pagpunta sa D-input ng flipflop. At ang huling bagay na tapos na sa makagambalang gawain na ito ay upang mabawasan ang timeout-counter, mula 765 hanggang 0, na tumatagal ng halos 5 segundo.

TIMER1_CAPT

Ito ang pag-abala ng TIMER1_CAPT na na-trigger tuwing nagpapadala ang D-flipflop nito ng isang senyas, sa tumataas na gilid ng input signal (tulad ng ipinaliwanag sa itaas). Nag-iingat ang lohika sa pagkuha ng pag-save ng halaga ng TIMER1 counter sa sandaling nakuha, nai-save ito pati na rin ang overflow counter. Sa kasamaang palad ang TIMER0 ay walang isang function ng pag-capture ng pag-input kaya narito ang kasalukuyang halaga at ang kasalukuyang halaga ng overflow counter ay nabasa. Ang isang variable ng mensahe ay nakatakda sa isa para sa pangunahing programa na sasabihin niya ito ay bagong data.

Susunod ay dalawang pagpapaandar upang makontrol ang MAX7219

SPI

Habang may isang magagamit na Universal Serial Interface (USI) sa maliit na tilad na pinili kong huwag gamitin ito. Ang MAX7219 display ay kailangang kontrolin sa pamamagitan ng SPI at posible iyon sa USI. Ngunit ang bitbanging SPI ay napakasimple na hindi ko ginugol ang oras upang gawin ito sa USI.

MAX7219

Ang protocol upang i-setup ang MAX7219 din ay medyo simple sa sandaling nabasa mo ang manu-manong nito. Kailangan nito ng 16 bit na halaga para sa bawat digit na binubuo ng 8 bits para sa digit na numero (1 hanggang 8) na sinusundan ng 8 bits para sa bilang na kailangan nitong ipakita.

MAIN-PROG

Ang huling bagay ay upang ipaliwanag ang pangunahing programa. Ito ay tumatakbo sa isang walang katapusang loop (habang (1)) ngunit talagang gumagawa lamang ng isang bagay kapag may isang mensahe (1) mula sa nakakagambala na gawain o kapag ang timeout counter ay tumakbo pababa sa zero (walang input signal).

Ang unang bagay na dapat gawin kapag ang variable na mensahe ay nakatakda sa isa, ay ang pag-reset ng timeout counter, pagkatapos ng lahat ng alam natin na mayroong isang signal na naroroon. Ang D-flipflop ay naka-reset upang maging handa ito para sa susunod na pag-trigger na darating pagkatapos ng oras ng pagsukat (maghintay-ng-isang segundo).

Ang mga numero na nakarehistro sa makagambala ng nakakakuha ay idinagdag upang ibigay ang bilang ng sanggunian at bilang ng input-dalas. (kailangan nating tiyakin na ang sanggunian ay hindi kailanman maaaring maging zero dahil hahatiin natin ito sa paglaon)

Susunod ay isang pagkalkula ng aktwal na dalas. Tiyak na ayaw kong gumamit ng mga lumulutang na numero sa isang microcontroller na may 2kbytes flash lamang at 128 bytes ng ram ang ginagamit ko sa mga integer. Ngunit ang mga frequency ay maaaring maging tulad ng 314.159 Hz, na may maraming mga decimal. Samakatuwid pinarami ko ang input-frequency hindi lamang sa dalas ng sanggunian ngunit din sa isang multiplier, at pagkatapos ay magdagdag ng isang numero kung saan dapat pumunta ang decimal point. Ang mga numerong ito ay magiging napakalaking kapag ginawa mo iyon. Hal. na may input na 500 kHz, isang sanggunian na 10 MHz at isang multiplier ng 100, nagbibigay ito ng 5 x 10 ^ 14, napakalaking iyon! Hindi sila magkakasya sa isang 32 bit na numero kaya gumagamit ako ng 64 bit na mga numero na pupunta sa 1.8 x 10 ^ 19 (na gumagana nang maayos sa isang ATTINY2313)

At ang huling bagay na dapat gawin ay ipadala ang resulta sa display na MAX7219.

Ang code ay naiipon sa ilang 1600 bytes, kaya umaangkop ito sa 2048 bytes flash na magagamit sa ATTINY2313.

Ang mga fuse-register ay dapat basahin tulad nito:

Pinalawak na 0xFF

TAAS 0xDF

MABABANG 0xBF

Hakbang 5: Kawastuhan at Katumpakan

Kawastuhan at katumpakan
Kawastuhan at katumpakan
Kawastuhan at katumpakan
Kawastuhan at katumpakan
Kawastuhan at katumpakan
Kawastuhan at katumpakan

Ang kawastuhan at katumpakan ay dalawang magkakahiwalay na hayop. Ang katumpakan dito ay pitong digit, kung ano ang aktwal na katumpakan ay nakasalalay sa hardware at pagkakalibrate. In-calibrate ko ang 10 MHz (5 MHz sa test point) kasama ang ibang counter ng dalas na mayroong isang disiplinadong oscillator ng GPS.

At gumagana ito ng maayos, ang pinakamababang dalas na sinubukan ko ay 0.2 Hz, ang pinakamataas na 2 MHz. Ito ay spot on. Sa itaas ng 2 MHz ang magsusupil ay nagsisimula sa maluwag na pagkagambala, hindi talaga nakakagulat kapag alam mo na sa 2 MHz input signal ang TIMER0 ay bumubuo ng higit sa 7800 na nakakagambala bawat segundo. At ang ATTINY2313 ay kailangang gumawa din ng iba pang mga bagay, ang nakakagambala mula sa TIMER1, sa isa pang 150 nakakagambala bawat segundo at syempre gawin ang mga kalkulasyon, pagkontrol sa display at D-flipflop. Kapag tiningnan mo ang totoong aparato makikita mo na gumagamit ako ng pito lamang sa walong mga digit ng display. Ginagawa ko ito sa maraming kadahilanan.

Una ay ang pagkalkula ng dalas ng pag-input ay isang dibisyon, halos palaging may natitirang ito, na hindi mo nakikita dahil ito ay isang dibisyon ng integer. Pangalawa ay ang quartz crystal oscillator ay hindi nagpapatatag ng temperatura.

Ang mga capacitor na tune ito sa tamang 10 MHz ay ceramic, napaka-sensitibo sa mga pagbabago sa temperatura. Pagkatapos mayroong ang katunayan na ang TIMER0 ay walang capture logic build in, at ang mga nakakagambala na pag-andar lahat ay tumatagal ng ilang oras upang gawin ang kanilang gawain. Sa tingin ko ang pitong digit ay sapat na mabuti pa rin.

Inirerekumendang: