Sisällysluettelo:
- Vaihe 1: Vanhan koulun taajuuksien laskenta
- Vaihe 2: Vastavuoroinen tapa
- Vaihe 3: Laitteisto ja sen kaavio
- Vaihe 4: Koodi
- Vaihe 5: Tarkkuus ja tarkkuus
Video: Korkean resoluution taajuuslaskuri: 5 vaihetta (kuvien kanssa)
2024 Kirjoittaja: John Day | [email protected]. Viimeksi muokattu: 2024-01-30 08:59
Tämä ohje näyttää vastavuoroisen taajuuslaskurin, joka pystyy mittaamaan taajuuksia nopeasti ja kohtuullisella tarkkuudella. Se on valmistettu vakiokomponenteista ja voidaan tehdä viikonloppuna (kesti vähän kauemmin:-))
EDIT: Koodi on nyt saatavilla GitLabissa:
gitlab.com/WilkoL/high-resolution-frequency-counter
Vaihe 1: Vanhan koulun taajuuksien laskenta
Vanhan koulun tapa mitata signaalin taajuus on käyttää loogista AND-porttia, syöttää mitattava signaali yhteen porttiin ja täsmälleen 1 sekuntia korkea signaali toiseen porttiin ja laskea lähtö. Tämä toimii hyvin muutaman GHz: n signaaleille. Mutta entä jos haluat mitata matalataajuisen signaalin hyvällä resoluutiolla? Oletetaan, että haluat mitata verkkotaajuuden (tässä 50 Hz). Vanhan koulun menetelmällä näet vakion 50 näytölläsi, jos olet onnekas, mutta todennäköisemmin näet näytön kytkimen 49: stä 50: een tai 50: stä 51. Resoluutio on 1 Hz, ja siinä kaikki. Et koskaan näe 50,002 Hz, ellet ole valmis nostamaan porttiaikaa 1000 sekuntiin. Se on yli 16 minuuttia yhdellä mittauksella!
Parempi tapa mitata matalataajuisia signaaleja on mitata niiden aika. Verkkoesimerkki on jälleen 20 millisekuntia. Ota sama logiikka-AND-portti, syötä se esimerkiksi 10 MHz: llä (0,1 us pulssia) ja signaalisi toisessa portissa ja ulos tulee 200000 pulssia, joten ajanjakso on 20000,0 uS ja se muuttuu takaisin 50 Hz: ksi. Kun mittaat vain 199650 pulssia, taajuus on 50,087 Hz, mikä on paljon parempi, ja se on vain sekunnissa. Valitettavasti tämä ei toimi hyvin korkeammilla taajuuksilla. Otetaan esimerkiksi, että haluamme nyt mitata 40 kHz. Samalla 10 MHz: n tulotaajuudella kuin vertailuarvo mitataan nyt vain 250 pulssia. Kun laskemme vain 249 pulssia, laskelma antaa 40161 Hz ja 251: llä tulos on 39840 Hz. Se ei ole hyväksyttävä päätös. Tietysti vertailutaajuuden lisääminen parantaa tuloksia, mutta mikro -ohjaimessa käytettävälle on raja.
Vaihe 2: Vastavuoroinen tapa
Ratkaisu, joka toimii sekä matalalla että korkealla taajuudella, on vastavuoroinen taajuuslaskuri. Yritän selittää sen periaatteen. Aloitat mittausajasta, joka on noin 1 sekunti, sen ei tarvitse olla kovin tarkka, mutta se on kohtuullinen aika mittaukselle. Syötä tämä 1 Hz: n signaali D-tulon D-flipflopiin. Lähdössä ei vielä tapahdu mitään. Liitä mitattava signaali D-flipflopin CLOCK-tuloon.
Heti kun tämä signaali siirtyy LOW: sta HIGH: iin, D-flipflopin lähtö siirtää D-sisääntulon tilan lähtöön (Q). Tätä nousevaa signaalia käytetään laskemaan tulosignaali sekä referenssikellosignaali.
Joten lasket KAKSI signaalia täsmälleen samaan aikaan, mitattavan signaalin ja viitekellon. Tällä vertailukellolla on oltava tarkka arvo ja sen on oltava vakaa, normaali kideoskillaattori on hieno. Arvo ei ole kovin tärkeä, kunhan se on korkea taajuus ja sen arvo tiedetään hyvin.
Jonkin ajan kuluttua, esimerkiksi muutaman millisekunnin kuluttua, saat D-flipflopin D-tulon jälleen alhaiseksi. Seuraavassa CLOCK-tulossa lähtö Q seuraa tulon tilaa, mutta mitään muuta ei tapahdu, koska mikro-ohjain on asetettu reagoimaan vain RISING-signaaliin. Sen jälkeen kun mittausaika on kulunut (noin 1 sekunti), D-tulo on HIGH.
Jälleen seuraavassa CLOCK-tulossa Q-lähtö seuraa ja tämä RISING-signaali laukaisee mikro-ohjaimen, tällä kertaa molempien laskureiden laskemisen lopettamiseksi.
Tuloksena on kaksi numeroa. Ensimmäinen numero on vertailusta laskettujen pulssien lukumäärä. Kuten tiedämme vertailutaajuuden, tiedämme myös ajan, joka kului näiden pulssien laskemiseen.
Toinen luku on mittaamamme tulosignaalin pulssien lukumäärä. Kun aloitimme täsmälleen tämän signaalin RISING -reunoista, olemme erittäin varmoja tämän tulosignaalin pulssien määrästä.
Nyt se on vain laskelma tulosignaalin taajuuden määrittämiseksi.
Oletetaan esimerkiksi, että meillä on nämä signaalit ja haluamme mitata f-tuloa. Ohjearvo on 10 MHz, joka on muodostettu kvartsikiteellä. f_tulo = 31,416 Hz f_reference = 10000000 Hz (10 MHz), mittausaika on n. 1 sekunti
Tänä aikana laskimme 32 pulssia. Nyt tämän signaalin yksi jakso kestää 1/31,416 = 31830,9 uS. Joten 32 jaksoa kesti 1,0185892 sekuntia, mikä on hieman yli 1 sekunti.
Tässä 1,0186 sekunnissa olemme myös laskeneet 10185892 vertailusignaalin pulssia.
Tämä antaa meille seuraavat tiedot: input_count = 32 reference_count = 10185892 f_reference = 10000000 Hz
Tuloksena olevan taajuuden laskentakaava on seuraava: freq = (input_count * f_reference) / ref_count
Esimerkissämme tämä on: f-input = (32 * 10000000) / 10185892 = 31,416 Hz
Ja tämä toimii hyvin sekä matalilla että korkeilla taajuuksilla, vain kun tulosignaali tulee lähelle (tai jopa korkeammalle) vertailutaajuutta, on parempi käyttää vakiomallista "aidattua" mittausmenetelmää. Mutta sitten voimme myös yksinkertaisesti lisätä taajuudenjakajan tulosignaaliin, koska tällä vastavuoroisella menetelmällä on sama resoluutio mille tahansa taajuudelle (viitearvoon asti). Joten mittaatko 100 kHz suoraan jaettuna ulkoisella 1000x -jakajalla, resoluutio on sama.
Vaihe 3: Laitteisto ja sen kaavio
Olen tehnyt muutamia tämän tyyppisiä taajuuslaskureita. Kauan sitten tein yhden ATMEGA328: lla (sama ohjain kuin Arduinolla), myöhemmin ST: n ARM -mikro -ohjaimilla. Viimeisin tehtiin STM32F407 -kellolla, jonka kellotaajuus oli 168 MHz. Mutta nyt mietin, mitä jos teen saman paljon pienemmän * kanssa. Valitsin ATTINY2313: n, jossa on vain 2 kilotavua FLASH -muistia ja 128 tavua RAM -muistia. Minulla on MAX7219 -näyttö, jossa on 8 seitsemän segmentin näyttöä, nämä näytöt ovat saatavilla Ebayssa vain 2 eurolla. ATTINY2313 voidaan ostaa noin 1,5 eurolla, muut käyttämäni osat maksavat vain senttiä kappale. Kallein oli luultavasti muoviprojektirasia. Myöhemmin päätin saada sen toimimaan litiumioniakulla, joten minun piti lisätä (LDO) 3,3 V jännitteenvakaaja, akun latausmoduuli ja itse akku. Tämä nostaa hintaa jonkin verran, mutta luulen, että se voidaan rakentaa alle 20 eurolla.
Vaihe 4: Koodi
Koodi kirjoitettiin C: llä Atmel (Microchip) Studio 7: llä ja ohjelmoitiin ATTINY2313: een OLIMEX AVR_ISP (klooni?) -Ohjelmalla. Avaa (main.c) alla olevassa zip -tiedostossa, jos haluat seurata tämän kuvausta.
ALOITTAMINEN
Ensinnäkin ATTINY2313 asetettiin käyttämään ulkoista kideä, koska sisäinen RC-oskillaattori on hyödytön mittaamaan mitään. Käytän 10 MHz: n kristallia, joka viritetään oikeaan 10 000 000 Hz: n taajuuteen pienellä muuttuvalla kondensaattorilla. Alustus huolehtii porttien asettamisesta tuloille ja lähtöille, ajastimien asettamisesta ja MAX7219: n keskeytysten ja alustuksen mahdollistamisesta. TIMER0 on määritetty laskemaan ulkoinen kello, TIMER1 sisäinen kello ja myös mittaamaan D-flipflopista tulevan ICP: n nousevan reunan laskurin arvon.
Puhun pääohjelmasta viimeisenä, joten seuraavaksi ovat keskeytysrutiinit.
TIMER0_OVF
Koska TIMER0 laskee jopa 255 (8 bittiä) ja kääntyy sitten nollaan, tarvitsemme keskeytyksen ylivuotojen määrän laskemiseksi. Se on kaikki, mitä TIMER0_OVF tekee, laske vain ylivuotojen määrä. Myöhemmin tämä luku yhdistetään itse laskurin arvoon.
TIMER1_OVF
TIMER1 voi laskea jopa 65536 (16 bittiä), joten keskeytys TIMER1_OVF laskee myös ylivuotojen määrän. Mutta se tekee enemmän. Se myös pienenee 152: sta 0: een, mikä kestää noin 1 sekunnin, ja asettaa sitten lähtönastan, joka menee flipflopin D-tuloon. Ja viimeinen asia, joka tehdään tässä keskeytysrutiinissa, on vähentää aikakatkaisijaa laskemalla 765: stä 0: een, mikä kestää noin 5 sekuntia.
TIMER1_CAPT
Tämä on TIMER1_CAPT-keskeytys, joka laukeaa aina, kun D-flipflop lähettää sille signaalin tulosignaalin nousevalla reunalla (kuten edellä on selitetty). Tallennuslogiikka huolehtii TIMER1 -laskurin arvon tallentamisesta sieppaushetkellä, se tallennetaan samoin kuin ylivuotolaskuri. Valitettavasti TIMER0: lla ei ole sisääntulotoimintoa, joten tässä luetaan sen nykyinen arvo ja sen ylivuotolaskurin nykyinen arvo. Viesti-muuttuja on asetettu yhdeksi pääohjelmalle kertomaan, että tämä on uutta tietoa.
Seuraavaksi on kaksi toimintoa MAX7219: n ohjaamiseen
SPI
Vaikka sirussa on saatavilla Universal Serial Interface (USI), päätin olla käyttämättä sitä. MAX7219 -näyttöä on ohjattava SPI: n kautta, ja se on mahdollista USI: n kanssa. Mutta SPI: n bitbanging on niin yksinkertaista, että en ottanut aikaa tehdä sitä USI: n kanssa.
MAX7219
Myös protokolla MAX7219: n asettamiseksi on melko yksinkertainen, kun olet lukenut sen käyttöoppaan. Se tarvitsee 16 -bittisen arvon jokaiselle numerolle, joka koostuu 8 -bittisestä numeron numerosta (1-8) ja sen jälkeen 8 -bittisestä numerosta.
MAIN-PROG
Viimeinen asia on selittää pääohjelma. Se toimii äärettömässä silmukassa (kun taas (1)), mutta tekee itse asiassa vain jotain, kun keskeytysrutiinista tulee viesti (1) tai kun aikakatkaisulaskuri on laskenut nollaan (ei tulosignaalia).
Ensimmäinen tehtävä, kun muuttujasanoma on asetettu yhdeksi, on nollata aikakatkaisulaskuri, kun tiedämme, että signaali on läsnä. D-flipflop nollataan, jotta se on valmis seuraavaan liipaisimeen, joka tulee mittausajan jälkeen (odota sekunti).
Kaappauksen keskeytykseen rekisteröidyt numerot lisätään viite- ja tulotaajuuslaskennan saamiseksi. (meidän on varmistettava, että viite ei koskaan voi olla nolla, koska jaamme sen myöhemmin)
Seuraavaksi lasketaan todellinen taajuus. En todellakaan halua käyttää kelluvia numeroita mikrokontrollerissa, jossa on vain 2 kilotavua salamaa ja vain 128 tavua RAM -muistia, joita käytän kokonaislukuja. Mutta taajuudet voivat olla kuin 314,159 Hz, useita desimaaleja. Siksi kerron tulotaajuuden vertailutaajuuden lisäksi myös kertoimella ja lisään sitten luvun desimaalipisteen kohdalle. Nämä luvut tulevat erittäin suuriksi, kun teet sen. Esim. Kun tulo on 500 kHz, viite 10 MHz ja kerroin 100, tämä antaa 5 x 10^14, se on todella valtava! Ne eivät sovi 32 -bittiseen numeroon, joten käytän 64 -bittisiä numeroita, jotka ovat aina 1,8 x 10^19 asti (mikä toimii hyvin ATTINY2313: ssa)
Ja viimeinen asia on lähettää tulos MAX7219 -näyttöön.
Koodi kokoaa noin 1600 tavua, joten se sopii ATTINY2313: n 2048 tavun salamaan.
Sulakerekisterien pitäisi lukea näin:
LAAJENNETTU 0xFF
KORKEA 0xDF
MATALA 0xBF
Vaihe 5: Tarkkuus ja tarkkuus
Tarkkuus ja tarkkuus ovat kaksi erillistä petoa. Tarkkuus on seitsemän numeroa, mikä todellinen tarkkuus riippuu laitteistosta ja kalibroinnista. Kalibroin 10 MHz (5 MHz testipisteessä) toisella taajuuslaskurilla, jossa on GPS -kurinalainen oskillaattori.
Ja se toimii melko hyvin, alin kokeiltu taajuus on 0,2 Hz, korkein 2 MHz. Se on paikallaan. Yli 2 MHz: n yläpuolella ohjain alkaa katkaista keskeytyksiä, mikä ei ole yllättävää, kun tiedät, että 2 MHz: n tulosignaalilla TIMER0 tuottaa yli 7800 keskeytystä sekunnissa. Ja ATTINY2313: n on tehtävä myös muita asioita, AJASTIMEN1 keskeytykset, toisella 150 keskeytyksellä sekunnissa ja tietysti suoritettava laskelmat ohjaamalla näyttöä ja D-flipflopia. Kun katsot todellista laitetta, huomaat, että käytän vain seitsemää näytön kahdeksasta numerosta. Teen tämän useista syistä.
Ensimmäinen on se, että tulotaajuuden laskeminen on jako, sillä on lähes aina jäännös, jota et näe, koska se on kokonaislukujako. Toinen on se, että kvartsikiteiden oskillaattori ei ole vakaa lämpötila.
Kondensaattorit, jotka virittävät sen oikealle 10 MHz: lle, ovat keraamisia, erittäin herkkiä lämpötilan muutoksille. Sitten on se tosiasia, että TIMER0: ssa ei ole kaappauslogiikkaa, ja keskeytystoiminnot vievät jonkin aikaa tehdäkseen työnsä. Mielestäni seitsemän numeroa riittää joka tapauksessa.
Suositeltava:
Korkean resoluution verkkokamera: 9 vaihetta (kuvien kanssa)
Korkean resoluution verkkokamera: Käytin joitakin vuosia RPi -pohjaista verkkokameraa (PiCam -moduulin kanssa). Tuotetut kuvat olivat kunnossa, mutta sitten oli hetki, jolloin en ollut enää tyytyväinen laatuun. Päätin tehdä korkean resoluution verkkokameran. Seuraavat osat ovat
OpenLogger: Korkean resoluution, Wi-Fi käytössä, avoimen lähdekoodin, kannettava dataloggeri: 7 vaihetta
OpenLogger: Korkean resoluution, Wi-Fi käytössä, avoimen lähdekoodin, kannettava dataloggeri: OpenLogger on kannettava, avoimen lähdekoodin, edullinen ja korkearesoluutioinen dataloggeri, joka on suunniteltu tarjoamaan korkealaatuisia mittauksia ilman kalliita ohjelmistoja tai kirjoitusohjelmistoja tyhjästä. Jos olet insinööri, tiedemies tai harrastaja, joka ei
Korkean resoluution PWM -signaalin luominen RC -servoille STM32 -laitteilla: 3 vaihetta
Korkean resoluution PWM -signaalin luominen RC -servoille STM32 -laitteilla: Tällä hetkellä rakennan RC -lähetintä/-vastaanotinta SX1280 -RF -sirun perusteella. Yksi projektin tavoitteista on, että haluan 12 -bittisen servotarkkuuden tikkuista aina servoihin asti. Osittain siksi, että nykyaikaisissa digitaalisissa servoissa on 12 -bittinen reso
Korkean tarkkuuden etätietojen tallennus yleismittarilla/Arduino/pfod -sovelluksella: 10 vaihetta (kuvien kanssa)
Korkean tarkkuuden etätietojen kirjaus yleismittarilla/Arduino/pfod -sovelluksella: Päivitetty 26. huhtikuuta 2017 Tarkistettu piiri ja kortti käytettäväksi 4000ZC USB -mittarien kanssa. Ei Android -koodausta kirjautumiseen ja
Kuinka saada korkean resoluution kuvat pois ohjeista: 4 vaihetta
Kuinka saada korkean resoluution kuvat pois opetusmateriaaleista: Nautitko todella siitä ohjeellisesta kuvasta ja haluatko tallentaa siitä korkean resoluution kopion? Tämä hieno pieni ominaisuus jää helposti huomiotta