Departament de Microelectrònica i Sistemes Electrònics
AVR i FONAMENTS DE COMPUTADORS
Enginyeria en Informàtica (ETSE)
Control d'un motor de contínua
Un control sobre un motor de contrínua pot ser realitzat de forma senzilla emprant el circuit lineal L293D. És un dispositiu que porta integrats dos pont en H (amb diodes de protecció inclosos) de fins a 1/2 Watt de potència que, si cal, es poden posar en paral·lel per controlar un motor de fins a 1 Watt.
Pel control, apart de connectar el circuit a alimentació, fan falta dos senyals:
- El fil d'habilitació, o enable, llur control per PWM proporciona al motor la potència per anar més o menys ràpid.- I els dos senyals d'entrada els drivers del pont en H amb dues funcions predeterminades segons el seu valor:
· Quan són iguals el potencial dels terminals del motor és el mateix i, per tant, el motor està aturat.
· Quan són diferents el motor gira en un o altra sentit segons es polaritzi en tensió positiva o negativa.
El següent programa prepart per a un microcontrolador ATmega128 realitza el control d'un motor de contínua per PWM. El programa ...
- Fa servir les següents entrades/sortides
· Amb l'entrada analògica ADC0 (PINF.0) es controla la potència del motor. A major tensió en el pin el ADC del microcontrolador donarà major durada al pols PWM (sortida PORTB.6):· L'entrada PINB.7 és l'entrada d'habilitació de funcionament de motor
· L'entrada PINB.6 és l'entrada de control de direcció del motor.
· La sortida PORTB.5 és la sortida d'habilitació del motor. Es connecta al pin d'enable del pont en H.
· Les sortides PORTB.4.3 són les sortides de control cap al pont en H. Es el control PWM.
· La sortida PORTE.1 (TxD) es fa sortir per enviar cap a l'hyperterminal el valor del conversor ADC.
· Finalment, el PORTD (leds) es deixa com a sortida i mostra el valor donat pel converor ADC.
- I empra els següents recursos del microcontrolador:
- El conversor ADC. L'entrada PINF.0 és l'entrada de potència del motor. La converteix a un valor digital (byte més significatiu) que dóna el valor del registre de comparació OCR2 del timer2. El conversor funciona en mode de conversió simple sense interrupcions.- El timer2, funcionant en mode Fast PWM. Amb un prescaler de 1024 fa que la freqüència del pols PWM de sortida (donat en OC0) sigui de 61Hz. La sortida PWM es posa a 1 en timer2'ovf i a 0 en timer2'cmp. El PWM només funciona, a un temps, en una de les dues entrades de control, de manera que es pot controlar el sentit de gir del motor.
- S'empra la USART0 per enviar cap a l'hyperterminal el valor del conversor ADC. Per fer-ho, primer cal convertir el valor hexadecimal en tres codis ASCII corresponents a les centenes, les desenes i les unitats.
- El funcionament global del programa és el següent:
· En timer2'cmp es deshabilita el pols PWM.· En timer2'ovf s'habilita control PWM del motor segons entrades d'habilitació i sentit de gir del motor i s'inicia una nova conversió del ADC.
· En ADC'int s'actualitza el valor dels leds amb el valor del ADC i es carrega en el registre de comparació del timer2, que s'habilitarà quan aquest arriba al valor TOP. També s'inicialitza la variable d'enviar valor ADC a la USART.
Per donar més claretad al codi, el codi corresponent a la USART s'ha deixar en vermell.
; CONTROL D'UN MOTOR DE CONTÍNUA
; Joan Oliver, desembre 2008
;
; Entrades i sortides
; ...pel PORTB es realitza el control del motor (veure definició d'E/S)
; ...el PORTD (leds) mostra el resultat de conversió del ADC
; Es funciona amb el conversor ADC i el timer2 en mode PWM ràpid
; El timer2...
; ...en interrupció per ovf-> arrenca PWM i inicia conversor
; ...en interrupció per cmp-> atura PWM.
; ......rutines curta per no prendre masses cicles a la USART
; El conversorADC...fa de sincronisme...
; ...captura de nova mesura i inicia enviament USART
; ...en acabar el ADC la conversió la USART envia la dada del ADC al PC.INCLUDE "m128def.inc"
.DEF srri = R10 ;registre guarda SREG
.DEF cent = R12 ; registre guarda centenes (USART)
.DEF dese = R13 ; registre guarda desenes (USART)
.DEF unit = R14 ; registre guarda unitats (USART)
.DEF temp = R16 ;registre temp
.DEF mesura = R17 ;registre guarda dada ADC
.DEF nouADC = R18 ;registre indicatiu que ha acabat la int'ADC (per iniciar transmissió).CSEG
.ORG 0x00 rjmp inici ;Vector interrupció inici
.ORG 0x12 rjmp int_tim2cmp ;Vector interrupció timer2'cmp
.ORG 0x14 rjmp int_tim2ov ;Vector interrupció timer2'ovf
.ORG 0x2A rjmp int_adc ;Vector interrupció adc
reti
;*******************INICI PROGRAMA********************************
inici:
ldi temp,LOW(RAMEND) ;Setup del stack
out SPL,temp
ldi temp,HIGH(RAMEND)
out SPH,temp
rcall setup_PORTS ; setup ports
rcall setup_USART0 ; setup uart
rcall setup_ADC ; setup ADC
rcall setup_TIMERs ; setup timers
sei ; Activació general d'interrupcions
;-------PROGRAMA PRINCIPAL------------------------------------------
main:
cpi nouADC, 1 ; nou valor per enviar?
brne main
ldi nouADC, 0
rcall calculs ; conversió valor ADC a ASCII
rcall transmit ; transmissió valor ADC
rjmp main;-------RUTINA DE SETUP DE PORTS------------------------------------
setup_PORTS:
cbi DDRB,7 ; entrada enable motor
cbi DDRB,6 ; entrada sentit motor
sbi DDRB,5 ; sortida enable motor
sbi DDRB,4 ; sortida sentit A motor
sbi DDRB,3 ; sortida sentit B motor
ser temp
out DDRD, temp ; sortida leds
sbi DDRE, 1 ; PE.1 sortida TxD
sbi PORTE, 1 ; PE.1 a 1 per defecte
ret
;-------RUTINA DE SETUP DEL TIMER2------------------------------------
setup_timers:
; mode fast PWM i prescaler a 1024
ldi temp, (1<<WGM21)|(1<<WGM20)|(1<<CS22)|(0<<CS21)|(1<<CS20)
out TCCR2, temp
ldi temp, (1<<OCIE2)|(1<<TOIE2)
out TIMSK, temp
ret
;-------RUTINA DE SETUP DEL ADC------------------------------------
setup_ADC:
; preparar ADC amb referència AVref externa i ajustament a l'esquerra, entrada 0
ldi temp,(0<<REFS1)|(1<<REFS0)|(1<<ADLAR)|(0<<MUX0)
out ADMUX,temp
; habilitació en mode simple amb interrupció i amb prescaler a 16
ldi temp,(1<<ADEN)|(0<<ADSC)|(0<<ADFR)|(1<<ADIE)|(1<<ADPS2)|(0<<ADPS1)|(0<<ADPS0)
out ADCSRA,temp
ret
;-------RUTINA DE SERVEI INT ADC COMPLET----------------------
int_adc:
in srri, SREG
in mesura, ADCH
out PORTD, mesura ; valor ADC en PORTD
out OCR2, mesura ; valor ADC enviar a registre de comparació del timer
ldi nouADC, 1
out SREG, srri
reti
;-------RUTINA DE SERVEI INT OVF TIMER2----------------------
int_tim2ov:
in srri, SREG
rcall controlMotor
sbi ADCSRA, 6 ; ADSC - Start conversion
out SREG, srri
reti
;-------RUTINA DE SERVEI INT CMP TIMER2----------------------
int_tim2cmp:
cbi PORTB, 4 ; PWM aturat
cbi PORTB, 3
reti
;-------RUTINA CONTROL MOTOR----------------------
controlMotor:
sbis PINB, 7 ; control enable motor
rjmp aturat
sbi PORTB,5
sbis PINB, 6 ; control sentit gir motor
rjmp CW
CCW: sbi PORTB,3
ret
CW: sbi PORTB,4
ret
aturat: cbi PORTB,5
ret;**********USART***************************************************
;-------RUTINA DE SETUP DE LA UART---------------------------------
setup_USART0:
ldi temp,(1<<TXEN0) ;enable transmissió
out UCSR0B,temp
ldi temp,(1<<UCSZ01)|(1<<UCSZ00) ;frame format: 8data,1stop bit
sts UCSR0C,temp
ldi temp,0 ;baud rate a 38400
sts UBRR0H,temp
ldi temp,0x25
out UBRR0L,temp
ret
;-------RUTINA CONVERSIO----------------------------------------------
calculs: ;Trobar dígits
clr cent
clr dese
clr unit
centenes: cpi mesura, 100
brlo desenes
inc cent
subi mesura, 100
rjmp centenes
desenes: cpi mesura, 10
brlo unitats
inc dese
subi mesura, 10
rjmp desenes
unitats: mov unit, mesura ;Conversió a ASCII
ldi temp, 0x30
add cent, temp
add dese, temp
add unit, temp
ret
;-------RUTINA TRANSMISSIO DADES--------------------------------
;Rutina d'enviament de dades cap a la UART
transmit:ldi temp, 0x0A
transmit0: sbis UCSR0A, UDRE0 ; Line feed
rjmp transmit0
out udr0, temp
ldi temp, 0x0D ; Carriage return
transmit1: sbis UCSR0A, UDRE0
rjmp transmit1
out udr0, temp
transmit2: sbis UCSR0A, UDRE0
rjmp transmit2
out udr0, cent
transmit3: sbis UCSR0A, UDRE0
rjmp transmit3
out udr0, dese
transmit4: sbis UCSR0A, UDRE0
rjmp transmit4
out udr0, unit
ret
WcN - AVR i Fonaments de computadors -> Control de motor de contínua per PWM