Departament de Microelectrònica i Sistemes Electrònics
AVR i FONAMENTS DE COMPUTADORS
Enginyeria en Informàtica (ETSE)
comptadors - exemple 3: control per a un servomotor
Un servomotor és un motor amb circuiteria de realimentació que li permet posicionar-se amb gran precisió en una posició fixa. El control es realitza amb un únic fil que reb un pols d'amplitud variable a una freqüència d'uns 50 Hz. El pols va des d' 1 ms (eix del motor a un costat) fins a 2 ms (eix del motor a l'altre costat), éssent el punt mig (amb un pols d' 1.5ms) el punt en el què l'eix del motor queda en posició intermitja.
En aquest exemple s'emprarà el comptador 1 en mode PWM amb control de fase i període per a controlar dos servomotors. S'utilitzaran, per tant, els dos comparadors del comptador. Es funcionarà amb els següents paràmetres:
Nota: l'exemple s'ha fet amb ATmega128 (només canvia l'adreça d'interrupció per overflow) i és funcional.
.INCLUDE "m128def.inc"
.DEF srri = R10
.DEF temp = R16
.DEF pols1ms = R17
.ORG 0x0
rjmp inici
.ORG 0x1C ;0x08 en ATmega8
rjmp cnt1_iovf1
inici: ldi temp,LOW(RAMEND)
out SPL,temp
ldi temp,HIGH(RAMEND)
out SPH,temp
ser temp
; out PORTC, temp
; out PORTD, temp
out DDRB, temp
clr temp
out PORTB, temp
ldi pols1ms, 31
ldi temp, (1<<COM1A1)|(1<<COM1B1)
out TCCR1A, temp
ldi temp, (1<<WGM13)|(1<<CS12)
out TCCR1B, temp
ldi temp, (1<<TOIE1)
out TIMSK, temp
ldi temp,0x02
out ICR1H,temp
ldi temp,0x71
out ICR1L,temp
ldi temp,0
out OCR1AH,temp
out OCR1AL,pols1ms
out OCR1BH,temp
out OCR1BL,pols1ms
sei
main: nop
rjmp main
cnt1_iovf1:
in srri, SREG
in temp, PINC
andi temp, 0x1F
add temp, pols1ms
out OCR1AL, temp
in temp, PIND
andi temp, 0x1F
add temp, pols1ms
out OCR1BL, temp
out SREG, srri
reti; CONTROL DE DOS SERVOMOTORS
; PROGRAMA FUNCIONAL AMB ATMEGA128 (2 SERVOS: sortides OC1A i OC1B)
; Autor: Joan Oliver
; Universitat Autònoma de Barcelona
;
; Aplicació amb Timer1
; El timer s'empra en mode de PWM amb correcció de fase i període, TOP en ICR1
; S'empra un comparador per cada servomotor
; El prescaler es posa a 256 => 16MHz/256 => periode=16us
; Un període, 20ms, implica un compteig de 1250/2 (mode de doble rampa)=0x271
; El pols d'1ms dura 62.5 compteigs, i es centra en el overflow (en el 0, de -31 a 31 compteigs)
; Pel pols d'1.5ms es suma 31.25 al valor 62.5 -> pols de -47 a +47 compteigs
; I pel pols de 2ms=125compteigs el pols va de -62.5 a +62.5 compteigs
; L'increment/decrement de cada motor s'entra pels PINC i PIND (5 primers bits - fins a 31)
; Les sortides PWM estan en OC1A (PORTB.1) i OC1B (PORTB.2)
; guarda de registre de status
; registre temporal
; registre guarda temps 1 ms
; rutina d'inici del programa
; rutina servei int'timer1'ovf
;-------INICI PROGRAMA -----------------------------------------------
; inicialitzar stack
out SPL,temp
ldi temp,HIGH(RAMEND)
out SPH,temp
ser temp
; PORTC entrada amb pull-up
; PORTD entrada amb pull-up
; PORTB com a sortida
; PORTB sortida a zero
; inicialització pols 1ms
;-------SETUP CNT1----------------------------------------------------
; WGM13:0 = 8 --> PWM amb correció de fase i període i TOP en ICR1
; COM1x1:0 = 1 --> OC1x commutant en commutació; =2 ->clear upcounting, set downcounting
; AMB TOSC= 16MhZ --> Prescaler a 256
; interrupció per overflow en TOP
;-------INICIALITZACIÓ MOTORS-----------------------------------------
; inicialització ICR1
; inicialització OCR1A
;-------PROGRAMA PRINCIPAL--------------------------------------------
; tornar a programa principal
; subrutina tractament overflow:
; actualitzar pols servo A
; actualitzar pols servo BLa següent figura mostra el resultat obtingut en l'oscil·loscop. S'observen els dos canals, ambdós a una freqüència de 50Hz, el vermell amb un pols de 2ms i el canal blau d'1 ms.