CONTROL GIRO MOTOR DC PROGRAMACIÓN MPLAB



PARA VER EL MONTAJE ELÉCTRICO DALE EN EL SIGUIENTE LINK
montaje eléctrico


;Los módulos CCPx
;Modo PWM con "pulse steering". Regulando la velocidad y sentido de giro de un motor DC.
;
;La tensión analógica que proporciona un potenciómetro del laboratorio se conecta con el canal
;RA0/AN0 para su conversión. El resultado de esta se usa para generar una señal PWM con un
;ciclo útil variable y un periodo de 4mS. Esta señal se utiliza para regular la potencia aplicada
;al motor y por tanto su velocidad.
;
;Con la modalidad de "pulse steering" podemos obtener la señal PWM hasta por cuatro salidas diferentes.
;Nos aprovechamos de esta cualidad para controlar el sentido de giro del motor. Mediante la entrada RA1
;seleccionamos el giro en sentido horario o anti horario.

List p=16F886 ;Tipo de procesador
include "P16F886.INC" ;Definiciones de registros internos

;Ajusta los valores de las palabras de configuración durante el ensamblado.Los bits no empleados
;adquieren el valor por defecto.Estos y otros valores se pueden modificar según las necesidades

__config _CONFIG1, _LVP_OFF&_PWRTE_ON&_WDT_OFF&_EC_OSC&_FCMEN_OFF&_BOR_OFF ;Palabra 1 de configuración
__config _CONFIG2, _WRT_OFF&_BOR40V ;Palabra 2 de configuración

Periodo equ .255 ;Valor para un periodo de 4096uS de la señal PWM ((255+1)*Preescaler de 16)

Duty_H equ 0x20 ;Contiene los 8 bits de más peso de la anchura del pulso
Duty_L equ 0x21 ;Contiene los 2 bits de menos peso de la anchura del pulso

org 0x00 ;Vector de RESET
goto Inicio
org 0x05

;Programa principal

Inicio   clrf PORTB
clrf PORTC ;Desconecta salidas
bsf STATUS,RP0
bsf STATUS,RP1 ;Banco 3
movlw b'00000001'
movwf ANSEL ;RA0/AN0/C12IN0- entrada analógica, resto digitales
clrf ANSELH ;Puerta B digital
bcf STATUS,RP1 ;Banco 1
movlw b'11111011'
movwf TRISB ;RB2/P1B salida
movlw b'11111011'
movwf TRISC ;RC2/CCP1/P1A salida
bcf STATUS,RP0 ;Selecciona banco 0
movlw b'00010000'
movwf PSTRCON ;Modo PULSE STEERING en OFF
bsf STATUS,RP0 ;Selecciona página 1

clrf ADCON1 ;Alineación izda. Vref= VDD para el convertidor ADC
bcf STATUS,RP0 ;Selecciona página 0

;Trabajando con un preescaler 1:16 y a una frecuancia de 4MHz, el TMR2 evoluciona cada 16 uS.
movlw b'00000111'
movwf T2CON ;TMR2 en On

;Se activa el ADC y se selecciona el canal RA0/AN0. Frecuencia de trabajo Fosc/32
movlw b'10000001'
movwf ADCON0 ;ADC en On, seleciona canal AN0
Loop bcf PIR1,ADIF ;Restaura el flag del conversor AD
bsf ADCON0,GO ;Inicia la conversión

;Esperar el final de la conversión y leer el resultado
ADC_Wait_0 btfss PIR1,ADIF ;Fin de conversión ??
goto ADC_Wait_0 ;Todavía no
movf ADRESH,W
movwf Duty_H ;Los 8 bits de más peso del resultado determinan el ciclo útil
bsf STATUS,RP0 ;Selecciona página 1
rrf ADRESL,F
rrf ADRESL,W
bcf STATUS,RP0 ;Selecciona página 0
andlw b'00110000'
movwf Duty_L ;Los 2 bits de menos peso del resultado determinan el ciclo útil

;El periodo se determina según el valor de la constante "Periodo". Este se carga sobre el
;registro PR2.
movlw Periodo-1
bsf STATUS,RP0 ;Selecciona página 1
movwf PR2
bcf STATUS,RP0 ;Selecciona página 0

;La anchura del pulso o "Duty" se determina según el valor con que se cargue el registro
;CCPR1L concatenado con los bits 4 y 5 de CCP1CON. Dichos valores se obtiene de las varia-
;bles Duty_H y Duty_L respectivamente.

movf Duty_H,W
movwf CCPR1L ;Carga los 8 bits de más peso

;El módulo CCP1 se configura en modo PWM con salida por RC2/CCP1. Los bits LSB se obtienen
;de la variable Duty_L
movlw b'00001100'
iorwf Duty_L,F
movwf CCP1CON ;Modo PWM para el módulo CCP1

;Comprueba el estado de RA1 para determinar el sentido de giro del motor
btfsc PORTA,1
goto Horario ;Si está a "1" giro en sentido horario

;Giro en sentido anti horario. La salida RC2/CCP1/P1A=PWM y RB2/P1B=0
movf PORTB,W
andlw b'11111011'
movwf PORTB ;RB2/P1B a nivel "0"
bsf STATUS,RP0 ;Banco 1
movlw b'00010001'
movwf PSTRCON ;Salida PWM por la patilla RC2/CCP1A/P1A
bcf STATUS,RP0 ;Banco 0
goto Loop

;Giro en sentido horario. La salida RC2/CCP1/P1A="0" y RB2/P1B=PWM
Horario movf PORTC,W
andlw b'11111011'
movwf PORTC ;RC2/CCP1/P1A a nivel "0"
bsf STATUS,RP0 ;Banco 1
movlw b'00010010'
movwf PSTRCON ;Salida PWM por RB2/P1B
bcf STATUS,RP0 ;Banco 0

goto Loop

end ;Fin del programa fuente

Next
Previous
Click here for Comments

0 comentarios: