Hola, les traigo en este post cómo controlar un motor por PWM.
Las ventajas del diseño que propongo es que se puede controlar el sentido de giro y la velocidad del mismo.
Para hacerlo funcionar se necesita crear una librería de retardos, misma que incluyo en el archivo adjunto.
Aunque está un poco "tosco" el código, funciona perfecto
Podemos variar la velocidad por medio de los dip switch, de un cero (detenido) a diez (velocidad máxima), si se pone un número mayor, se lee como cero.
Les dejo el código
La simulación y todos los archivos se encuentran el el .rar adjunto
Las ventajas del diseño que propongo es que se puede controlar el sentido de giro y la velocidad del mismo.
Para hacerlo funcionar se necesita crear una librería de retardos, misma que incluyo en el archivo adjunto.
Aunque está un poco "tosco" el código, funciona perfecto
Podemos variar la velocidad por medio de los dip switch, de un cero (detenido) a diez (velocidad máxima), si se pone un número mayor, se lee como cero.
Les dejo el código
La simulación y todos los archivos se encuentran el el .rar adjunto
Código:
;Programa de regulación de velocidad de un motor de corriente continua mediante la modulación
;de anchura de pulso(PWM). Por la linea de salida se genera una onda cuadrada de frecuencia
;constante s 100Hz(periodo de 10 ms) y ciclo de trabajo variable desde 0% a 100%, dependiendo
;del valor de la entrada del Puerto A. Es decir, el tiempo en alto varia entre 0 ms (0%) y 10
;ms (100%) de acuerdo con la siguiente tabla:
; (Ciclos_ON) (Ciclos_OFF)
; Entrada CD(%) SEMIPERIODO ALTO SEMIPERIODO BAJO
; ------- ----- ---------------- ----------------
; 0 0% 0 mn = 0 x 1 ms 10 ms = 10 x ms
; 1 10% 1 ms = 1 x 1 ms 9 ms = 9 x 1 ms
; 2 20% 2 ms = 2 x 1 ms 8 ms = 8 x 1 ms
; ... ... -------- -------
; 9 90% 9 ms = 9 x 1 ms 1 ms = 1 x 1 ms
; 10 100% 10 ms = 10 x 1 ms 0 ms = 0 x 1 ms
; >10 0%
;
;vector de configuracion**************************************************************************
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
LIST P=16F84A
INCLUDE <P16F84A.INC>
;Reservando memoria
CBLOCK 0x0C
Ciclos_ON
Ciclos_OFF
GuardaEntrada
SGIRO
ENDC
MaximaEntrada EQU .10;Se establece la entrada máxima
;ZONA DE CODIGOS*************************************************************************
ORG 0
Inicio:
bsf STATUS,RP0
movlw b'00001111' ;RA3:RA0 como entradas.
movwf TRISA
MOVLW b'00000001' ;CON EXCEPCIÓN DEL PIN RB0
MOVWF TRISB ;Las lineas del Puerto B se configuran como salidas.
bcf STATUS,RP0
Principal
movf PORTA,W ;Lee el valor de entrada.
ANDLW b'00001111'
movwf GuardaEntrada ;Guarda el valor.
;MOVF PORTA,W
btfsc STATUS,Z ;Si RA3:RA0=0 el motor se detiene
goto DC_CeroPorCiento
sublw MaximaEntrada ;(W)=VALOR MAXIMO (10)-(PORTA)
btfsc STATUS,Z ;Si el valor no es cero, ir a rutina de control
goto DC_100PorCiento ;Si el valor es cero, pasa a 100% de Duty Cycle
btfss STATUS,C ;¿C=1?,¿(w)positivo?,¿(PORTA)<=10?.
goto DC_CeroPorCiento ;Ha resultado(PORTA>10).
movwf Ciclos_OFF ;CiclosOff=10-(PORTA)
movf GuardaEntrada,W
movwf Ciclos_ON ;Carga RA3:RA0 en (Ciclos_ON).
;Ciclo total=CiclosOff+CiclosOn
;10=W(línea 50)-(PORTA)
Motor_ON
movf PORTB,W ;Lee el puerto de B.
ANDLW b'00000001' ;Máscara para pin RB0
movwf SGIRO ;Guarda el valor.
btfsc STATUS,Z ;Revisa z en status, si es 0, pasa a btfss (ver si es uno)
movlw b'00001000' ;Si es 1, carga el valor en el pin 4
btfss STATUS,Z ;Si z es 0, carga el valor en pin 5, y como ya se
;dió la condición de que sea 1, no puede "saltar" la condición
movlw b'00010000' ;Habilita los drivers y un sentido de giro.
movwf PORTB
call Retardo_1ms
decfsz Ciclos_ON,F ;Si(Ciclos_ON)=0 salta a Motor_OFF.
goto Motor_ON ;+2
Motor_OFF
clrf PORTB ;Inhabilita los drivers. Motor parado.
call Retardo_1ms
decfsz Ciclos_OFF,F ;Si(Ciclos_OFF)=0 salta a Principal.
goto Motor_OFF ;+1
goto Fin
DC_CeroPorCiento
clrf PORTB ;Inhabilita los drivers. Motor Parado.
goto Fin
DC_100PorCiento
movf PORTB,W ;Lee el puerto de B.
ANDLW b'00000001'
movwf SGIRO ;Guarda el valor.
btfsc STATUS,Z
;goto CAMBIO_SENTIDO_100
movlw b'00001000'
BTFSS STATUS,Z
movlw b'00010000' ;Habilita los drivers y un sentido de giro.
movwf PORTB
Fin:
goto Principal
INCLUDE<RETARDO.INC>
END