- Servomotor
- Control del servomotor mitjançant LPC2148 PWM i ADC
- Pines PWM i ADC a ARM7-LPC2148
- Components necessaris
- Diagrama de circuits i connexions
- Programació ARM7-LPC2148 per al control del servomotor
En el nostre tutorial anterior, hem interfaçat el motor pas a pas amb ARM7-LPC2148. En aquest tutorial, controlarem el servomotor amb ARM7-LPC2148. El servomotor té un avantatge de baix consum respecte al motor pas a pas. Un servomotor atura el consum d'energia quan s'arriba a la posició desitjada, però el motor pas a pas continua consumint energia per bloquejar l'eix a la posició desitjada. Els servomotors s’utilitzen principalment en projectes de robòtica per la seva precisió i fàcil maneig.
En aquest tutorial coneixerem el Servo Motor i la interfície del Servo amb ARM7-LPC2148. També es connecta un potenciòmetre per variar la posició de l’eix del servomotor i una pantalla LCD per mostrar el valor de l’angle.
Servomotor
Un servomotor és una combinació de motor de corrent continu, sistema de control de posició i engranatges. La rotació del servomotor es controla aplicant-hi un senyal PWM, l'amplada del senyal PWM decideix l'angle de rotació i la direcció del motor. Aquí farem servir el Servo Motor SG90 en aquest tutorial, és un dels més populars i econòmics. SG90 és un servo de 180 graus. Així, amb aquest servo podem situar l’eix de 0 a 180 graus:
- Voltatge de funcionament: + 5V
- Tipus d’engranatges: plàstic
- Angle de rotació: de 0 a 180 graus
- Pes: 9gm
- Parell: 2,5 kg / cm

Abans de poder començar a programar el servomotor, hem de saber quin tipus de senyal s’envia per controlar el servomotor. Hauríem de programar l’MCU per enviar senyals PWM al cable de senyal del motor Servo. Hi ha un circuit de control a l’interior del servomotor que llegeix el cicle de treball del senyal PWM i situa l’eix dels servomotors al lloc respectiu tal com es mostra a la imatge següent

Per cada 20 mil·lisegons, el servomotor comprova el pols. Per tant, ajusteu l’amplada del pols del senyal per girar l’eix del motor.
- Amplada d'impuls de 1 ms (1 mil·lisegon) per a la rotació del servo a 0 graus
- Amplada de pols de 1,5 ms per a la rotació de 90 graus (posició neutra)
- Amplada de pols de 2 ms per a la rotació del servo a 180 graus.
Abans de connectar el servo a ARM7-LPC2148, podeu provar el vostre servo amb l'ajuda d'aquest circuit de provador de servomotor. Comproveu també com es pot connectar un servomotor amb altres microcontroladors:
- Control de servomotor mitjançant Arduino
- Interfície de servomotor amb microcontrolador 8051
- Control de servomotor mitjançant MATLAB
- Control de servomotor amb Raspberry Pi
- Servomotor d’interfície amb MSP430G2
- Servomotor d’interfície amb STM32F103C8
Control del servomotor mitjançant LPC2148 PWM i ADC
Un servomotor es pot controlar mitjançant LPC2148 mitjançant PWM. En proporcionar senyal PWM al pin PWM de SERVO amb un període de 20 ms i una freqüència de 50 Hz, podem situar l’eix del servomotor al voltant de 180 graus (-90 a +90).
S’utilitza un potenciòmetre per variar el cicle de treball del senyal PWM i girar l’eix del servomotor, aquest mètode s’implementa mitjançant el mòdul ADC de LPC2148. Per tant, necessitem que s’implementin conceptes PWM i ADC en aquest tutorial. Consulteu els nostres tutorials anteriors per aprendre PWM i ADC a ARM7-LPC2148.
- Com s'utilitza PWM a ARM7-LPC2148
- Com utilitzar ADC a ARM-LPLC2148
Pines PWM i ADC a ARM7-LPC2148
La imatge següent mostra els pins PWM i ADC a LPC2148. Els quadres grocs indiquen els (6) pins PWM i el quadre negre indica els (14) pins ADC.

Components necessaris
Maquinari
- ARM7-LPC2148
- Mòdul de pantalla LCD (16x2)
- Servomotor (SG-90)
- Regulador de voltatge de 3,3V
- Potenciòmetre de 10 k (2 números)
- Taula de pa
- Connexió de cables
Programari
- Keil uVision5
- Eina Flash Magic
Diagrama de circuits i connexions


A la taula següent es mostra la connexió entre el servomotor i ARM7-LPC2148:
|
PINS DE SERVO |
ARM7-LPC2148 |
|
VERMELL (+ 5 V) |
+ 5V |
|
MARRÓ (GND) |
GND |
|
TARONJA (PWM) |
P0.1 |
El pin P0.1 és la sortida PWM de LPC2148.
La taula següent mostra les connexions de circuits 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 |
La taula següent mostra les connexions 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 tenir en compte
1. Aquí s’utilitza un regulador de voltatge de 3,3 V per proporcionar un valor d’entrada analògic al pin ADC (P0.28) de LPC2148. Com que fem servir 5V d’alimentació, 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
3. El pin P0.1 de LPC2148 proporciona sortida PWM al servomotor per controlar la posició del motor.
4. Segons el valor d'entrada analògica (ADC), la posició del servomotor canvia de (0 a 180 graus) a través del pin de sortida PWM a P0.1 de LPC2148.
Programació ARM7-LPC2148 per al control del servomotor
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.
Passos relacionats amb la configuració de LPC2148 per a PWM i ADC per controlar el servomotor
Pas 1: - Incloeu els fitxers de capçalera necessaris per codificar LPC2148
#incloure
Pas 2: - El següent é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 3: - El següent que heu de fer és seleccionar els pins PWM i la funció PWM de LPC2148 mitjançant el registre PINSEL. Utilitzem PINSEL0 ja que fem servir P0.1 per a la sortida PWM de LPC2148.
PINSEL0 - = 0x00000008; // Configuració del pin P0.1 de LPC2148 com a PWM3
Pas 4: - A continuació, hem de restablir els temporitzadors mitjançant PWMTCR (Timer Control Register).
PWMTCR = 0x02; // Restableix i desactiva el comptador per a PWM
I, a continuació, establiu el valor de prescala que decideix establir la resolució de PWM.
PWMPR = 0x1D; // Valor del registre de prescala
Pas 5: - A continuació, configureu el PWMMCR (registre de control de coincidències PWM) ja que estableix un funcionament com el restabliment, les interrupcions de PWMMR0 i PWMMR3.
PWMMCR = 0x00000203; // Restablir i interrompre el partit MR0, interrompre el partit MR3
Pas 6: - El període màxim del canal PWM s'estableix mitjançant PWMMR0 i la tona del cicle de treball PWM s'estableix inicialment a 0,65 ms
PWMMR0 = 20000; // Període de temps de l'ona PWM, 20msec PWMMR3 = 650; // Tona d’ona PWM 0,65 msec
Pas 7: - A continuació, hem d’establir Latch Enable als registres de coincidència corresponents mitjançant PWMLER
PWMLER = 0x09; // Activació de bloqueig per a PWM3 i PWM0
(Utilitzem PWMMR0 i PWMMR3) Per tant, activeu el bit corresponent configurant 1 a PWMLER
Pas 8: - Per habilitar la sortida PWM al pin, hem d’utilitzar el PWMTCR per habilitar els comptadors PWM Timer i els modes PWM.
PWMPCR = 0x0800; // Habiliteu PWM3 i PWM 0, PWM controlat per una sola vora PWMTCR = 0x09; // Activeu PWM i comptador
Pas 9: - 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).
Pas 10: - 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.1 de LPC2148. 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 (28).
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 11: - 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", dutycycle); LCD_DISPLAY (displayadc); // Mostra el valor ADC (0 a 1023) angle = (adcvalue / 5.7); // Fórmula per convertir el valor ADC en angle (o a 180 graus) LCD_SEND (0xC0); sprintf (anglevalue, "ANGLE =%. 2f deg", angle); LCD_DISPLAY (anglevalue);

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