Departament de Microelectrònica i Sistemes Electrònics
AVR i FONAMENTS DE COMPUTADORS
Enginyeria en Informàtica (ETSE)
Control d'un motor pas a pas
El control d'un motor pas a pas es realitza controlant la fase en la que es troba. Les fases s'entren al motor a través dels fils que tenen. Per exemple, el motor V9728, model 440-420 es controla (figura 1) a partir de 6 fils, 4 d'ells corresponents a les fases A, noA, B i noB. El color del fil en marca la fase.
Figura 1. Taula de valors de les fases d'un motor pas a pas.
En el codi que es proposa l'activació de les fases es fa jugant amb els valors emmagatzemats en un regsitre de desplaçament. Els valors de les fases (parella (A,B)) es posen en el registre, en el format ((0,0), (0,1), (1,1), (1,0)). Desplaçant 2 valors de cop cap a la dreta dóna sortida al canvi de fase CCW, i si es fa cap a l'esquerra, es té el canvi de fase CW.
L'algorisme que es presenta implementa el control del motor pas a pas seguint aquest esquema (figura 2).
Figura 2. Codificació de les fases en el registre
Concretament,
- El registre rg s'inicialitza amb els valors descrits. Els pins 7 i 6 corresponen a les fases A i B, i els pins 3 i 2 a les fases noA i noB.
- La temporització s'ha posat a 10Hz i es porta a terme amb el timer1 en mode CTC per comparació en A. A cada interrupció es fan dos desplaçaments del registre rs donant sortida a les fases.
- El sentit de gir es fa amb el PINB.7. A 1-lògic el motor gira CW, a 0-lògic CCW.
.INCLUDE "m128def.inc"
.DEF srri = R10
.DEF zero = R12
.DEF temp = R16
.DEF sr = R17
.ORG 0x0
rjmp inici
.ORG 0x18
rjmp int_cmp1A
inici:
ldi YH, HIGH(RAMEND)
ldi YL, LOW(RAMEND)
out SPH, YH
out SPL, YL
ser temp
out DDRB, temp
sbi DDRD, 5
sbi PORTD, 7
ldi temp, 0b00011110
mov sr, temp
clr zero
ldi temp, (1<<WGM12)|(1<<CS12)
out TCCR1B, temp
ldi temp, high(6250)
out OCR1AH, temp
ldi temp, low(6250)
out OCR1AL, temp
ldi temp, (1<<OCIE1A)
out TIMSK, temp
sei
main: nop
rjmp main
int_cmp1A:
in srri, SREG
out PORTB, sr
sbic PIND, 7
rjmp dreta
lsl sr
adc sr, zero
lsl sr
adc sr, zero
rjmp final
dreta: lsr sr
brcc u
ori sr, 0b10000000
u: lsr sr
brcc final
ori sr, 0b10000000
final:out SREG, srri
reti; CONTROL MOTOR PAS A PAS
; Joan Oliver
; Universitat Autònoma de Barcelona
;
; el motor gira a una freq de 10Hz, per int'timer1A
; l'entrada PORTB.7 dóna el sentit de gir
; la sortida es dóna en:
; PORTB.7 6 5 4 3 2 1 0
; A B - -nAnB - -
; els bits no emprats del PORTD millor no emprar-los
; registre guarda status
; registre de control
; registre temporal
; registre de control
; rutina d'inici del programa
; rutina int'timer1_compA
;-------INICI--------------------------------------------------------
; inicialització stack
;-------SETUP PORTS---------------------------------------------------
; PORTB com a sortida
; sortida OC1A
; entrada en pull-up
; inicialització sr
;-------SETUP TIMER1-------------------------------------------------
; comparació a 12500 i prescaler=256 => 10Hz (ck0=16MHz)
; timer1 en mode CTC, prescaler a 256
; comparadorA a 6250
; interrupcions per comparadorA
; habilitació general d'interrupcions
;-------PROGRAMA PRINCIPAL--------------------------------------------
; tornar a programa principal
;-------INT'TIMER1_CMP_A----------------------------------------------
; rutina d'interrupció per comparació en A
; si PORTB.7=0 es va a CCW...
; ...si PORTB.7=1 es salta a CW
; gir a esquerra (CCW)
; ...compta que en els shifts hi entra el carry i...
;.............s'han de fer 'invents'
; gir a dreta (CW)