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 B

La 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.


WcN - AVR i Fonaments de computadors -> Comptadors -> Exemple 3