- PWM (modulació d'amplada de pols)
- Pins PWM a ARM7-LPC2148
- Registres PWM a ARM7-LPC2148
- Components necessaris
- Diagrama de circuits i connexions
- Programació ARM7-LPC2148 per a PWM
- Passos relacionats amb la programació de LPC2148 per a PWM i ADC
Com sabem, els microcontroladors prenen entrada analògica de sensors analògics i utilitzen ADC (convertidor analògic a digital) per processar aquests senyals. Però, i si un microcontrolador vol produir un senyal analògic per controlar dispositius analògics com un servomotor, un motor de corrent continu, etc.? Els microcontroladors no produeixen tensió de sortida com 1V, 5V, sinó que utilitzen una tècnica anomenada PWM per al funcionament de dispositius analògics. Un exemple de PWM és el ventilador de refrigeració (motor de corrent continu) del nostre ordinador portàtil que cal controlar la velocitat segons la temperatura, i el mateix s’implementa mitjançant la tècnica de modulació d’amplitud de pols (PWM) a les plaques base.
En aquest tutorial controlarem la brillantor d’un LED mitjançant el PWM del microcontrolador ARM7-LPC2148.
PWM (modulació d'amplada de pols)
El PWM és una bona manera de controlar els dispositius analògics mitjançant un valor digital, com ara controlar la velocitat del motor, la brillantor d’un led, etc. PWM realment modula l'amplada d'una ona de pols rectangular per obtenir una variació del valor mitjà de l'ona resultant.
Cicle de treball del PWM
El percentatge de temps en què el senyal PWM roman ALT (puntual) s’anomena cicle de treball. Si el senyal sempre està activat, està en un 100% de cicle de treball i si sempre està apagat, és un 0% de cicle de treball.
Cicle de treball = Temps d’activació / (Temps d’encès + Temps d’APAGAT)

Pins PWM a ARM7-LPC2148
La imatge següent indica els pins de sortida PWM de l'ARM7-LPC2148. Hi ha un total de sis pins per a PWM.

|
Canal PWM |
LPC2148 Pins de port |
|
PWM1 |
P0.0 |
|
PWM2 |
P0.7 |
|
PWM3 |
P0.1 |
|
PWM4 |
P0.8 |
|
PWM5 |
P0.21 |
|
PWM6 |
P0.9 |
Registres PWM a ARM7-LPC2148
Abans d’entrar al nostre projecte, hem de conèixer els registres PWM a LPC2148.
Aquí teniu la llista de registres utilitzats a LPC2148 per a PWM
1. PWMPR: registre de prescala PWM
Ús: és un registre de 32 bits. Conté el nombre de vegades (menys 1) que PCLK ha de fer un cicle abans d'incrementar el comptador de temporitzador PWM (en realitat té el valor màxim del comptador de prescala).
2. PWMPC: comptador de precalificadors PWM
Ús: és un registre de 32 bits . Conté el valor del comptador incremental. Quan aquest valor és igual al valor PR més 1, s'incrementa el comptador de temporitzador PWM (TC).
3. PWMTCR: registre de control del temporitzador PWM
Ús: conté els bits de control Counter Enable, Counter Reset i PWM Enable. És un registre de 8 bits.
|
7: 4 |
3 |
2 |
1 |
0 |
|
RESERVAT |
HABILITAT PWM |
RESERVAT |
RESET DEL CONTADOR |
Habilita el comptador |
- Habilitació PWM: (Bit-3)
0- PWM desactivat
1- PWM activat
- Activació del comptador: (Bit-0)
0- Desactiva els comptadors
1- Activa el comptador
- Restabliment del comptador: (Bit-1)
0- No fer res.
1- Restableix PWMTC i PWMPC a la vora positiva de PCLK.
4. PWMTC: comptador de temporitzador PWM
Ús: és un registre de 32 bits. Conté el valor actual del temporitzador PWM incremental. Quan el comptador de prescaladors (PC) arriba al valor del registre de prescaladors (PR) més 1, aquest comptador s'incrementa.
5. PWMIR: registre d'interrupcions PWM
Ús: és un registre de 16 bits. Conté els indicadors d'interrupció dels canals de coincidència PWM 0-6. Un indicador d'interrupció s'estableix quan es produeix una interrupció per a aquest canal (MRx Interrupt) on X és el número del canal (0 a 6).
6. PWMMR0-PWMMR6: registre de coincidències PWM
Ús: és un registre de 32 bits . En realitat, el grup Match Channel permet configurar 6 sortides PWM controlades amb un sol cantell o 3 controlades amb doble cantell. Podeu modificar els set canals de coincidència per configurar aquestes sortides PWM perquè s'adaptin als vostres requisits a PWMPCR.
7. PWMMCR: registre de control de coincidències PWM
Ús: és un registre de 32 bits. Conté els bits d'interrupció, restabliment i aturada que controlen el canal de coincidència seleccionat. Es produeix una coincidència entre els registres de coincidències PWM i els comptadors PWM Timer.
|
31:21 |
20 |
19 |
18 |
.. |
5 |
4 |
3 |
2 |
1 |
0 |
|
RESERVAT |
PWMMR6S |
PWMMR6R |
PWMMR6I |
.. |
PWMMR1S |
PWMMR1R |
PWMMR11 |
PWMMR0S |
PWMMR0R |
PWMMR01 |
Aquí x és de 0 a 6
- PWMMRxI (Bit-0)
Habilita o desactiva les interrupcions PWM
0- Desactiva les interrupcions de PWM Match.
1- Activeu la interrupció PWM Match
- PWMMRxR: (Bit-1)
RESET PWMTC: valor del comptador del temporitzador sempre que coincideixi amb PWMRx
0- No fer res.
1- Restableix el PWMTC.
- PWMMRxS: (bit 2)
ATURAR PWMTC i PWMPC quan PWMTC assoleixi el valor del registre de concordança
0- Desactiveu la funció d'aturada PWM.
1- Activeu la funció PWM Stop.
8. PWMPCR: registre de control PWM
Ús: és un registre de 16 bits. Conté els bits que permeten les sortides PWM 0-6 i seleccionen un control de doble o de vora per a cada sortida.
|
31:15 |
14: 9 |
8: 7 |
6: 2 |
1: 0 |
|
INÚS |
PWMENA6-PWMENA1 |
INÚS |
PWMSEL6-PWMSEL2 |
INÚS |
- PWMSELx (x: 2 a 6)
- Mode Single Edge per a PWMx
- 1- Mode de doble vora per a PWMx.
- PWMENAx (x: 1 a 6)
- Desactivar PWMx.
- 1- PWMx habilitat.
9. PWMLER: registre d'activació de panys PWM
Ús: és un registre de 8 bits. Conté els bits Match x Latch de cada canal Match.
|
31: 7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
|
INÚS |
LEN6 |
LEN5 |
LEN4 |
LEN3 |
LEN2 |
LEN1 |
LEN0 |
LENx (x: 0 a 6):
0- Desactiveu la càrrega de nous valors de coincidència
1- Carregueu els nous valors de coincidència des de (PWMMRx) Registre de PWMMatch quan es restableixi el temporitzador.
Ara comencem a construir la configuració del maquinari per demostrar la modulació d'amplada de pols al microcontrolador ARM.
Components necessaris
Maquinari
- Microcontrolador ARM7-LPC2148
- CI de regulador de voltatge de 3,3 V
- Potenciòmetre de 10 k
- LED (qualsevol color)
- Mòdul de pantalla LCD (16x2)
- Taula de pa
- Connexió de cables
Programari
- Keil uVision5
- Eina Flash Magic
Diagrama de circuits i connexions


Connexions entre LCD i ARM7-LPC2148
|
ARM7-LPC2148 |
LCD (16x2) |
|
P0.4 |
RS (Selecciona registre) |
|
P0.6 |
E (Activa) |
|
P0.12 |
D4 (pin de dades 4) |
|
P0.13 |
D5 (pin de dades 5) |
|
P0.14 |
D6 (pin de dades 6) |
|
P0.15 |
D7 (pin de dades 7) |
|
GND |
VSS, R / W, K |
|
+ 5V |
VDD, A |
Connexió entre LED i ARM7-LPC2148
L’ANODE del LED està connectat a la sortida PWM (P0.0) de LPC2148, mentre que el pin CATHODE del LED està connectat al pin GND de LPC2148.
Connexió entre ARM7-LPC2148 i potenciòmetre amb regulador de voltatge de 3,3V
|
CI de regulador de voltatge de 3,3 V |
Funció Pin |
ARM-7 LPC2148 Pin |
|
1. Pin esquerre |
- Ve de GND |
Pin GND |
|
2. Pin del centre |
Sortida regulada + 3,3V |
A l'entrada del potenciòmetre i sortida del potenciòmetre a P0.28 de LPC2148 |
|
3. Pin dret |
+ Ve des de 5V ENTRADA |
+ 5V |
Punts a destacar
1. Aquí s’utilitza un regulador de voltatge de 3,3V per proporcionar un valor d’entrada analògic al pin ADC (P0.28) de LPC2148 i, com que estem utilitzant una potència de 5V, hem de regular el voltatge amb un regulador de voltatge de 3,3V.
2. S’utilitza un potenciòmetre per variar la tensió entre (0V a 3,3V) per proporcionar entrada analògica (ADC) al pin P0.28 de LPC2148
Programació ARM7-LPC2148 per a PWM
Per programar ARM7-LPC2148 necessitem l'eina keil uVision i Flash Magic. Estem utilitzant un cable USB per programar ARM7 Stick mitjançant un port micro USB. Escrivim codi amb Keil i creem un fitxer hexadecimal i, a continuació, el fitxer HEX es converteix en un pal ARM7 mitjançant Flash Magic. Per obtenir més informació sobre com instal·lar keil uVision i Flash Magic i com utilitzar-los, seguiu l’enllaç Introducció al microcontrolador ARM7 LPC2148 i programeu-lo mitjançant Keil uVision.
En aquest tutorial utilitzarem la tècnica ADC i PWM per controlar la brillantor del LED. Aquí es dóna entrada analògica a LPC2148 (0 a 3,3 V) mitjançant el pin d’entrada ADC P0.28, a continuació, aquesta entrada analògica es converteix en valor digital (0 a 1023). Aleshores, aquest valor es torna a convertir en valor digital (0 - 255) ja que la sortida PWM de LPC2148 només té una resolució de 8 bits (2 8). El LED està connectat al pin PWM P0.0 i la brillantor del LED es pot controlar mitjançant el potenciòmetre. Per obtenir més informació sobre ADC a ARM7-LPC2148, seguiu l'enllaç.
Passos relacionats amb la programació de LPC2148 per a PWM i ADC
Pas 1: - El primer és configurar el PLL per a la generació de rellotges, ja que estableix el rellotge del sistema i el rellotge perifèric de LPC2148 segons els programadors necessiten. La freqüència de rellotge màxima per a LPC2148 és de 60 MHz. Les línies següents s’utilitzen per configurar la generació de rellotges PLL.
void initilizePLL (void) // Funció per utilitzar PLL per a la generació de rellotges { PLL0CON = 0x01; PLL0CFG = 0x24; PLL0FEED = 0xAA; PLL0FEED = 0x55; while (! (PLL0STAT & 0x00000400)); PLL0CON = 0x03; PLL0FEED = 0xAA; PLL0FEED = 0x55; VPBDIV = 0x01; }
Pas 2: - El següent és seleccionar els pins PWM i la funció PWM de LPC2148 mitjançant el registre PINSEL. Utilitzem PINSEL0 ja que fem servir P0.0 per a la sortida PWM de LPC2148.
PINSEL0 = 0x00000002; // Configuració del pin P0.0 per a la sortida PWM
Pas 3: - A continuació, hem de restablir els temporitzadors mitjançant PWMTCR (Timer Control Register).
PWMTCR = (1 << 1); // Configuració del registre de control del temporitzador PWM com a restabliment del comptador
I, a continuació, establiu el valor de prescala que decideix la resolució de PWM. Ho estic posant a zero
PWMPR = 0X00; // Configuració del valor de prescala de PWM
Pas 4: - A continuació, hem d’establir el PWMMCR (registre de control de coincidències PWM) ja que estableix un funcionament com el restabliment, les interrupcions de PWMMR0.
PWMMCR = (1 << 0) - (1 << 1); // Configuració del registre de control de coincidències de PWM
Pas 5: - El període màxim del canal PWM s'estableix mitjançant PWMMR.
PWMMR0 = PWMvalue; // Donar valor PWM Valor màxim
En el nostre cas, el valor màxim és 255 (per obtenir una brillantor màxima)
Pas 6: - A continuació, hem d’establir Latch Enable als registres de coincidència corresponents mitjançant PWMLER
PWMLER = (1 << 0); // Pestell Enalbe PWM
(Utilitzem PWMMR0) Per tant, activeu el bit corresponent configurant 1 a PWMLER
Pas 7: - Per habilitar la sortida PWM al pin, hem d’utilitzar el PWMTCR per habilitar els comptadors PWM Timer i els modes PWM.
PWMTCR = (1 << 0) - (1 << 3); // Activació del comptador PWM i PWM
Pas 8: - Ara necessitem obtenir els valors del potenciòmetre per configurar el cicle de treball de PWM des del pin ADC P0.28. Per tant, fem servir el mòdul ADC a LPC2148 per convertir l'entrada analògica de potenciòmetres (0 a 3,3 V) als valors ADC (0 a 1023).
Aquí estem convertint els valors de 0-1023 a 0-255 dividint-lo amb 4, ja que PWM de LPC2148 té una resolució de 8 bits (2 8).
Pas 9: - Per seleccionar el pin ADC P0.28 a LPC2148, fem servir
PINSEL1 = 0x01000000; // Configuració de P0.28 com ADC INPUT AD0CR = (((14) << 8) - (1 << 21)); // Configuració del rellotge i PDN per a la conversió A / D
Les línies següents capturen l'entrada analògica (de 0 a 3,3 V) i la converteixen en valor digital (de 0 a 1023). A continuació, aquests valors digitals es divideixen per 4 per convertir-los en (0 a 255) i, finalment, s’alimenten com a sortida PWM al pin P0.0 de LPC2148 al qual està connectat el LED.
AD0CR - = (1 << 1); // Seleccioneu el canal AD0.1 al temps de retard del registre ADC (10); AD0CR - = (1 << 24); // Inicieu la conversió A / D mentre ((AD0DR1 & (1 << 31)) == 0); // Comproveu el bit FET al registre de dades ADC adcvalue = (AD0DR1 >> 6) & 0x3ff; // Obteniu el RESULTAT del registre de dades ADC dutycycle = adcvalue / 4; // fórmula per obtenir valors de dutycycle de (0 a 255) PWMMR1 = dutycycle; // estableix el valor de dutycycle a PWM match register PWMLER - = (1 << 1); // Habiliteu la sortida PWM amb el valor del cicle de dutet
Pas 10: - A continuació, mostrem aquests valors al mòdul de pantalla LCD (16X2). Per tant, afegim les línies següents per inicialitzar el mòdul de pantalla LCD
Void LCD_INITILIZE (void) // Funció per preparar la pantalla LCD { IO0DIR = 0x0000FFF0; // Estableix el pin P0.12, P0.13, P0.14, P0.15, P0.4, P0.6 com a retard de SORTIDA (20); LCD_SEND (0x02); // Inicialitzar lcd en mode de funcionament de 4 bits LCD_SEND (0x28); // 2 línies (16X2) LCD_SEND (0x0C); // Mostra el cursor desactivat LCD_SEND (0x06); // Cursor d'increment automàtic LCD_SEND (0x01); // Mostra LCD_SEND clar (0x80); // Primera línia primera posició }
A mesura que connectàvem la pantalla LCD en mode de 4 bits amb LPC2148, hem d’enviar valors perquè es mostrin com nibble per nibble (Upper Nibble & Lower Nibble). Per tant, s’utilitzen les línies següents.
void LCD_DISPLAY (char * msg) // Funció per imprimir els caràcters enviats un per un { uint8_t i = 0; while (msg! = 0) { IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0xF0) << 8)); // Envia mordassa superior IO0SET = 0x00000050; // RS HIGH & ACTIVE HIGH per imprimir dades IO0CLR = 0x00000020; // Temps de retard del mode d'escriptura RW LOW (2); IO0CLR = 0x00000040; // EN = 0, RS i RW sense canvis (és a dir, RS = 1, RW = 0) temps de retard (5); IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0x0F) << 12)); // Envia un picet inferior IO0SET = 0x00000050; // RS & EN HIGH IO0CLR = 0x00000020; temps de retard (2); IO0CLR = 0x00000040; temps de retard (5); i ++; } }
Per mostrar aquests valors ADC i PWM, fem servir les següents línies a la funció int main () .
LCD_SEND (0x80); sprintf (displayadc, "adcvalue =% f", adcvalue); LCD_DISPLAY (displayadc); // Mostra el valor ADC (0 a 1023) LCD_SEND (0xC0); sprintf (sortida led, "PWM OP =%. 2f", brillantor); LCD_DISPLAY (sortida de led); // Mostra els valors del cicle dutici de (0 a 255)

A continuació es mostra el codi complet i la descripció del vídeo del tutorial.
