DEFINE OSC 8
DEFINE LCD_DREG PORTD
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTD
DEFINE LCD_RSBIT 2
DEFINE LCD_EREG PORTD
DEFINE LCD_EBIT 3
DEFINE CCP1_REG PORTC
DEFINE CCP1_BIT 2
DEFINE CCP2_REG PORTC
DEFINE CCP2_BIT 1
'
TMR1 VAR WORD 'variable de captura del timer1
VTMR1 VAR WORD 'variable para acumular captura del timer1
SENTIDO VAR BIT 'sentido de giro
FRENADO VAR BIT
FPWM VAR WORD 'frecuencia del pwm
VEL VAR BYTE 'velocidad de gigo del motor 0-255
SP1 VAR WORD 'set point
symbol B1=PORTC.6
symbol B2=PORTC.7
LCDOUT $FE, 1
LCDOUT "SERVO DRIVER AUC"
PAUSE 500
TMR1=0
VTMR1=0
SENTIDO=1
SP1=350 '350 pulsos del encoder
FRENADO=0
FPWM=320
TRISC = %11100001
CCP1CON = %00000101 'captura cada transicion de subida (primeros 4 bit)
'bit 5 y 6 solo se usan en PWM
T1CON = %00000011 'bit0=1 enable timmer1 TMR1ON, bit1=1 reloj externo
'sincroniza reloj externo, apaga oscilador, 1:1 preescaler
PORTC.3 = 1 'Enable del motor
VEL=255
PORTC.4=0
HPWM 2, VEL,FPWM 'por RC1 sale el PWM con un duty=Vel, frecuencia FPWM
TMR1H = 0
TMR1L = 0
Inicio:
IF B1=1 THEN GOTO CAM_POS 'si presiono B1 cambio la posicion a la que
TMR1H = 0 'se debe mover el servo, cambia el sentido
TMR1L = 0
T1CON.0 = 1 'activamos el timer1 por 1 mS para capturar
PAUSE 1 'informacion
if portc.4=0 then 'Si el RC4 No esta Activo gira en un sentido
SENTIDO=1
ELSE 'si esta activo gira en sentido contrario
SENTIDO=0
ENDIF
T1CON.0 = 0 'se apaga el timer1 para tomar la informacion
TMR1.BYTE0 = TMR1L
TMR1.BYTE1 = TMR1H
if sentido=1 then
VTMR1=VTMR1+TMR1 'acumula el conteo
else
VTMR1=VTMR1-TMR1 'resta el conteo
endif
LCDOUT $FE, 1, " POS = ",DEC VTMR1 'se manda al LCD
pause 1
IF vTMR1 = SP1 then 'si llegaste al set point PWM=0 y frena el motor
VEL=0
goto Frenar
ENDIF
GOTO Inicio
Frenar:
hpwm 2,0,FPWM 'pwm=0
PORTD.0=1 'si RD0 y RD1 estan en 1 se frena el motor
PORTD.1=1
portc.4=0 'se desenergiza el relevador de cambio de giro
VEL = 0
GOTO Inicio
CAM_POS:
if B1=1 THEN GOTO CAM_POS
IF SP1 = 350 THEN 'si esta en la posicion 350, cambia el sentido
SP1=50 'y se va a la posicion 50
PORTD.0=0
PORTD.1=0
PORTC.4=1
vel=30 'a una velocidad muy lenta
HPWM 2,VEL,FPWM
ELSE 'si esta en la posicion 50 cambia el sentido
vel=255 'y se va a la posicion 350
SP1=350 'a maxima velocidad
PORTD.0=0
PORTD.1=0
PORTC.4=0
HPWM 2,VEL,FPWM
ENDIF
GOTO Inicio
END