Control de un motor por PWM con PIC16F84A

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

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
 

Adjuntos

  • Tercer Proyecto.rar
    1.2 MB · Visitas: 93
Atrás
Arriba