Orodha ya maudhui:

Kaunta ya Mara kwa Mara ya Azimio: Hatua 5 (na Picha)
Kaunta ya Mara kwa Mara ya Azimio: Hatua 5 (na Picha)

Video: Kaunta ya Mara kwa Mara ya Azimio: Hatua 5 (na Picha)

Video: Kaunta ya Mara kwa Mara ya Azimio: Hatua 5 (na Picha)
Video: Majambazi walipopambana na Polisi baada ya kuiba pesa NMB Bank 2024, Julai
Anonim

Mafundisho haya yanaonyesha kaunta ya kurudia yenye uwezo wa kupima masafa haraka na kwa usahihi wa kuridhisha. Imetengenezwa na vifaa vya kawaida na inaweza kutengenezwa mwishoni mwa wiki (ilinichukua kidogo zaidi:-))

BONYEZA: Nambari hiyo sasa inapatikana kwenye GitLab:

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

Hatua ya 1: Kuhesabu Mzunguko wa Shule ya Kale

Kuhesabu Mzunguko wa Shule ya Kale
Kuhesabu Mzunguko wa Shule ya Kale
Kuhesabu Mzunguko wa Shule ya Kale
Kuhesabu Mzunguko wa Shule ya Kale

Njia ya zamani ya shule ya kupima mzunguko wa ishara ni kutumia mantiki NA-lango, kulisha ishara kupimwa katika bandari moja na ishara iliyo na wakati 1 wa juu kwa bandari nyingine na kuhesabu pato. Hii inafanya kazi vizuri kwa ishara za kHz chache kwenye GHz. Lakini vipi ikiwa unataka kupima ishara ya masafa ya chini na azimio zuri? Sema unataka kupima masafa ya mains (hapa 50 Hz). Kwa njia ya zamani ya shule utaona 50 mara kwa mara kwenye onyesho lako ikiwa una bahati, lakini kuna uwezekano mkubwa utaona swichi ya kuonyesha kutoka 49 hadi 50 au 50 hadi 51. Azimio ni 1 Hz, na ndio hivyo. Kamwe hutaona 50.002 Hz isipokuwa uko tayari kuongeza muda wa lango hadi sekunde 1000. Hiyo ni zaidi ya dakika 16, kwa kipimo kimoja!

Njia bora ya kupima ishara za masafa ya chini ni kupima kipindi chake. Kuchukua njia kuu kama mfano tena, ina kipindi cha millisecond 20. Chukua mantiki sawa NA-lango, lisha na, sema 10 MHz (mapigo 0.1 ya sisi) na ishara yako kwenye bandari nyingine na nje zitoke kunde 200000, kwa hivyo wakati wa kipindi ni 20000.0 uS na hiyo inarudi hadi 50Hz. Unapopima mapigo tu ya 199650 frequency ni 50.087 Hz, hiyo ni bora zaidi, na ni kwa wakati mmoja tu wa kupima. Kwa bahati mbaya hii haifanyi kazi vizuri na masafa ya juu. Chukua kwa mfano, sasa tunataka kupima 40 kHz. Na frequency sawa ya kuingiza 10 MHz kama rejeleo sasa tunapima kunde 250 tu. Tunapohesabu kunde 249 tu hesabu inatoa 40161 Hz na 251 matokeo ni 39840 Hz. Hilo sio azimio linalokubalika. Kwa kweli kuongezeka kwa masafa ya kumbukumbu kunaboresha matokeo lakini kuna kikomo kwa kile unaweza kutumia katika kidhibiti kidogo.

Hatua ya 2: Njia ya kurudia

Njia ya kurudia
Njia ya kurudia
Njia ya kurudia
Njia ya kurudia

Suluhisho linalofanya kazi kwa masafa ya chini na ya juu ni kaunta ya kurudia ya kurudia. Nitajaribu kuelezea kanuni yake. Unaanza na wakati wa kupima ambayo ni takriban sekunde 1, haifai kuwa sahihi sana lakini ni wakati mzuri wa kipimo. Lisha ishara hii 1 Hz ndani ya D-flipflop kwenye pembejeo la D. Hakuna kinachotokea bado kwenye pato. Unganisha ishara ambayo unataka kupima kwa uingizaji wa DAMU ya D-flipflop.

Mara tu ishara hii itatoka LOW hadi HIGH, pato la D-flipflop huhamisha hali ya kuingiza D kwa pato (Q). Ishara hii inayoinuka hutumiwa kuanza kuhesabu ishara ya kuingiza na vile vile ishara ya saa ya kumbukumbu.

Kwa hivyo unahesabu ishara MBILI kwa wakati sawa, ishara unayotaka kupima na saa ya kumbukumbu. Saa hii ya kumbukumbu inapaswa kuwa na thamani sahihi na kuwa thabiti, oscillator ya kawaida ya kioo iko sawa. Thamani sio muhimu sana ikiwa ni masafa ya juu na thamani yake inajulikana vizuri.

Baada ya muda, sema millisecond chache, unafanya uingizaji wa D-flipflop chini tena. Kwenye pembejeo ijayo ya PAMOJA pato Q inafuata hali ya uingizaji, lakini hakuna kitu kingine kinachotokea kwa sababu mdhibiti mdogo amewekwa kuguswa na ishara ya KUPANDA tu. Halafu, baada ya muda wa kupimia kumalizika (takriban sekunde 1) unafanya D-pembejeo JUU.

Tena kwenye pembejeo inayofuata ya Pato la Q ifuatavyo na ishara hii ya KUPANDA inasababisha mtawala mdogo, wakati huu kumaliza kuhesabu kwa kaunta zote mbili.

Matokeo yake ni nambari mbili. Nambari ya kwanza ni idadi ya kunde zilizohesabiwa kutoka kwa kumbukumbu. Kama tunavyojua mzunguko wa rejeleo, tunajua pia wakati uliochukua kuhesabu kunde hizo.

Nambari ya pili ni idadi ya kunde kutoka kwa ishara ya kuingiza tunayopima. Tulipoanza haswa kwenye kingo zinazoinuka za ishara hii tuna hakika sana juu ya idadi ya kunde za ishara hii ya kuingiza.

Sasa ni hesabu tu kuamua frequency ya ishara ya kuingiza.

Mfano, hebu tuseme tuna ishara hizi na tunataka kupima uingizaji wa f. Rejea ni 10 MHz, iliyotengenezwa na oscillator ya kioo ya quartz. f_input = 31.416 Hz f_reference = 10000000 Hz (10 MHz), wakati wa kupima ni takriban. Sekunde 1

Kwa wakati huu tulihesabu kunde 32. Sasa, kipindi kimoja cha ishara hii inachukua 1 / 31.416 = 31830.9 uS. Kwa hivyo vipindi 32 vilituchukua sekunde 1.0185892, ambayo ni zaidi ya sekunde 1.

Katika sekunde hii 1.0186 pia tutakuwa tumehesabu kunde 10185892 za ishara ya kumbukumbu.

Hii inatupa habari ifuatayo: input_count = 32 reference_count = 10185892 f_reference = 10000000 Hz

Fomula ya kuhesabu mzunguko unaosababishwa ni hii: freq = (input_count * f_reference) / ref_count

Katika mfano wetu ambayo ni: f-input = (32 * 10000000) / 10185892 = 31.416 Hz

Na hii inafanya kazi vizuri kwa masafa ya chini pamoja na masafa ya juu, tu wakati ishara ya pembejeo inakaribia (au hata zaidi kuliko) kwa masafa ya kumbukumbu ni bora kutumia njia ya kawaida ya "kupigwa". Lakini basi tunaweza pia kuongeza mgawanyiko wa masafa kwenye ishara ya kuingiza kwani njia hii ya kurudia ina azimio sawa kwa masafa yoyote (hadi rejeleo tena). Kwa hivyo ikiwa unapima 100 kHz moja kwa moja ya kugawanywa na msuluhishi wa nje wa 1000x, azimio ni sawa.

Hatua ya 3: Vifaa vya ujenzi na Mpangilio wake

Vifaa na Mpangilio wake
Vifaa na Mpangilio wake
Vifaa na Mpangilio wake
Vifaa na Mpangilio wake

Nimetengeneza kaunta kadhaa za aina hii. Zamani nilitengeneza moja na ATMEGA328 (mtawala sawa na katika Arduino), baadaye na watawala wadogo wa ARM kutoka ST. Ya hivi karibuni ilitengenezwa na STM32F407 iliyofungwa saa 168 MHz. Lakini sasa nilijiuliza ni nini nikifanya vivyo hivyo na moja ndogo zaidi. Nilichagua ATTINY2313, ambayo ina 2kbyte tu ya kumbukumbu ya FLASH na ka 128 za RAM. Onyesho ninalo ni MAX7219 na maonyesho 8 ya sehemu saba juu yake, maonyesho haya yanapatikana kwenye Ebay kwa Euro 2 tu. ATTINY2313 inaweza kununuliwa kwa karibu 1.5 Euro sehemu zingine ambazo nilitumia zinagharimu senti tu kipande. Ghali zaidi labda sanduku la mradi wa plastiki. Baadaye niliamua kuifanya iende kwa betri ya lithiamu-ion kwa hivyo nilihitaji kuongeza (LDO) 3.3V voltage utulivu wa moduli ya kuchaji betri na betri yenyewe. Hii inaongeza bei kwa kiasi fulani, lakini nadhani inaweza kujengwa kwa chini ya Euro 20.

Hatua ya 4: Kanuni

Kanuni
Kanuni
Kanuni
Kanuni

Nambari hiyo iliandikwa katika C na Atmel (Microchip) Studio 7 na kupangiliwa kwenye ATTINY2313 ikitumia OLIMEX AVR_ISP (clone?). Fungua (main.c) kwenye faili ya zip hapa chini ikiwa unataka kufuata maelezo hapa.

UTANGULIZI

Kwanza ATTINY2313 iliwekwa kutumia glasi ya nje kwani RC-oscillator ya ndani haina maana kwa kupima chochote. Ninatumia glasi ya 10 MHz ambayo ninarekebisha mzunguko sahihi wa 10 000 000 Hz na kiboreshaji kidogo cha kutofautisha. Uanzishaji hutunza kuweka bandari kwa pembejeo na matokeo, kuanzisha vipima muda na kuwezesha usumbufu na uanzishaji wa MAX7219. TIMER0 imewekwa kuhesabu saa ya nje, TIMER1 saa ya ndani na pia kukamata thamani ya kaunta kwenye ukingo unaoinuka wa ICP, ikitoka kwa D-flipflop.

Nitaondoa mpango kuu mwisho, kwa hivyo zifuatazo ni njia za kusumbua.

TIMER0_OVF

Kama TIMER0 inavyohesabu hadi 255 (8 bits) na kisha inaendelea hadi 0 tunahitaji usumbufu ili kuhesabu idadi ya mafuriko. Hiyo ndio tu TIMER0_OVF inafanya, hesabu tu idadi ya kufurika. Baadaye nambari hii imejumuishwa na thamani ya kaunta yenyewe.

TIMER1_OVF

TIMER1 inaweza kuhesabu hadi 65536 (bits 16), kwa hivyo usumbufu TIMER1_OVF pia huhesabu idadi ya mafuriko. Lakini inafanya zaidi. Pia hupungua kutoka 152 hadi 0 ambayo inachukua kama sekunde 1 na kisha kuweka pini ya pato, kwenda kwa uingizaji wa D wa flipflop. Na jambo la mwisho linalofanyika katika utaratibu huu wa kukatiza ni kupunguza kaunta ya muda wa kwenda, kutoka 765 hadi 0, ambayo inachukua sekunde 5.

TIMER1_CAPT

Huu ndio usumbufu wa TIMER1_CAPT ambao husababishwa kila wakati D-flipflop inapotuma ishara, kwenye kingo inayoinuka ya ishara ya kuingiza (kama ilivyoelezwa hapo juu). Mantiki ya kukamata hutunza kuokoa thamani ya kaunta ya TIMER1 wakati wa kukamata, imehifadhiwa na kaunta ya kufurika. Kwa bahati mbaya TIMER0 haina kazi ya kukamata pembejeo kwa hivyo hapa thamani yake ya sasa na thamani yake ya sasa ya kaunta ya kufurika inasomwa. Utofautishaji wa ujumbe umewekwa kwa moja kwa mpango wake kuu kuuambia hii ni data mpya.

Ifuatayo ni kazi mbili kudhibiti MAX7219

SPI

Wakati kuna Interface ya Universal Serial (USI) inapatikana kwenye chip nilichagua kutotumia. Onyesho la MAX7219 linahitaji kudhibitiwa kupitia SPI na hiyo inawezekana na USI. Lakini bitbanging SPI ni rahisi sana hivi kwamba sikuchukua muda kuifanya na USI.

MAX7219

Itifaki ya kusanidi MAX7219 pia ni rahisi mara tu utakaposoma mwongozo wake. Inahitaji thamani kidogo ya 16 kwa kila tarakimu ambayo ina bits 8 kwa nambari ya nambari (1 hadi 8) ikifuatiwa na bits 8 kwa nambari inayohitaji kuonyesha.

MAENDELEO KUU

Jambo la mwisho ni kuelezea mpango kuu. Inatembea kwa kitanzi kisicho na mwisho (wakati (1)) lakini kwa kweli hufanya kitu wakati kuna ujumbe (1) kutoka kwa utaratibu wa kukatiza au wakati kaunta ya muda wa kumaliza imeshuka hadi sifuri (hakuna ishara ya kuingiza).

Jambo la kwanza kufanya wakati ujumbe wa kutofautisha umewekwa kuwa moja, ni kuweka upya kaunta ya muda wa kumaliza, baada ya yote tunajua kuwa kuna ishara iliyopo. Flipflop imewekwa upya kuifanya iwe tayari kwa kichocheo kinachofuata ambacho kitakuja baada ya wakati wa kupima (subiri-sekunde).

Nambari zilizosajiliwa katika kukatiza kukamata zinaongezwa ili kutoa hesabu ya rejeleo na hesabu ya pembejeo-frequency. (lazima tuhakikishe kwamba kumbukumbu kamwe haiwezi kuwa sifuri kwani tutagawanya nayo baadaye)

Ifuatayo ni hesabu ya masafa halisi. Sitaki kutumia nambari zinazoelea kwenye microcontroller na 2kbyte tu za flash na ka 128 tu za kondoo dume mimi hutumia nambari kamili. Lakini masafa yanaweza kuwa kama 314.159 Hz, na desimali kadhaa. Kwa hivyo mimi huongeza mzunguko wa pembejeo sio tu na masafa ya kumbukumbu lakini pia na kipinduaji, na kisha ongeza nambari mahali pa desimali inapaswa kwenda. Nambari hizi zitakuwa kubwa sana wakati utafanya hivyo. Mfano. na pembejeo ya 500 kHz, kumbukumbu ya 10 MHz na kiongezaji cha 100, hii inatoa 5 x 10 ^ 14, hiyo ni kubwa sana! Hawatatoshea langer kwa nambari 32 kwa hivyo ninatumia nambari 64 ambazo zitapita hadi 1.8 x 10 ^ 19 (ambayo inafanya kazi vizuri kwenye ATTINY2313)

Na jambo la mwisho kufanya ni kutuma matokeo kwenye onyesho la MAX7219.

Nambari hiyo inakusanywa katika ka 1600, kwa hivyo inafaa kwa baiti 2048 zinazopatikana katika ATTINY2313.

Rejista za fuse zinapaswa kusoma hivi:

Imeongezwa 0xFF

JUU 0xDF

CHINI YA 0xBF

Hatua ya 5: Usahihi na Usahihi

Usahihi na Usahihi
Usahihi na Usahihi
Usahihi na Usahihi
Usahihi na Usahihi
Usahihi na Usahihi
Usahihi na Usahihi

Usahihi na usahihi ni wanyama wawili tofauti. Usahihi hapa ni nambari saba, ni nini usahihi halisi unategemea vifaa na hesabu. Nilipima 10 MHz (5 MHz kwenye hatua ya majaribio) na kaunta nyingine ya masafa ambayo ina oscillator yenye nidhamu ya GPS.

Na inafanya kazi vizuri, masafa ya chini kabisa niliyojaribu ni 0.2 Hz, 2 MHz ya juu zaidi. Ni doa juu. Juu ya 2 MHz mtawala anaanza kutatanisha, haishangazi sana wakati unajua kuwa kwa ishara ya kuingiza ya 2 MHz TIMER0 hutoa zaidi ya vipingamizi 7800 kwa sekunde. Na ATTINY2313 lazima afanye vitu vingine pia, usumbufu kutoka kwa TIMER1, kwa mwingine 150 hukatizwa kwa sekunde na kwa kweli hufanya mahesabu, kudhibiti onyesho na D-flipflop. Unapoangalia kifaa halisi utaona kuwa ninatumia nambari saba tu kati ya nane za onyesho. Ninafanya hivyo kwa sababu kadhaa.

Kwanza ni kwamba hesabu ya masafa ya pembejeo ni mgawanyiko, karibu kila wakati itakuwa na salio, ambayo hauoni kama ni mgawanyiko kamili. Pili ni kwamba oscillator ya glasi ya quartz sio joto imetulia.

Capacitors ambayo huiunganisha kwa 10 MHz sahihi ni ya kauri, nyeti sana kwa mabadiliko ya joto. Halafu kuna ukweli kwamba TIMER0 haina mantiki ya kukamata, na kazi za kusumbua zote huchukua muda kufanya kazi yao. Nadhani tarakimu saba zinatosha hata hivyo.

Ilipendekeza: