- Mikä on PWM-signaali?
- PWM käyttäen PIC16F877A:
- PIC: n ohjelmointi tuottamaan PWM-signaaleja:
- Kaaviot ja testaus:
- Työskentely laitteistolla:
Tämä on 10. opetusohjelma PIC-mikrokontrollerien oppimisesta MPLAB: n ja XC8: n avulla. Tähän asti olemme käsittäneet monia perusoppaita, kuten LED-merkkivalo vilkkuu PIC: llä, ajastimet PIC: ssä, LCD-liitännät, 7-segmenttien liittäminen, ADC PIC: n avulla jne. Jos olet ehdottoman aloittelija, vieraile täydellisessä luettelossa PIC-oppaita täällä ja aloita oppiminen.
Tässä opetusohjelmassa opitaan PWM-signaalien luominen PIC PIC16F877A: n avulla. PIC MCU: lla on erityinen moduuli nimeltä Vertaa sieppausmoduulia (CCP), jota voidaan käyttää PWM-signaalien tuottamiseen. Tällöin syntyy 5 kHz: n PWM, jonka vaihteleva käyttöjakso on 0% - 100%. Käyttösyklin vaihtelemiseksi käytämme potentiometriä, joten on suositeltavaa oppia ADC-opetusohjelma ennen PWM: n aloittamista. PWM-moduuli käyttää ajastimia myös taajuuden asettamiseen, joten opi ajastimien käyttö etukäteen täältä. Lisäksi tässä opetusohjelmassa käytämme RC-piiriä ja LEDiä muuntamaan PWM-arvot analogiseksi jännitteeksi ja käytämme sitä LED-valon himmentämiseen.
Mikä on PWM-signaali?
PWM (Pulse Width Modulation) on digitaalinen signaali, jota käytetään yleisimmin ohjauspiireissä. Tämä signaali on asetettu korkealle (5v) ja matalalle (0v) ennalta määritetyssä ajassa ja nopeudessa. Aikaa, jonka aikana signaali pysyy korkealla, kutsutaan “päälläoloaikaksi” ja aikaa, jonka aikana signaali pysyy matalana, ”sammutusajaksi”. PWM: llä on kaksi tärkeää parametria, kuten alla käsitellään:
PWM: n käyttöjakso:
Prosenttiaikaa, jonka aikana PWM-signaali pysyy KORKEAna (ajallaan), kutsutaan työjaksoksi. Jos signaali on aina päällä, se on 100%: n käyttöjaksossa ja jos se on aina pois päältä, se on 0%: n käyttöjakso.
Käyttösykli = Kytke päälle aika / (Kytke päälle aika + Sammuta aika)
PWM: n taajuus:
PWM-signaalin taajuus määrittää kuinka nopeasti PWM suorittaa yhden jakson. Yksi jakso on valmis PWM-signaalin PÄÄLLE ja POIS PÄÄLTÄ, kuten yllä olevassa kuvassa on esitetty. Opetusohjelmassa asetamme taajuudeksi 5KHz.
PWM käyttäen PIC16F877A:
PWM-signaalit voidaan tuottaa PIC-mikrokontrollerissamme käyttämällä CCP (Compare Capture PWM) -moduulia. PWM-signaalin resoluutio on 10-bittinen, eli arvolle 0 tulee olemaan 0%: n työjakso ja arvolle 1024 (2 ^ 10) 100%: n toimintajakso. PIC MCU: ssa on kaksi CCP-moduulia (CCP1 ja CCP2), mikä tarkoittaa, että voimme tuottaa kaksi PWM-signaalia kahdella eri nastalla (nastat 17 ja 16) samanaikaisesti, opetusohjelmassamme käytämme CCP1: tä PWM-signaalien tuottamiseen nastalle 17.
Seuraavia rekistereitä käytetään tuottamaan PWM-signaaleja PIC MCU: n avulla:
- CCP1CON (CCP1-ohjausrekisteri)
- T2CON (ajastin 2 -rekisteri)
- PR2 (ajastin 2 moduulia jaksorekisteri)
- CCPR1L (CCP Register 1 Low)
PIC: n ohjelmointi tuottamaan PWM-signaaleja:
Ohjelmassamme luemme analogisen jännitteen 0-5v potentiometristä ja kartoitamme sen arvoon 0-1024 ADC-moduulimme avulla. Sitten muodostamme PWM-signaalin taajuudella 5000 Hz ja vaihdamme sen työjaksoa analogisen sisääntulojännitteen perusteella. Se on 0–1024 muunnetaan 0–100%: n käyttöjaksoksi. Tässä opetusohjelmassa oletetaan, että olet jo oppinut käyttämään ADC: tä PIC: ssä, jos ei, lue se täältä, koska ohitamme sen yksityiskohdat tässä opetusohjelmassa.
Joten, kun kokoonpanobitit on asetettu ja ohjelma on kirjoitettu lukemaan analoginen arvo, voimme jatkaa PWM: ää.
Seuraavat vaiheet on suoritettava määritettäessä CCP-moduulia PWM-käyttöä varten:
- Aseta PWM-aika kirjoittamalla PR2-rekisteriin.
- Aseta PWM-työjakso kirjoittamalla CCPR1L-rekisteriin ja CCP1CON <5: 4> -bitteihin.
- Tee CCP1-nastasta lähtö poistamalla TRISC <2> -bitti.
- Aseta TMR2-esiasteikon arvo ja ota ajastin2 käyttöön kirjoittamalla T2CON: lle.
- Määritä CCP1-moduuli PWM-käyttöä varten.
Tässä ohjelmassa on kaksi tärkeää toimintoa PWM-signaalien tuottamiseksi. Yksi on PWM_Initialize () -toiminto, joka alustaa PWM-moduulin asettamiseen tarvittavat rekisterit ja asettaa sitten taajuuden, jolla PWM: n tulisi toimia, toinen toiminto on PWM_Duty () -toiminto, joka asettaa PWM-signaalin toimintajakson vaaditut rekisterit.
PWM_Initialize () {PR2 = (_XTAL_FREQ / (PWM_freq * 4 * TMR2PRESCALE)) - 1; // PR2-kaavojen asettaminen tietolomakkeen avulla // PWM toimii 5KHZ CCP1M3 = 1; CCP1M2 = 1; // Määritä CCP1-moduuli T2CKPS0 = 1; T2CKPS1 = 0; TMR2ON = 1; // Määritä ajastinmoduuli TRISC2 = 0; // tee portin tappi C: ksi lähdöksi}
Yllä oleva toiminto on PWM-alustusfunktio, tässä toiminnossa CCP1-moduuli on asetettu käyttämään PWM: ää tekemällä bitit CCP1M3 ja CCP1M2 korkeaksi.
Ajastinmoduulin esiasteikko asetetaan asettamalla bitti T2CKPS0 niin korkeaksi ja T2CKPS1 matalaksi, bitti TMR2ON on asetettu käynnistämään ajastin.
Nyt meidän on asetettava PWM-signaalin taajuus. Taajuuden arvo on kirjoitettava PR2-rekisteriin. Haluttu taajuus voidaan asettaa käyttämällä alla olevia kaavoja
PWM-jakso = * 4 * TOSC * (TMR2-esiasteikon arvo)
Näiden kaavojen uudelleenjärjestäminen PR2: n saamiseksi antaa
PR2 = (jakso / (4 * Tosc * TMR2-esiasetus)) - 1
Tiedämme, että jakso = (1 / PWM_freq) ja Tosc = (1 / _XTAL_FREQ). Siksi…..
PR2 = (_XTAL_FREQ / (PWM_freq * 4 * TMR2PRESCALE)) - 1;
Kun taajuus on asetettu, tätä toimintoa ei tarvitse kutsua uudelleen, ellei ja kunnes meidän on muutettava taajuutta uudelleen. Opetusohjelmassa olen määrittänyt PWM_freq = 5000; jotta voimme saada 5 KHz: n toimintataajuuden PWM-signaalillemme.
Aseta nyt PWM: n käyttöjakso käyttämällä alla olevaa toimintoa
PWM_Duty (allekirjoittamaton tulli) {if (tulli <1023) {tulli = ((kelluva) tulli / 1023) * (_ XTAL_FREQ / (PWM_freq * TMR2PRESCALE)); // Alennuksesta // tulli = (((kelluva) tulli / 1023) * (1 / PWM_freq)) / ((1 / _XTAL_FREQ) * TMR2PRESCALE); CCP1X = tulli & 1; // Tallenna ensimmäinen bitti CCP1Y = duty & 2; // Tallenna 0. bitti CCPR1L = velvollisuus >> 2; // Tallentaa muistin 8 bittiä}}
PWM-signaalillamme on 10-bittinen tarkkuus, joten tätä arvoa ei voida tallentaa yhteen rekisteriin, koska PIC: llä on vain 8-bittisiä datalinjoja. Joten meillä on käytössämme kaksi muuta CCP1CON-bittiä <5: 4> (CCP1X ja CCP1Y) kahden viimeisen LSB: n tallentamiseksi ja loput 8 bitin tallentamiseksi sitten CCPR1L-rekisteriin.
PWM-käyttöjakso voidaan laskea seuraavien kaavojen avulla:
PWM-käyttöjakso = (CCPRIL: CCP1CON <5: 4>) * Tosc * (TMR2-esiasteikon arvo)
Näiden kaavojen uudelleenjärjestäminen CCPR1L- ja CCP1CON-arvojen saamiseksi antaa:
CCPRIL: CCP1Con <5: 4> = PWM-käyttöjakso / (Tosc * TMR2-esiasteikon arvo)
ADC: n arvo on 0-1024, tarvitsemme sen olevan 0% - 100%, joten PWM Duty Cycle = tulo / 1023. Tämän työjakson muuntamiseksi ajanjaksoksi meidän on kerrottava se jaksolla (1 / PWM_freq)
Tiedämme myös, että Tosc = (1 / PWM_freq), siis..
Tulli = (((kelluva) tulli / 1023) * (1 / PWM_freq)) / ((1 / _XTAL_FREQ) * TMR2PRESCALE);
Yllä olevan yhtälön ratkaiseminen antaa meille:
Tulli = ((kelluva) tulli / 1023) * (_XTAL_FREQ / (PWM_freq * TMR2PRESCALE));
Voit tarkistaa koko ohjelman alla olevasta Koodi-osiosta sekä yksityiskohtaisen videon.
Kaaviot ja testaus:
Tarkastakaamme lähtö tavalliseen tapaan Proteus-simulaatiolla. Piirikaavio on esitetty alla.
Liitä potentiometri seitsemään napaan syöttääksesi jännitettä 0-5. CCP1-moduulissa on nasta 17 (RC2), tässä generoidaan PWM, joka voidaan tarkistaa digitaalisella oskilloskoopilla. Tämän muuntamiseksi muuttuvaksi jännitteeksi olemme käyttäneet RC-suodatinta ja LEDiä vahvistamaan lähtö ilman laajuutta.
Mikä on RC-suodatin?
RC-suodatin tai Alipäästösuodin on yksinkertainen piiri, jossa on kaksi passiivisia elementtejä eli vastus ja kondensaattori. Näitä kahta komponenttia käytetään PWM-signaalin taajuuden suodattamiseen ja muuttamiseksi tasajännitteeksi.
Jos tarkastelemme virtapiiriä, kun vaihteleva jännite syötetään R: n tuloon, kondensaattori C alkaa latautua. Kondensaattorin arvon perusteella nyt kondensaattori vie jonkin aikaa täyteen latautumiseen, kun se on ladattu, se estää tasavirtavirran (muista kondensaattorit estää DC: n, mutta sallii AC: n), joten tulo-DC-jännite ilmestyy lähdön yli. Suurtaajuinen PWM (AC-signaali) maadoitetaan kondensaattorin läpi. Siten kondensaattorin yli saadaan puhdas tasavirtalähde. Arvon 1000Ohm ja 1uf todettiin olevan sopiva tähän projektiin. R- ja C-arvojen laskeminen sisältää piirianalyysin siirtofunktion avulla, joka on tämän opetusohjelman ulkopuolella.
Ohjelman tuotos voidaan tarkistaa digitaalisella oskilloskoopilla alla olevan kuvan mukaisesti, vaihda potentiometriä ja PWM: n käyttöjakson tulisi muuttua. Voimme myös havaita RC-piirin lähtöjännitteen Voltmeterillä. Jos kaikki toimii odotetusti, voimme jatkaa laitteistomme käyttöä. Tarkasta videon loppuosa täydestä prosessista.
Työskentely laitteistolla:
Projektin laitteistokokoonpano on hyvin yksinkertainen, aiomme vain käyttää uudelleen alla esitettyä PIC Perf -levyä.
Tarvitsemme myös potentiometrin analogisen jännitteen syöttämiseksi, olen kiinnittänyt pottiin potkuriin joitain naaraspäätyksiä (esitetty alla), jotta voimme liittää ne suoraan PIC Perf -levyyn.
Lopuksi lähdön tarkistamiseksi tarvitsemme RC-piirin ja LEDin, jotta voimme nähdä, kuinka PWM-signaali toimii, olen yksinkertaisesti käyttänyt pientä perf-levyä ja juotanut RC-piirin ja LEDin (kirkkauden säätämiseen) siihen alla olevan kuvan mukaisesti
Voimme käyttää yksinkertaisia naaras-naaras-liitäntäjohtoja ja liittää ne yllä esitettyjen kaavioiden mukaisesti. Kun yhteys on muodostettu, lataa ohjelma PIC: ään käyttämällä pickit3: ta ja sinun pitäisi pystyä saamaan vaihteleva jännite potentiometrin tulon perusteella. Muuttuvaa lähtöä käytetään säätämään LED: n kirkkautta tässä.
Käytin yleismittarini muuttuvien lähtöjen mittaamiseen, voimme myös huomata LEDin kirkkauden muuttumisen eri jännitetasoille.
Se on se, että olemme ohjelmoineet lukemaan analogisen jännitteen POT: sta ja muuntamaan PWM-signaaleiksi, jotka puolestaan on muunnettu vaihtuvaksi jännitteeksi RC-suodattimen avulla ja tulos tarkistetaan laitteistomme avulla. Jos sinulla on epäilyksiä tai juutut jonnekin, käytä alla olevaa kommenttiosaa, autamme mielellämme. Täydellinen Working toimii videon.
Tarkista myös muut PWM-oppaat muista mikrokontrollereista:
- Vadelma Pi PWM -opastus
- PWM ja Arduino Due
- Arduino-pohjainen LED-himmennin PWM: n avulla
- Virran LED-himmennin ATmega32-mikrokontrollerilla