AVR-taajuuslaskuri t0 pulssiluku. Kotitekoinen taajuuslaskuri ATTINY2313:ssa. mikro-ohjainohjelmisto

Tämä oppitunti tulee olemaan melko yksinkertainen. Toivon, että olet oppinut hyvin aiemmat materiaalit: oppitunti ajastimista ja painikkeiden ohjaimista.

Ymmärtääkseni, miksi ulkoisia keskeytyksiä tarvitaan, annan yksinkertaisen esimerkin: oletetaan, että käytät pääohjelman silmukassa viiveitä (esimerkiksi LEDin vilkkumiseen), kun taas sinun on käytettävä painiketta LED-valon vaihtamiseksi toiseen tilaan. . Jos painikkeen käsittely on pääsilmukassa, sinun on odotettava, kunnes kaikki koodinpalat on käsitelty ja jono saavuttaa painikkeen käsittelyn. Joskus se ei ole kätevää.

Siksi mikro-ohjaimet keksivät niin kätevän asian kuin ulkoinen keskeytys. Tämä tarkoittaa, että kun signaali syötetään mikro-ohjaimen nastalle, pääohjelma pysähtyy ja keskeytystoimintoon kirjoittamasi koodi alkaa suorittaa. Tämän toiminnon suorittamisen jälkeen pääohjelma jatkaa suoritusta siitä, missä se keskeytettiin.

Ulkoisille keskeytyksille allokoitujen nastojen määrä riippuu mikro-ohjaimen tyypistä, esimerkiksi atmega8:ssa niitä on 2, atmega16:ssa 3. Niitä kutsutaan nimellä INT0, INT1 jne.

Keskeytyksen voi laukaista nousevan reunan signaalin nousu, laskevan reunan putoaminen, mikä tahansa muutos Mikä tahansa muutos, matala taso matala taso. Ohjatussa toiminnossa se näyttää tältä:

Mieti nyt esimerkkinä epätavallinen käyttö ulkoinen keskeytys - taajuuslaskuri.

Oletetaan, että sykkivä signaali syötetään nastalle, joka on määritetty ulkoista keskeytystä varten. Vastaavasti jokainen jakso laukaisee keskeytyksen, voimme laskea niiden lukumäärän vain yhdessä sekunnissa.

Aseta ajastin 1 laukeamaan kerran sekunnissa, kuten oppitunnissa 5. Kun ajastimen keskeytys laukeaa, nollaamme laskurin ja näytämme tuloksen näytöllä.

#sisältää // Aakkosnumeeriset LCD-moduulin toiminnot#asm .equ __lcd_port= 0x18 ; PORTB #endasm #include #sisältää etumerkitön pitkä i = 0, frekv = 0; char lcd_buf[33] ; keskeytä [ EXT_INT0] void ext_int0_isr(void ) ( i++; ) keskeytä [ TIM1_COMPA] void timer1_compa_isr(void ) ( Freq= i; i= 0 ; TCNT1H= 0x00 ; TCNT1L (void) 0x0 main // Ilmoita paikalliset muuttujat tässä // Tulo-/lähtöporttien alustus// Portin B alustus // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // Tila7=T-tila6=T-tila5=T-tila4=T-tila3=T-tila2=T-tila1=T-tila0=T PORTB=0x00 ; DDRB=0x00; PORTD=0xFF ; DDRD=0x00; // Ajastin/Laskuri 1 alustus// Kellon lähde: Järjestelmän kello // Kellon arvo: 7,813 kHz // Tila: Normaali top=FFFFh // OC1A-lähtö: Discon. // OC1B-lähtö: Discon. // Melunvaimennus: Pois // Syötä kaappaus Falling Edgessä // Ajastin 1 ylivuotokeskeytys: Pois // Syötön kaappauskeskeytys: Pois // Vertaa ottelun keskeytystä: Päällä // Vertaa B Match Interrupt: Off TCCR1A=0x00; TCCR1B=0x05; TCNT1H = 0x00; TCNT1L= 0x00 ; ICR1H = 0 x 00; ICR1L=0x00; OCR1AH=0x1E; OCR1AL=0x85; OCR1BH = 0x00; OCR1BL=0x00; // Ulkoisten keskeytysten alustus// INT0: Päällä // INT0 Tila: Rising Edge // INT1: Pois GICR|= 0x40 ; MCUCR=0x03; GIFR=0x40; // Ajastin(t)/Laskuri(t) Keskeytysten alustus TIMSK=0x10 ; // Yleinen käyttöönotto keskeyttää #asm("sei") lcd_init(8) ; while (1 ) ( sprintf (lcd_buf, "freq=%d" , freq) ; lcd_gotoxy(0 , 0 ) ; lcd_puts(lcd_buf) ; ) ; )

#sisältää // Aakkosnumeerisen LCD-moduulin toiminnot #asm .equ __lcd_port=0x18 ;PORTB #endasm #include #sisältää etumerkitön pitkä i = 0, frekv = 0; char lcd_buf; keskeytä void ext_int0_isr(void) ( i++; ) keskeytä void timer1_compa_isr(void) ( freq=i; i=0; TCNT1H=0x00; TCNT1L=0x00; ) void main(void) ( // Ilmoita paikalliset muuttujat tässä // /lähtöporttien alustus // Portin B alustus // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // Tila7=T-tila6=T-tila5=T-tila4=T-tila3 =T Tila2=T Tila1=T Tila0=T PORTB=0x00; DDRB=0x00; PORTD=0xFF; DDRD=0x00; // Ajastin/Laskuri 1 alustus // Kellon lähde: Järjestelmän kello // Kellon arvo: 7,813 kHz // Tila: Normaali top=FFFFh // OC1A-lähtö: Discon. // OC1B-lähtö: Discon. // Melunvaimennus: Pois // Tulon sieppaus laskevalla reunalla // Ajastin 1 Ylivuotokeskeytys: Pois // Tulon sieppauskeskeytys: Pois // Vertaa A Match Interrupt: On // Vertaa B Match Interrupt: Off OCR1BL=0x00 // Ulkoisten keskeytysten alustus // INT0: Päällä // INT0 Tila: Rising Edge // INT1: Pois GICR|=0x40; MCUCR=0x03; GIFR=0x40; // Ajastin(t)/laskuri(t) Keskeytyksen(t) alustus TIMSK=0x10; // Yleiset sallivat keskeytykset #asm("sei") lcd_init(8); while (1) ( sprintf(lcd_buf,"freq=%d",freq); lcd_gotoxy(0,0); lcd_puts(lcd_buf); ); )

Taajuusmittari on hyödyllinen laite radioamatöörilaboratoriossa (varsinkin jos oskilloskooppia ei ole saatavilla). Taajuusmittarin lisäksi itseltäni puuttui usein kvartsiresonaattoritesteri - Kiinasta alkoi tulla liian paljon avioliittoa. Se tapahtui useammin kuin kerran, että kokoat laitteen, ohjelmoit mikro-ohjaimen, tallennat sulakkeita niin, että se kellotetaan ulkoisesta kvartsista ja siinä se - sulakkeiden tallennuksen jälkeen ohjelmoija lakkaa näkemästä MK:ta. Syynä on "rikkoutunut" kvartsi, harvemmin "buginen" mikro-ohjain (tai kiinalaisten huolella merkintä uudelleen lisäyksellä, esim. kirjain "A" lopussa). Ja törmäsin jopa 5% sellaisesta viallisesta kvartsista erästä. Muuten, melko tunnettu kiinalainen taajuusmittarisarja, jossa on kvartsitesteri PIC-mikrokontrollerissa ja LED-näyttö Aliexpressistä, en kategorisesti pitänyt siitä, koska usein taajuuden sijaan se näytti joko säätä Zimbabwessa tai "epämiellyttävien" harmonisten taajuuksia (no, tai sitten minulla ei ollut onnea).

Ensimmäisen taajuuslaskuripiirin ominaisuus AVR mikro-ohjain on, että se toimii yhdessä tietokoneen kanssa ja on yhdistetty emolevy IRDA-liittimen kautta. Rakenne saa virtaa samasta liittimestä. Toinen taajuuslaskuripiiri perustuu Attiny2313-mikrokontrolleriin ja pystyy mittaamaan taajuuksia 10 MHz:iin asti. Kolmas harkittu taajuuslaskurin malli on rakennettu legendaarisen Arduino-kortin pohjalle, jonka pohjana on myös AVR-mikro-ohjain.

Taajuuslaskuripiiri koostuu Attiny2313-mikroprosessorista ja 74AC161-binäärilaskurista. Tuleva signaali vahvistusta varten se seuraa transistoria VT1, sitten sen kollektorilähdöstä se tulee binäärilaskurin tuloon "C". Laskurin toiminnan ohjaus on määritetty Attiny2313 MK:lle, joka nollaa, pysäyttää tai käynnistää laskennan syöttämällä ohjaussignaalin kymmenenteen lähtöön.


Siirtämällä lyhyesti loogisen nollan binäärilaskurin nollaustuloon, MK nollaa sen ja lähettää sen jälkeen loogisen yksikön tason EP-tuloon, aloittaa toimintansa. Sitten hän laskee pulsseja laskurin merkittävimmän numeron lähdöstä puolen sekunnin ajan.

AVR-mikro-ohjaimen taajuusmittari. Tietosignaalit tietokoneeseen tulevat Attiny2313 PD6 -portista. PB1-porttilinjaa käytetään tietokoneesta tuleviin kellosignaaleihin.

Alkuhetkellä MC generoi noin 1,6 μs kestävän aloituspulssin, jonka jälkeen on tauko. Ohjelma käyttää ajoittain 2F8H-porttia ja käynnistää tavun rekisteröinnin yhteydessä kellopulssien lähetyksen. Nämä synkronointipulssit menevät, kun numero nolla lähetetään tietokoneen infrapunaporttiin. Pulssien koostumus: Ensimmäinen bitti on alku ja 8 bittiä on numero nolla.

Kun logic-one-taso havaitaan, mikro-ohjain aloittaa lähetyksen lähettämällä ensimmäisen käynnistyspulssin, asettamalla datalinjan loogiseksi ykköseksi ja odottamalla kellolinjan putoamista, jotta se voi lähettää datapulsseja. Jos databitti on nolla, asetetaan "1".

Koska lähetys- ja vastaanottonopeudet ovat samat, voit päästä riippumattomaksi tietokoneen IR-portin asetetusta nopeudesta.

Ponyprog-ohjelman ja itse laiteohjelmiston sulakkeet ovat saatavilla yllä olevasta vihreästä linkistä.

Tässä yksinkertaisessa taajuuslaskuriprojektissa Arduino-ohjain lukee jännitteen, laskee sitten sen taajuuden ja lähettää tiedot USB UART:n kautta tietokoneelle, johon sinun on asennettava tiedonluku- ja visualisointiohjelma, sovellus ja luonnos latauksessa. arkisto.

Arduino-kortti luo tarkan yhden sekunnin aikaperustan laskurilla peräkkäin kaksi ajastinta timer0 ja timer2. Digitaalitulojen 3 ja 4 välinen linkki yhdistää ajastimen 2 lähdön (250 Hz) ajastimen 0 tuloon. Ohjelmakoodi odottaa, että ajastimen 0 lähdöstä tulee positiivinen ja aloittaa tulosignaalin taajuuden ajoituksen ajastimella 1 Timer1 on 16-bittinen ajastin, se ylivuotaa kun saavutetaan arvo 2 16, jonka jälkeen ylivuotorekisterin overF arvo muuttuu. Ensimmäisen sekunnin lopussa kirjoitetaan 16-bittinen rekisteri. Arduino lähettää sitten 6 tavua tietoa tietokoneelle. Arduinon kytkentäkaavio on yksinkertainen, ja näet sen alla olevasta kuvasta.

Ensin Arduino pitää liittää tietokoneeseen ja vasta sitten käynnistää Visual Basc 6. Sovellus etsii Com-portin, lähettää tavuja ja odottaa niiden saamista takaisin. Tämä kestää muutaman sekunnin. Sovellus on poistettava käytöstä, kun päivität levyn Arduino IDE:n kautta. Arduino-levyn taajuustulo edustaa TTL-signaalitasoja, heikolla signaalilla sinun on lisättävä vahvistin.

PIC16F628A MK:lla voidaan valmistaa erittäin hyödyllinen ja yksinkertainen laite, joka on yksinkertaisesti välttämätön radioamatöörin luovassa laboratoriossa. Tämä digitaalinen taajuusmittari on suunniteltu 30 MHz:n taajuuksien mittaamiseen tavalliselle PIC16F628A-ohjainpiirille. Hänen piirikaavio koostuu perusmoduulista, jonka laskentatuloon on kytketty tuloohjain. Taajuusmittarin piiri näkyy alla olevassa kuvassa:

The mittauslaite voidaan käyttää kahdessa tilassa - digitaalinen vaaka ja taajuusmittari. Kun virta kytketään päälle, taajuusmittari siirtyy tilaan, jossa se toimi ennen viimeistä virrankatkaisua. Jos se oli taajuuslaskuritila, taajuuslaskuritila "F." näkyy ilmaisimen vasemmassa numerossa. Myös "0" näkyy ilmaisimen alemman asteen numerossa. Taajuusmittari siirtyy automaattisesti taajuuden mittaustilaan ja on valmiustilassa. Kun signaali syötetään tuloon, taajuuslaskuritilan etumerkki on "F". sammuu ja ilmaisin näyttää mitatun taajuuden arvon kilohertseinä.
Taajuusmittarin tuloohjaimen kaavio - digitaalinen asteikko on esitetty kuvassa:


Jos virran kytkemisen yhteydessä taajuusmittarin sisääntulossa on mitattu signaali, virran kytkemisen jälkeen taajuusmittarin merkki "F." syttyy 1 sekunniksi ja mene sitten ulos.
0,1 sekunnin mittausajan vaihtamiseksi. tai 10 sekuntia, sinun on painettava jompaakumpaa painiketta nro 1 tai samanaikaisesti painikkeita nro 1 ja painikkeita nro 2 (katso taajuuslaskuritilan näppäimistöasettelu), odota sitten, että desimaalipilkun paikka muuttuu ja vapauta sitten painike (painikkeet). Jos sen jälkeen on tarpeen palata 1 sekunnin mittausaikaan, on painettava painiketta nro 2 ja odotettava desimaalipisteen paikan muutosta ja vapautettava painike. Jokaisella mittausajalla desimaalipiste merkitsee kilohertsejä.


Laskuritilan näppäimistöasettelu

Painike nro 1 0,1 sek. Vaihto mittausaikaan 0,1 sek.
Painike #2 1 sek. Vaihda mittausaikaan 1 sek.
Painike #1 +
painike nro 2 10 sek. Vaihda mittausaikaan 10 sekuntia.
(painikkeita painetaan samanaikaisesti)

Jos ennen virran katkaisemista työskenteli digitaalivaakatilassa, seuraavan kerran kun virta kytketään päälle, tämä tila asetetaan ja digitaalisen vaakatilan sisällä täsmälleen alitila ("miinus IF" tai "plus IF" ”) asetetaan, jossa työ tehtiin viimeiseen virrankatkaisuun asti. Digitaalisen asteikon alitilojen merkit ("L." tai "H.") näkyvät jatkuvasti ilmaisimen vasemmassa numerossa. Jos digitaalivaa'an sisääntulossa ei ole signaalia, osoitin näyttää säätimen muistiin tallennetun välitaajuuden arvon ja jos se on olemassa, tulossa olevan signaalin taajuuden vähentämisen tai lisäämisen tulos. digitaalisen asteikon arvo ja PIC-ohjaimen haihtumattomaan muistiin tallennetun välitaajuuden arvo.


Digitaalisessa vaakatilassa on 4 alitilaa.
- Kun painat painiketta nro 1, alitila "miinus JOS" tulee näkyviin.
- Tässä tapauksessa ilmaisimen vasemmassa numerossa näkyy alitilan merkki "L."
- Kun painat painiketta nro 2, siirtyy "plus IF" -alitilaan.
- Tässä tapauksessa ilmaisimen vasemmassa numerossa näkyy alitilan merkki "H."

Ohjaimen "vilkkumisprosessissa" välitaajuuden arvo = 5,5 MHz kirjoitetaan sen haihtumattomaan muistiin, mutta sitten se voi itsenäisesti kirjoittaa siihen minkä tahansa arvon ja käyttää sitä väliarvona. Tätä varten sinun on syötettävä ulkoinen signaali digitaalisen signaalin tuloon taajuudella, jota käytetään sitten välisignaalina. Voit säätää tämän taajuuden arvoa vaihtamalla taajuuslaskuritilaan.

Numeerinen mittakaavatilan näppäimistöasettelu:
Painikkeet Ajan mittaus Selitykset
Painike nro 1 "miinus JOS" Välitaajuus vähennetään
mitattu taajuus
Painike nro 2 "plus JOS" Välitaajuus summataan
mitattu taajuus
Painike #1 +
painike nro 2 IF-asetus Kirjoita RAM-arvoon
mitattu taajuus (IF)
Re:
Painike #1 +
painike nro 2 Kirjoita IF Kopioi mitatun taajuuden arvon RAM-muisti haihtumattomaan järjestelmään sen jatkokäyttöä varten välituotteena


Kun vaihdat käyttötilaa, näppäimistön asettelu muuttuu. Jos painiketta nro 1 painetaan alle tietyn ajan, vaihtoa toiseen tilaan ei tapahdu ja painike nro 1 voi joko asettaa mittausajan 0,1 sekuntiin. (taajuuslaskuritilassa) tai ota käyttöön "miinus IF" -alitila (digitaaliskaalatilassa). Jos tämä kynnys ylittyy, tapahtuu vaihto toiseen tilaan. Tämän kynnyksen arvo on noin 4 sekuntia, ja tämä aikaväli lasketaan laskentajakson lopusta, kun painetaan painiketta nro 1.


Voit vähentää taajuuslaskuripiirin virrankulutusta lisäämällä portin B nastat ilmaisimeen yhdistävien vastusten arvoja. Sen suunnittelussa käytin 9-numeroista LED-merkkivaloa Neuvostoliiton AON-puhelimesta, jossa oli yhteinen katodi ja punainen hehku. Taajuusmittarissani on verkkovirran lisäksi myös paristovirtaa (akut). Painettu piirilevy laite näkyy kuvassa:


PIC16F84A-mikro-ohjaimen laiteohjelmisto sekä ohjainta käsittelevän artikkelin koko teksti, lataa tästä. Testasin piirin - ZU77.

Tämä laite on suunniteltu mittaamaan taajuuksia välillä 0-9999 Hz, mutta käytettäessä taajuudenjakajaa tulossa, tämä alue laajenee vastaavasti. Suurin tulojännite on 3 V, mikäli ylimääräistä jännitteenjakajaa ei ole, minimi on 0,15 V, myös jos sitä ei ole. Maksimimittaustaajuutta voidaan pidentää muuttamalla ohjelmakoodia, mutta siitä lisää myöhemmin.

Laitepiiri on suhteellisen yksinkertainen ja näkyy alla:

Piiri perustuu Atmega8A-PU:n valmistamaan 8-bittiseen mikro-ohjaimeen. Mikrokontrollerin ytimen kellotaamiseen käytetään ulkoisella kvartsiresonaattorilla varustettua oskillaattoria. Tällaisen generaattorin valinta johtuu jälkimmäisen taajuusstabiilisuuden vaatimuksista. Osoittimena käytetään seitsemän segmentin nelinumeroista ilmaisinta. LED-merkkivalo yhteisellä anodilla ja dynaamisella ilmaisulla. Ilmaisinsegmenttien virtaa ei rajoita vastukset, koska käytetään dynaamista ilmaisua, ja tietysti virtaa pulssitetaan, jonka indikaattorisegmentit kestävät onnistuneesti, samoin kuin mikro-ohjaimen portti. Syöttösolmu tehdään elementeille R2, D1, D2, C3, R3, R4, R1, Q1. Tämä solmu vahvistaa / rajoittaa sen tuloon tulevia signaaleja (vastus ja diodit taajuuslaskurin sisääntulossa rajoittavat tulosignaalia, transistori on vastuussa signaalin vahvistamisesta TTL-tasolle). Laitteen painettu piirilevy ei myöskään ole monimutkainen. Se on tehty yksipuolisesta foliomateriaalista (alunperin suunniteltiin olevan kaksipuolinen, mutta sitä ei ollut saatavilla, joten päädyin yksipuoliseen). Levyn topologia on esitetty alla.

Mitä tulee mikro-ohjaimen ohjelmaan, se on kehitetty ympäristössä (projektitiedosto on liitteenä). Pulssien laskemiseen käytin keskeytyksiä mikro-ohjaimen INT0-tulossa ja laskenta-ajan rajoittamiseksi ajastinkeskeytyksiä TMR0. Koska tässä ajastimessa on esiskaalaaja, jonka jakokerroin on 1/256 (johtuen siitä, että se on kahdeksannumeroinen), keskeytystaajuus lasketaan seuraavasti: Fprev.=F gen.÷256÷thr. asioihin. Suunnittelussani valitsin 200 Hz:n keskeytystaajuuden. Kuten edellä kirjoitin, mittaustaajuutta voidaan lisätä. Tätä varten sinun tarvitsee vain rajoittaa mittausaikaa. Tämä tehdään muuttamalla koodissa numero 200 2:ksi (mittausaika ei ole 1s, vaan 10ms, rajataajuus on 99999Hz), kuten C:n lähdekoodin kuvassa näkyy.

Mikro-ohjaimen ohjelmoimiseen käytin rinnakkaisohjelmoijaa. Kuten näette, suunnittelussani ulkoista nollausnastaa käytetään normaalina porttina. Jos sinulla ei ole rinnakkaisohjelmoijaa, tässä on piirivaihtoehto, jossa käytetään mikro-ohjaimen porttia D, eikä RESET-nastaa tarvitse käyttää normaalina lähtöporttina.

Tässä on esimerkki sulakkeiden asettamisesta ohjelmaan:

Tässä on kaavio taajuuslaskurivaihtoehdosta, joka käyttää RESET-asetusta aiottuun tarkoitukseen:

Ja myös tässä on piirin toisen version piirin topologia:

Piirin virransyöttöön käytetään stabiloitua 5V virtalähdettä (käytin tietokoneen virtalähdettä, joten piirissä ei ole stabilointielementtejä).

Tässä järjestelmässä ei ole niukkoja osia, mutta luettelon silti luettelon vaihto- ja analogeista. Joten Atmega8A-PU-mikro-ohjain voidaan korvata vastaavalla Atmega8-16PU:lla (jälkimmäinen on muuten parempi). Vastukset voidaan ottaa teholla 0,125 W, lukuun ottamatta R2:ta, on parempi ottaa se 0,5 W:n teholla. Kondensaattorit - generaattorille ovat levy-, keraamisia, ja syöttöyksikölle - mikä tahansa parametrien suhteen sopiva. Transistori voidaan korvata kotimaisella KT3102:lla (kuten kokeet ovat osoittaneet KT315:lle, virransiirtokerroin h21E on liian pieni). Voit ottaa minkä tahansa sopivan kokoisen LED-ilmaisimen (ja ne eivät ole kriittisiä). Kvartsi resonaattori käytetään taajuudella 3267800Hz (3.2768MHz).

Alla on kuvat valmiista laitteesta.

Ensimmäisessä kuvassa on vastus, joka on kytketty RESET MK -virtalähteeseen (vasen toisesta laiteohjelmiston tarkistuksesta, nollauksella).

Luettelo radioelementeistä

Nimitys Tyyppi Nimitys Määrä HuomautusMyymäläOma muistilehtiö
U1 MK AVR 8-bittinen

ATmega8A

1 ATmega 8-16PU Muistioon
Q1 bipolaarinen transistori

KT3102

1 2N3390 Muistioon
VD1, VD2 tasasuuntaajan diodi

1N4148

2 Muistioon
C1, C2 Kondensaattori27 pF2 Muistioon
C3 Kondensaattori22 nF1 Muistioon
R1, R4 Vastus

470 ohmia

2 Muistioon
R2 Vastus

100 ohmia

1
Jos löydät virheen, valitse tekstiosa ja paina Ctrl+Enter.