- PWM-pinnen in AVR-microcontroller Atmega16
- Wat is een PWM-signaal?
- Componenten vereist
- Schakelschema
- Atmega16 programmeren voor PWM
Pulsbreedtemodulatie (PWM) is een krachtige techniek waarbij de breedte van de puls wordt veranderd door de frequentie constant te houden. De techniek wordt tegenwoordig in veel besturingssystemen gebruikt. De toepassing van PWM is niet beperkt en het wordt gebruikt in een breed scala van toepassingen zoals motortoerentalregeling, meting, vermogensregeling en communicatie enz. In de PWM-techniek kan men eenvoudig een analoog uitgangssignaal genereren met behulp van digitale signalen. Deze tutorial zal u helpen PWM, de terminologieën ervan te begrijpen en hoe we het kunnen implementeren met behulp van een microcontroller. In deze tutorial demonstreren we PWM met AVR Atmega16 Microcontroller door de intensiteit van een LED te variëren.
Om de basisprincipes van PWM in detail te begrijpen, ga naar onze vorige tutorials over PWM met verschillende microcontrollers:
- ARM7-LPC2148 PWM-zelfstudie: helderheid van led regelen
- Pulsbreedtemodulatie (PWM) met MSP430G2: Helderheid van LED regelen
- PWM genereren met behulp van PIC Microcontroller met MPLAB en XC8
- Pulsbreedtemodulatie (PWM) in STM32F103C8: Regelsnelheid van DC-ventilator
- Genereren van PWM-signalen op GPIO-pinnen van PIC Microcontroller
- Raspberry Pi PWM-zelfstudie
PWM-pinnen in AVR-microcontroller Atmega16
Atmega16 heeft vier speciale PWM-pinnen. Deze pinnen zijn PB3 (OC0), PD4 (OC1B), PD5 (OC1A), PD7 (OC2).
Ook Atmega16 heeft twee 8-bit timers en een 16 bit timer. Timer0 en Timer2 zijn 8-bits timers, terwijl Timer1 een 16-bits timer is. Om PWM te genereren, hebben we een overzicht van timers nodig, aangezien timers worden gebruikt om PWM te genereren. Zoals we weten, is de frequentie het aantal cycli per seconde waarop de timer loopt. Dus de hogere frequentie geeft ons een snellere timer. Bij het genereren van PWM geeft een snellere PWM-frequentie een fijnere controle over de output omdat deze sneller kan reageren op nieuwe PWM-duty-cycli.
In deze Atmega16 PWM-tutorial zullen we Timer2 gebruiken. U kunt elke inschakelduur kiezen. Als u niet weet wat de duty-cycle in PWM is, laten we het dan kort bespreken.
Wat is een PWM-signaal?
Pulsbreedtemodulatie (PWM) is een digitaal signaal dat het meest wordt gebruikt in regelcircuits. De tijd dat het signaal hoog blijft, wordt de "aan-tijd" genoemd en de tijd dat het signaal laag blijft, wordt de "uit-tijd" genoemd. Er zijn twee belangrijke parameters voor een PWM, zoals hieronder besproken:
Inschakelduur van de PWM
Het percentage van de tijd waarin het PWM-signaal HOOG (op tijd) blijft, wordt de duty-cycle genoemd.
Net als bij een pulssignaal van 100 ms, als het signaal 50 ms HOOG is en 50 ms LAAG, betekent dit dat de puls halverwege HOOG en halverwege LAAG was. We kunnen dus zeggen dat de inschakelduur 50% is. Evenzo, als de puls in de status 25 ms HOOG is en 75 ms in de toestand LAAG uit 100 ms, dan zou de inschakelduur 25% zijn. Merk op dat we alleen de duur van de HIGH-status berekenen. U kunt de onderstaande afbeelding raadplegen voor visueel begrip. De formule voor duty-cycle is dan,
Inschakelduur (%) = tijd aan / (tijd aan + tijd uit)
Dus door de duty-cycle te veranderen, kunnen we de breedte van PWM veranderen, wat resulteert in een verandering van de LED-helderheid. We zullen een demo hebben van het gebruik van verschillende werkcycli bij het regelen van de helderheid van de LED. Bekijk de demo-video aan het einde van deze tutorial.
Na het selecteren van de duty cycle, is de volgende stap het selecteren van de PWM-modus. De PWM-modus geeft aan hoe u wilt dat PWM werkt. Er zijn hoofdzakelijk 3 soorten PWM-modi. Dit zijn de volgende:
- Snelle PWM
- Fase Juiste PWM
- Fase en frequentie Juiste PWM
Snelle PWM wordt gebruikt waar de faseverandering niet uitmaakt. Door Fast PWM te gebruiken, kunnen we de PWM-waarden snel uitvoeren. Snelle PWM kan niet worden gebruikt waar faseverandering de werking beïnvloedt, zoals motorbesturing, dus in dergelijke toepassingen worden andere modi van PWM gebruikt. Omdat we de helderheid van de LED zullen regelen waar faseverandering niet veel invloed heeft, zullen we de snelle PWM-modus gebruiken.
Om nu PWM te genereren, controleren we de interne timer om op te tellen en vervolgens terug te stellen naar nul bij een bepaald aantal, dus de timer zal tellen en dan steeds weer op nul worden gezet. Dit bepaalt de periode. We hebben nu de mogelijkheid om een puls te besturen, een puls AAN te zetten op een specifieke teller in de timer terwijl deze omhoog gaat. Als de teller teruggaat naar 0, zet dan de puls uit. Hier is veel flexibiliteit mee omdat je altijd toegang hebt tot de telling van de timer en verschillende pulsen kunt voorzien met een enkele timer. Dit is handig als je meerdere LED's tegelijk wilt aansturen. Laten we nu een LED koppelen aan Atmega16 voor PWM.
Bekijk hier alle PWM-gerelateerde projecten.
Componenten vereist
- Atmega16 AVR Microcontroller IC
- 16Mhz kristaloscillator
- Twee 100nF condensatoren
- Twee 22pF condensatoren
- Druk op de knop
- Doorverbindingsdraden
- Breadboard
- USBASP v2.0
- 2 leds (elke kleur)
Schakelschema
We gebruiken OC2 voor PWM dwz Pin21 (PD7). Sluit dus één LED aan op pin PD7 van Atmega16.
Atmega16 programmeren voor PWM
Het volledige programma wordt hieronder weergegeven. Brand het programma in Atmega16 met JTAG en Atmel studio en zie het PWM-effect op LED. De helderheid zal langzaam toenemen en afnemen vanwege de variërende inschakelduur van PWM. Bekijk de video aan het einde.
Begin met het programmeren van Atmega16 met het instellen van Timer2 Register. De Timer2-registerbits zijn als volgt en we kunnen de bits dienovereenkomstig instellen of resetten.
Nu zullen we alle bits van Timer2 bespreken, zodat we de gewenste PWM kunnen krijgen met behulp van een geschreven programma.
Er zijn hoofdzakelijk vier delen in het Timer2-register:
FOC2 (Force Output Compare for Timer2): De FOC2-bit wordt ingesteld wanneer de WGM-bits een niet-PWM-modus specificeren.
WGM2 (Wave Generation Mode for Timer2): Deze bits regelen de telvolgorde van de teller, de bron voor de maximale (TOP) tellerwaarde en welk type golfvormgeneratie moet worden gebruikt.
COM2 (Compare Output Mode for Timer2): Deze bits regelen het uitvoergedrag. De volledige bitbeschrijving wordt hieronder uitgelegd.
TCCR2 - = (1 <
Stel WGM20- en WGM21-bits in op HIGH om de PWM Fast Mode te activeren. De WGM staat voor Waveform Generation Mode. De selectiebits zijn zoals hieronder.
WGM00 |
WGM01 |
Timer2-modus werking |
0 |
0 |
Normale modus |
0 |
1 |
CTC (Clear Timer On Compare Match) |
1 |
0 |
PWM, Phase Correct |
1 |
1 |
Snelle PWM-modus |
Voor meer details over de golfvormgeneratiemodus, kunt u het officiële gegevensblad van Atmega16 raadplegen.
TCCR2 - = (1 <
We hebben ook geen pre-scaling gebruikt, dus hebben we Clock source register ingesteld als '001'.
De klokselectiebits zijn als volgt:
CS22 |
CS21 |
CS20 |
Omschrijving |
0 |
0 |
0 |
Geen klokbron (timer / teller gestopt) |
0 |
0 |
1 |
clk T2S / (geen voorcaling) |
0 |
1 |
0 |
Clk T2S / 8 (van Prescaler) |
0 |
1 |
1 |
Clk T2S / 32 (van Prescaler) |
1 |
0 |
0 |
Clk T2S / 64 (van Prescaler) |
1 |
0 |
1 |
Clk T2S / 128 (van Prescaler) |
1 |
1 |
0 |
Clk T2S / 256 (van Prescaler) |
1 |
1 |
1 |
Clk T2S / 1024 (van Prescaler) |
Ook wordt OC2 gewist bij vergelijkingsovereenkomst door COM21-bit in te stellen als '1' en COM20 als '0'.
De Compare Output Mode (COM) selectie-opties voor Fast PWM Mode worden hieronder gegeven:
COM21 |
COM21 |
Omschrijving |
0 |
0 |
Normale poortwerking, OC2 niet verbonden. |
0 |
1 |
Gereserveerd |
1 |
0 |
Wis OC2 bij vergelijkingsmatch, zet OC2 op TOP |
1 |
1 |
Zet OC2 op vergelijkingsmatch, wis OC2 bij TOP |
Verhoog de inschakelduur van 0% tot 100% zodat de helderheid in de loop van de tijd toeneemt. Neem een waarde van 0-255 en stuur deze naar de OCR2-pin.
for (duty = 0; duty <255; duty ++) // 0 tot max. duty cycle { OCR2 = duty; // verhoog langzaam de LED-helderheid _delay_ms (10); }
Verlaag op dezelfde manier de inschakelduur van 100% naar 0% om de helderheid van de LED geleidelijk te verminderen.
voor (duty = 0; duty> 255; duty--) // max tot 0 duty cycle { OCR2 = duty; // verlaag langzaam de LED-helderheid _delay_ms (10); }
Hiermee is onze zelfstudie over het gebruik van PWM in Atmega16 / 32 voltooid.