Hola a todos:
soy nuevo en este foro
y estoy realizando un control de un motor DC por medio de un 16F88 , el control lo realizo por medio de un potenciometro el cual esta conectado a AN4, necesito que el por medio del potenciometro se le de la direccion y velocidad al motor, haciendo que en un extremo la velocidad sea maxima y la direccion hacia un lado, en el centro la velocidad sea minima o cero y se haga el cambio de direccion, y en el otro extremo velocidad maxima y el sentido contrario.
Estoy cargando el valor de la conversion ADC directamente en CCPR1L, y se que la conversion no es muy estable, es por eso que puse un filtro RC de 10ms a AN4,
y hasta intente con un filtro por software, pero aun asi mi progama hace que el valor del PWM no sea estable y aveces hasta como que se pierde el programa, el PWM
llega hasta cero cuando no debe o cambia de direccion repentinamente, no se si esto se debe a mi programacion, que me falte o sobre alguna instruccion, o si sea que utilizo el oscilador interno, o algo que no se me ocurra.
gracias por su ayuda.
;----------------Programa No.6
;----------------Control de un motor por medio de un Potenciometro
;RB3 CCPMX=0
;RB0 CCPMX=1
list p=16F88 ;indica el modelo de PIC que se usa
#include <p16F88.inc> ;Es una directiva de ensamblador
;Definicion de registros del microcontrolador
__CONFIG _CONFIG1, _CCP1_RB0 & _CP_OFF & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_IO
__CONFIG _CONFIG2, _IESO_OFF & _FCMEN_OFF
;---------------Definición de Variables------------------------------------
CBLOCK 0x020
DELH ;Variables contador
DELL ;para subrutina de retraso
CONTADOR ;Variable para reiniciar TMR0
ADCVALUE ;Guarda al dato de la conversion
ENDC
;---------------------------------------------------------------------------
ORG 0x00 ; vector de reset
goto MAIN ; salta al inicio del programa
ORG 0x04 ; vector de interrupcion
goto INT
;---------------INICIALIZACION---------------------------------------------
ORG 0x05
MAIN:
bsf STATUS,RP0 ; Selecciona banco 1
movlw 0x00 ; Programa el puerto B
movwf TRISB ; como salidas
movlw b'00010000' ; Programa el puerto A
movwf TRISA ; como salidas,excepto AN4
movlw 0x07 ; Programa las opciones de preescalador
movwf OPTION_REG ; Preescalador de 256
movlw 0x80
movwf INTCON ;Global interrupt enable
ADC_INI: ;Inicializacion del ADC
banksel ANSEL
movlw 0x10 ;Selecciona la entrada analogica AN4
movwf ANSEL
movlw 0x00 ;Seleccion de voltajes de referencia
movwf ADCON1
banksel ADCON0
movlw b'11100001'
movwf ADCON0
;bcf ADCON0,CHS0;3 ;Analog Channel AN 4
;bcf ADCON0,CHS1;4 '100'
;bsf ADCON0,CHS2;5
;bsf ADCON0,ADCS0;6 ;Conversion Clock
;bsf ADCON0,ADCS1;7 ;internal rc osc
;bsf ADCON0,ADON;0 ;ADON
PWM_INI: ;Inicializacion PWM
clrf TMR2
banksel PR2 ;TIMER 2
movlw 0xf9 ;Timer period register= 100 microseg
movwf PR2 ;Frecuencia de 4 KHz
banksel CCPR1L
movlw 0x00 ;PWM DUTY CYCLE sin movimiento
movwf CCPR1L
movlw b'00000100' ;Timer On
movwf T2CON
movlw b'00001100'
movwf CCP1CON ;Mode select PWM
;---------------------------------------------------------------------------
INICIO1:
banksel PORTA
movlw 0xff ;Retardo del TMR0
;0x16 Retardo de 60 ms presc 256
;0x7f Retardo de 33 ms presc 256
;0xff Retardo de 256 us presc 256
movwf CONTADOR
movwf TMR0
bsf INTCON,5 ;Activa interrupcion
bsf PORTB,3 ;L293 Chip Enable
INICIO:
nop
DELAY: movfw CONTADOR ; Subrutina de retrazo
movwf DELH ;
DEL2: movlw 0xff ;
movwf DELL
DEL1: decfsz DELL,f
goto DEL1
decfsz DELH,f
goto DEL2
goto INICIO ;se active
;----------------------------------------------------------------------
INT:
btfsc INTCON,TMR0IF;2 ; Checa las banderas de interrupcion
goto TIMER
goto INT2
TIMER:
bsf ADCON0,GO ;Enciende el ADC
btfsc ADCON0,GO ;Espera a que termine la conversion
goto $ - 1
movfw ADRESH
movwf ADCVALUE
bcf STATUS,C
movlw 0x80 ;Determina si el sentido del motor
;Menor que 0x80 va en reversa
subwf ADCVALUE,w
btfss STATUS,C
goto REVERSE
FORWARD:
movwf ADCVALUE ;Carga el nuevo valor del ADC
movwf CCPR1L ;Carga ese valor como DUTY CICLE del PWM
bcf STATUS,C ;registro despues de la resta
bsf PORTB,6 ;Prende el LED que muestra el sentido
bsf PORTB,4 ;Pines que determinan la direccion del motor
bcf PORTB,5
goto END_TMR0
REVERSE:
movlw 0x7f ;Invierte el valor del registro para
xorwf ADCVALUE,w ;poder tener el mayor ancho de pulso
movwf ADCVALUE ;en el menor valor de voltaje leido
movwf CCPR1L ;Carga ese valor como DUTY CICLE del PWM
bcf PORTB,6 ;Apaga el LED que muestra el sentido
bcf PORTB,4 ;Pines que determinan la direccion del motor
bsf PORTB,5
END_TMR0:
;banksel CCP1CON
;bcf CCP1CON,5
;bcf CCP1CON,4
;banksel PORTA
bcf INTCON,2 ;Reinicia el Timer 0
movfw CONTADOR
movwf TMR0
INT2 retfie
;--------------------------------------------------------------------------
;Retrasos
END