Suurtaajuus- ja käyttöjakson mittaaminen samanaikaisesti mikrokontrollerin avulla: 4 vaihetta
Suurtaajuus- ja käyttöjakson mittaaminen samanaikaisesti mikrokontrollerin avulla: 4 vaihetta

Video: Suurtaajuus- ja käyttöjakson mittaaminen samanaikaisesti mikrokontrollerin avulla: 4 vaihetta

Video: Suurtaajuus- ja käyttöjakson mittaaminen samanaikaisesti mikrokontrollerin avulla: 4 vaihetta
Video: Neid sõnu ei tohiks kunagi öelda peegli ees. 2025, Tammikuu
Anonim
Suurtaajuus- ja käyttöjakson mittaaminen samanaikaisesti mikro -ohjaimen avulla
Suurtaajuus- ja käyttöjakson mittaaminen samanaikaisesti mikro -ohjaimen avulla
Suurtaajuus- ja käyttöjakson mittaaminen samanaikaisesti mikro -ohjaimen avulla
Suurtaajuus- ja käyttöjakson mittaaminen samanaikaisesti mikro -ohjaimen avulla
Suurtaajuus- ja käyttöjakson mittaaminen samanaikaisesti mikro -ohjaimen avulla
Suurtaajuus- ja käyttöjakson mittaaminen samanaikaisesti mikro -ohjaimen avulla

Tiedän, mitä ajattelet: "Huh? On olemassa monia ohjeita, joilla voit käyttää mikro -ohjaimia signaalin taajuuden mittaamiseen. Haukotus." Mutta odota, tässä on uutuus: kuvailen menetelmää, jolla mitataan taajuuksia, jotka ovat paljon korkeampia kuin mikrokontrolleri (MCU) voi kestää, ja signaalin käyttöjaksoa - kaikki samaan aikaan!

Laitteen taajuusalue on ~ 43 Hz - ~ 450 kHz, kun taas toimintajakso vaihtelee 1%: sta 99%: iin.

Haluan selittää "kestää" -osan: MCU mittaa neliöaaltosignaalin T jakson seuraten kahden seuraavan siirtymätapahtuman välistä aikaa. Esimerkiksi matalasta korkeaan jännite hyppää yhteen sen I/O-nastoista. Se tekee sen laskemalla oman sisäisen kellonsa pulssien lukumäärän. Suoraan sanottuna mitattujen taajuuksien ylärajan tulisi noudattaa Nyqvist-Shannonin näytteenottoteoriaa; eli se olisi suunnilleen puolet MCU: n kellotaajuudesta. Todellisuudessa raja on paljon, paljon pienempi, koska MCU: n on suoritettava koodi keskeytysten käsittelemiseksi, muuttujien tallentamiseksi, aritmeettisten toimintojen suorittamiseksi, tulosten näyttämiseksi jne. Kokeissani 48 MHz: n MCU: lla mitattavien siirtymien välinen kellojaksojen vähimmäismäärä oli noin 106. Näin ollen mitattavan taajuusalueen yläraja tässä tapauksessa olisi 48 000 /212 /2 = 226,4 kHz.

Vaikka MCU mittaa signaalin jaksoa, se voi myös määrittää sen pulssin leveyden, P: aika, jolloin signaalin jännite pysyy korkeana. Toisin sanoen aika siirtymisestä matalista korkeisiin ja korkeista mataliin. Signaalin toimintajakso määritetään sitten seuraavasti:

Tulli = 100% * P / T

Aivan kuten taajuuden tapauksessa, pulssin leveydellä on käytännön raja. Yllä olevaa esimerkkiä käyttämällä 106 kellojaksoa rajoittaisi pulssin leveyden vähintään 2,21 mikrosekuntiin. Tai vähintään 50% taajuudella 226,4 kHz.

Yksi keino nostaa neliöaaltosignaalien ylätaajuusrajaa on käyttää flip-floppeja hyödyntäviä digitaalisia jakajia. Tulotaajuuden jakaminen n: llä pidentäisi mitattavaa yläaluetta n kertaa. Tämä on hieno uutinen, digitaalisilla jakajilla on yksi perusvirhe: jaettu signaali menettää pulssin leveyden (ja käyttöjakson) tiedot! Jakajien toimintatavan vuoksi niiden tuotto on aina 50%. Hupaisaa…

Seuraavilla sivuilla kuitenkin näytän kuinka jakaa taajuus digitaalisesti ja säilyttää alkuperäinen pulssileveys, jotta voin mitata signaaleja selvästi yli suoran laskennan asettamat rajat.

Vaihe 1: Digitaalinen taajuusjako

Digitaalinen taajuusosasto
Digitaalinen taajuusosasto
Digitaalinen taajuusosasto
Digitaalinen taajuusosasto
Digitaalinen taajuusosasto
Digitaalinen taajuusosasto

Perinteiset digitaaliset taajuusjakajat käyttävät varvastossuja; Tämä opetusohjelma selittää hienosti periaatteet, miten jakajat rakennetaan tavallisilla JK-varvastossuilla. Tämä ratkaisee tulotaajuuksien ongelman, joka on liian korkea MCU: lle, mutta sillä on yksi merkittävä haitta: jaetun signaalin toimintajakso on 50% riippumatta tulosignaalin tehosta! Jos haluat nähdä, miksi näin on, katso kaksi ensimmäistä lukua. Alkuperäinen signaali, jolla on jakso T ja pulssin leveys P, syötetään JK-flip-flopin kellotappiin samalla kun sen J- ja K-nastoja pidetään korkealla koko ajan (ensimmäinen kuva). 3.3V logiikkaa oletetaan kaikkialla. Oletetaan, että flip-flopin laukaisee kellon positiivinen (eli nouseva) reuna. Näissä olosuhteissa ulostulonapin tilan muutokset (yksittäiset "kääntö" ja "flopit") tapahtuvat aina, kun kellotappi siirtyy alhaisesta korkeaan. Kellon siirtyminen korkeasta matalaan (eli negatiivinen reuna) ohitetaan kokonaan. Katso toinen kuva. Lähtötappi Q lähettää signaalin, jonka jakso on kaksi kertaa niin pitkä kuin alkuperäinen jakso, eli sen taajuus puolittuu. Lähdön pulssileveys on aina yhtä suuri kuin T. Näin ollen alkuperäinen pulssin leveys P menetetään.

Kun lisäät toisen JK-kiikun kolmannessa kuvassa esitetyssä kokoonpanossa, alkuperäinen taajuus jaetaan neljällä. Kun lisäät varvastossuja samalla tavalla, jaat taajuuden seuraavilla voimilla 2: 8, 16, 32 jne.

Ongelma: kuinka jakaa neliöaallon taajuus säilyttäen sen pulssin leveyden?

Ajatuksena on lisätä sekoitukseen oikein negatiivisen reunan laukaisema JK-flip-floppi. Kutsutaan sitä "Neg FF"; katso neljäs kuva. Tässä "oikein" tarkoittaa, että uuden kiikun J- ja K-nastat on sidottu edellisessä kuvassa esitetyn jakajan neljällä ("Pos FF") vastaavasti Q- ja Qbar-lähtötappeihin. (Tässä "palkki" on vaakasuora palkki Q -symbolin yläpuolella, mikä osoittaa loogisen kieltämisen.) Jos haluat nähdä, mitä tämä saavuttaa, katso viidennen kuvan "Neg FF": n funktiotaulukkoa: Negin lähtönastat, Q ja Qbar, heijastaa sen tulonastien tilaa J ja K. Tämä tarkoittaa, että ne heijastavat Pos 'Q- ja Qbar -tilojen tilaa. Negin flip-flop-toiminnon on kuitenkin odotettava alkuperäisen signaalin negatiivista reunaa, joka saapuu aikaan P positiivisen reunan jälkeen. Aha!

Tuloksena olevat aaltomuodot on kuvattu kuudennessa kuvassa. "Pos Q" lähettää signaalin 1/4 taajuudella, "Pos Qbar" on käänteinen, "Neg Q" seuraa "Pos Q" -siirtoa pulssin leveydellä P ja "Neg Qbar" on sen käänteisarvo. Voit tarkistaa, että "Pos Qbar": n ja "Neg Q": n looginen AND tuottaa pulssijonon, jolle on tunnusomaista alkuperäinen pulssileveys P ja 1/4 taajuudesta. Bingo!

Aluksi käytin täsmälleen tätä lähtösignaalia MCU: n syöttämiseen. Se osoittautui kuitenkin ongelmalliseksi hyvin lyhyille pulssileveyksille, koska johdannossa mainittu MCU: n 106 jakson rajoitus. Olen ratkaissut tämän pienen ongelman valitsemalla toisen tulosteen: "Pos Qbar" JA "Neg Qbar". Yksi tarkastelu aaltomuodoista pitäisi saada sinut vakuuttuneeksi siitä, että tämän aaltomuodon pulssileveys P 'vaihtelee välillä T ja 2T P (0, T) -alueen sijasta. P voidaan helposti palauttaa P: stä:

P = 2T - P '

Vaihe 2: Suositeltu laitteisto

Suositeltu laitteisto
Suositeltu laitteisto
Suositeltu laitteisto
Suositeltu laitteisto
Suositeltu laitteisto
Suositeltu laitteisto

Pidän todella sähköisten harrastajien suhteellisesta tulokkaasta: Atmel SAM D21 MCU: t, jotka perustuvat 32-bittiseen ARM Cortex M0+ -prosessoriin, joka toimii 48 MHz: n kellotaajuudella, paljon korkeammalla kuin vanhemmat Atmels. Tätä hanketta varten ostin:

  • ItsyBitsy M0 Express MCU -levy, Adafruit
  • Minulla sattui olemaan ladattava LiPo -akku Adafruitilta
  • Yksivärinen 128 x 32 SPI OLED -näyttö (arvasit sen: Adafruit)
  • Kaksi positiivisen reunan laukaisemaa JK-kiikkua SN74HC109 Texas Instrumentsilta
  • Kaksi negatiivisen reunan laukaisemaa JK-kiikkua SN74HC112 Texas Instrumentsilta
  • Neljän- ja portti CD74AC08E, Texas Instruments
  • Nelinkertainen TAI portti CD74AC32E, Texas Instruments

Vaihe 3: Piiri

Piiri
Piiri
Piiri
Piiri

Ensimmäinen kuva esittää yksinkertaistetun kaavion taajuus/tehomittarista. 3,3 V: n CMOS -logiikkaa käytetään kaikkialla. Tulon neliöaallon amplitudin on siis oltava vastaavan V: n välissäIH 2 V) ja 3,3 V. Jos ei, sinun on skaalattava sitä ylös- tai alaspäin. Useimmissa tapauksissa yksinkertainen jännitteenjakaja riittää. Jos haluat suunnitella versiosi mittarista eri logiikkatasolla, sinun on käytettävä toista mikro -ohjainta (MCU), akkua ja näyttöä, jotka toimivat halutulla tasolla. Tässä projektissa käytetyt logiikkaportit ja varvastossut toimivat loogisilla tasoilla 2 V: n ja 6 V: n välillä, ja niiden pitäisi olla useimmissa tapauksissa OK.

Kuten on esitetty, ItsyBitsy MCU käyttää nastoja 9-13 kommunikoidakseen näytön kanssa ohjelmiston SPI-protokollan kautta. 3V -nasta tuottaa virtaa koko piirille. Digitaalinen tulotappi 3 hyväksyy analysoidun signaalin, kun taas nastat 2 ja 4 ohjaavat signaalilähdettä: joko suora signaali, joka tulee portin AND3 kautta (matalat tulotaajuudet), tai signaali jaettuna neljällä portilla AND4 (korkeat tulotaajuudet), kuten vaiheessa 2 on kuvattu Seuraavassa vaiheessa käsitelty koodi havaitsee automaattisesti saapuvan taajuusalueen ja vaihtaa signaalilähteen asianmukaisesti.

Kaavio ei osoita digitaalisten siruliitäntöjen todellista monimutkaisuutta. Toinen kuva osoittaa, miltä projekti näyttäisi leipätaululta. Tulosignaali tulee punaisen johdon kautta kahden positiivisen reunan flip-flopin 2CLK-nastaan. VAROITUS: Normaalisti kaikki tämän flip -flopin J- ja K -nastat on pidettävä korkealla, mutta erityisesti SN74HC109: ssä on Kbar -nasta - käänteinen K -nasta - sen sijaan. Siksi tämä nasta on maadoitettava! SN74HC112: n ensimmäisen negatiivisen reunan kiikun 1K- ja 1J-nasta on yhdistetty SN74HC109: n 1Q- ja 1Qbar-nastoihin. SN74HC112: n toinen kiikari on käyttämätön ja sen tulonastat (2K, 2J, 2CLRbar) on maadoitettu. Kaikki muut varvastangot PREbar (esiasetettu) ja CLRbar (kirkas) kaikissa varvastossuissa on liitettävä loogiseen korkeaan. Käyttämättömät kello- ja lähtönastat jätetään kytkemättä. Samoin kaikkien porttien käyttämättömät tulonastat on maadoitettu, kun taas käyttämättömät ulostulonapit jätetään kytkemättä. Kuten keskustelin "Invisible Killer of the Phone Ring" -ohjeessa, ohjattavissa, loogisten sirujen käyttämättömien syöttötappien maadoittaminen eliminoi satunnaiset värähtelyt ja säästää akkua.

Vaihe 4: Koodi ja matalien taajuuksien mittaaminen

Kaikki toiminnot tapahtuvat luonnollisesti alla linkitetyssä koodissa. Kun nastan 3 tulo vaihtuu digitaalisesta matalasta korkeaksi, MCU alkaa laskea sisäisen 48 MHz: n kellonsa pulsseja. Se panee merkille korkean ja matalan siirtymishetken ja jatkaa laskemista seuraavaan alhaisesta korkeaseen -kytkimeen asti, kun se käynnistää koko prosessin uudelleen. Ensimmäinen lasku edustaa pulssin leveyttä, kun taas koko luku edustaa signaalin jaksoa. Ja se on koko salaisuus.

CPU havaitsee nämä siirtymät laitteiston keskeytysten kautta. SAMD21: ssä on useita kelloja; koodini käyttää TC3 onea. Aluksi olen lukenut M0: n tietolomakkeen, joka on paljon vaivaa keskeytyksenkäsittelijän koodaamiseksi, mutta pian olen löytänyt erittäin paljon liittyvää koodia käyttäjien electro_95, MartinL ja Rucus Arduino Forum -postauksista. asianmukaisesti tunnustettu. Olen sisällyttänyt ja muuttanut niiden yhdistetyn koodin omaani; säästää paljon aikaa!

Kuten aiemmin mainitsin, signaalin resoluutio on rajoitettu ~ 106 CPU -syklillä koodin suorittamiseksi keskeytysten välillä. Digitaalinen jako pulssileveyden säilyttämällä huolehtii korkeista taajuuksista. Matalat taajuudet taas aiheuttavat uuden haasteen: koska TC3 -kellolaskuri on 16 bittiä pitkä, se ylittää 65, 536 lukurajan ylityksen jälkeen. Tätä tilannetta voidaan käsitellä lisäämällä ylivuotokeskeytys, mutta valittiin toinen ratkaisu: TC3 voi käyttää esiasetettua (eli ohjelmistojakoista) CPU-kelloa laitteiston 48 MHz: n sijasta. Siten jos signaalin jakso lähestyy ylivuotorajaa, koodi voi neuvoa TC3: a käyttämään 24 MHz: n lukuja seuraavalla jaksolla ja, voila, laskuri laskee alle 32 768 lukua. Vielä alemmilla taajuuksilla TC3 voidaan neuvoa laskemaan 12 MHz pulsseja jne. Sopiva esiasetin määritetään automaattisesti signaalin taajuuden perusteella hystereesillä, jotta TC3 -laskuri pysyy ylivuotorajan sisällä. Tämän seurauksena laitteen kantaman alaraja on noin 43 Hz.

Voit haarukoida koodin ja käyttää sitä projektissasi, mutta mainitse sen lähde, kun julkaiset tuloksia.

Linkki koodiin.