- Pins PWM al microcontrolador AVR Atmega16
- Què és un senyal PWM?
- Components necessaris
- Esquema de connexions
- Programació Atmega16 per a PWM
La modulació de l’amplada del pols (PWM) és una tècnica potent en què l’amplada del pols es canvia mantenint la freqüència constant. La tècnica s’utilitza en molts sistemes de control actuals. L'aplicació de PWM no és limitada i s'utilitza en una àmplia gamma d'aplicacions com ara control de velocitat del motor, mesurament, control de potència i comunicació, etc. En la tècnica PWM, es pot generar fàcilment senyal de sortida analògica mitjançant senyals digitals. Aquest tutorial us ajudarà a entendre PWM, les seves terminologies i com podem implementar-lo mitjançant un microcontrolador. En aquest tutorial demostrarem PWM amb el microcontrolador AVR Atmega16 variant la intensitat d’un LED.
Per entendre els conceptes bàsics de PWM en detall, consulteu els nostres tutorials anteriors sobre PWM amb diversos microcontroladors:
- Tutorial ARM7-LPC2148 PWM: Control de la brillantor del LED
- Modulació d'amplada de pols (PWM) mitjançant MSP430G2: control de la brillantor del LED
- Generació de PWM mitjançant microcontrolador PIC amb MPLAB i XC8
- Modulació d'amplada de pols (PWM) a STM32F103C8: velocitat de control del ventilador de CC
- Generació de senyals PWM en pins GPIO del microcontrolador PIC
- Tutorial de Raspberry Pi PWM
Pins PWM al microcontrolador AVR Atmega16
Atmega16 té quatre pins PWM dedicats. Aquests pins són PB3 (OC0), PD4 (OC1B), PD5 (OC1A), PD7 (OC2).

A més, Atmega16 té dos temporitzadors de 8 bits i un temporitzador de 16 bits. El temporitzador 0 i el temporitzador 2 són temporitzadors de 8 bits, mentre que el temporitzador 1 és temporitzador de 16 bits. Per generar PWM hem de tenir una visió general dels temporitzadors, ja que s’utilitzen temporitzadors per generar PWM. Com sabem, la freqüència és el nombre de cicles per segon en què s’executa el temporitzador. Per tant, la freqüència més alta ens donarà un temporitzador més ràpid. En generar PWM, una freqüència PWM més ràpida donarà un control més fi sobre la sortida perquè pot respondre més ràpidament als nous cicles de treball PWM.
En aquest tutorial Atmega16 PWM utilitzarem Timer2. Podeu triar qualsevol cicle de treball. Si no sabeu què és el cicle de treball a PWM, discutim-ho breument.
Què és un senyal PWM?
La modulació d’amplada de pols (PWM) és un senyal digital que s’utilitza més habitualment en circuits de control. El temps durant el qual el senyal es manté elevat s’anomena “hora puntual” i el temps durant el qual el senyal es manté baix es diu “temps apagat”. Hi ha dos paràmetres importants per a un PWM, tal com es descriu a continuació:
Cicle de treball del PWM
El percentatge de temps en què el senyal PWM roman ALT (puntual) s’anomena cicle de treball.
Igual que en el senyal de pols de 100 ms, si el senyal és ALT durant 50 ms i BAIX durant 50 ms, significa que el pols va ser MIG ALT i mig temps BAIX. Per tant, podem dir que el cicle de treball és del 50%. De la mateixa manera, si el pols està en estat alt de 25 ms i en estat baix de 75 ms de 100 ms, el cicle de treball seria del 25%. Fixeu-vos que només calculem la durada de l’estat HIGH. Podeu fer referència a la imatge següent per a la comprensió visual. La fórmula del cicle de treball és llavors,
Cicle de treball (%) = Temps d'encès / (Temps d'encesa + Temps d'aturada)

Per tant, canviant el cicle de treball podem canviar l’amplada de PWM, donant lloc a un canvi de brillantor del LED. Tindrem una demostració d’utilitzar diferents cicles de treball per controlar la brillantor del LED. Consulteu el vídeo de demostració al final d’aquest tutorial.
Després de seleccionar el cicle de treball, el següent pas seria seleccionar el mode PWM. El mode PWM especifica com voleu que funcioni PWM. Hi ha principalment 3 tipus de modes PWM. Aquestes són les següents:
- PWM ràpid
- PWM de fase correcta
- Fase i freqüència PWM correctes
El PWM ràpid s’utilitza quan el canvi de fase no importa. En utilitzar Fast PWM, podem generar els valors de PWM ràpidament. El PWM ràpid no es pot utilitzar quan el canvi de fase afecta el funcionament, com ara el control del motor, de manera que en aquesta aplicació s’utilitzen altres modes de PWM. Atès que controlarem la brillantor del LED, on el canvi de fase no afectarà gaire, de manera que farem servir el mode PWM ràpid.
Ara, per generar PWM, controlarem el temporitzador intern per comptar i tornarem a posar-lo a zero en un compte determinat, de manera que el temporitzador comptarà i es posarà a zero una vegada i una altra. Això defineix el període. Ara tenim l'opció de controlar un pols, activar un pols en un recompte específic del temporitzador mentre puja. Quan el comptador torni a 0, desactiveu el pols. Hi ha molta flexibilitat, ja que sempre podeu accedir al recompte del temporitzador i proporcionar diferents impulsos amb un sol temporitzador. Això és fantàstic quan voleu controlar diversos LED alhora. Ara comencem a interfacar un LED amb Atmega16 per a PWM.
Consulteu aquí tots els projectes relacionats amb PWM.
Components necessaris
- CI de microcontrolador AVR Atmega16
- Oscil·lador de vidre de 16 MHz
- Dos condensadors 100nF
- Dos condensadors de 22pF
- Polsador
- Jumper Wires
- Taula de pa
- USBASP v2.0
- 2 leds (qualsevol color)
Esquema de connexions

Estem utilitzant OC2 per a PWM, és a dir, Pin21 (PD7). Connecteu un LED al pin PD7 d’Atmega16.

Programació Atmega16 per a PWM
A continuació es dóna el programa complet. Graveu el programa a Atmega16 mitjançant JTAG i Atmel studio i vegeu l’efecte PWM al LED. La seva brillantor augmentarà i disminuirà lentament a causa del cicle de treball variable de PWM. Consulteu el vídeo que es dóna al final.
Comenceu a programar Atmega16 amb la configuració del registre Timer2. Els bits del registre Timer2 són els següents i podem establir o restablir els bits en conseqüència.

Ara parlarem de tots els bits de Timer2 perquè puguem obtenir el PWM desitjat mitjançant un programa escrit.
Hi ha principalment quatre parts al registre Timer2:
FOC2 (comparació de sortida forçada per al temporitzador2): el bit FOC2 s’estableix quan els bits WGM especifiquen un mode que no sigui PWM.
WGM2 (Mode de generació d'ona per al temporitzador 2): aquests bits controlen la seqüència de comptatge del comptador, la font del valor màxim del comptador (TOP) i quin tipus de generació de forma d'ona s'ha d'utilitzar.
COM2 (Compare Output Mode for Timer2): Aquests bits controlen el comportament de la sortida. A continuació s’explica la descripció completa de bits.
TCCR2 - = (1 <
Establiu els bits WGM20 i WGM21 com a HIGH per activar el mode ràpid PWM. El WGM significa mode de generació de formes d'ona. Els bits de selecció són els següents.
|
WGM00 |
WGM01 |
Funcionament en mode temporitzador 2 |
|
0 |
0 |
Mode normal |
|
0 |
1 |
CTC (Esborra el temporitzador en comparar la coincidència) |
|
1 |
0 |
PWM, fase correcta |
|
1 |
1 |
Mode PWM ràpid |
Per obtenir més informació sobre el mode de generació de formes d'ona, podeu consultar el full de dades oficial d'Atmega16.
TCCR2 - = (1 <
A més, no hem utilitzat cap escala prèvia, de manera que hem establert el registre d'origen del rellotge com a "001".
Els bits de selecció de rellotge són els següents:
|
CS22 |
CS21 |
CS20 |
Descripció |
|
0 |
0 |
0 |
Sense font de rellotge (temporitzador / comptador aturat) |
|
0 |
0 |
1 |
clk T2S / (sense modificació prèvia) |
|
0 |
1 |
0 |
Clk T2S / 8 (de Prescaler) |
|
0 |
1 |
1 |
Clk T2S / 32 (de Prescaler) |
|
1 |
0 |
0 |
Clk T2S / 64 (de Prescaler) |
|
1 |
0 |
1 |
Clk T2S / 128 (de Prescaler) |
|
1 |
1 |
0 |
Clk T2S / 256 (de Prescaler) |
|
1 |
1 |
1 |
Clk T2S / 1024 (de Prescaler) |
També es neteja OC2 en comparar la coincidència establint el bit COM21 com a '1' i COM20 com a '0'.
A continuació es mostren les opcions de selecció del mode de sortida de comparació (COM) per al mode PWM ràpid:
|
COM21 |
COM21 |
Descripció |
|
0 |
0 |
Funcionament normal del port, OC2 desconnectat. |
|
0 |
1 |
Reservat |
|
1 |
0 |
Esborreu OC2 a la comparació del partit, establiu OC2 a la part superior |
|
1 |
1 |
Establiu OC2 a la comparació, esborreu OC2 a TOP |
Augmenteu el cicle de treball del 0% al 100% de manera que la brillantor augmentarà amb el pas del temps. Agafeu el valor del 0 al 255 i envieu-lo al pin OCR2.
for (duty = 0; duty <255; duty ++) // 0 fins al màxim cicle de servei { OCR2 = duty; // augmentar lentament la brillantor del LED _delay_ms (10); }
De manera similar, reduïu el cicle de treball del 100% al 0% per disminuir gradualment la brillantor del LED.
for (duty = 0; duty> 255; duty--) // màxim a 0 cicle de servei { OCR2 = servei; // disminueix lentament la brillantor del LED _delay_ms (10); }
Acaba el nostre tutorial sobre l'ús de PWM a Atmega16 / 32.
