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