Motor speed control program

Tahmid

Joined Jul 2, 2008
343
Hi vishant,
Here I present a simple DC motor control circuit with PIC16F877A with program written in assembly language.
Rich (BB code):
; SOURCE CODE FOR DC MOTOR CONTROL WITH PIC16F877A
; -------------------------------------------------

; PREPARED BY-- SYED TAHMID MAHBUB 

; DATED-- 21-04-09  

;---------------------------------------------------------------

    TITLE: "DC MOTOR CONTROL WITH PIC 16F877A"  
        
        LIST   P=16F877A

       INCLUDE "P16F877A.INC"

       __CONFIG    H'3F72'

     ; __CONFIG _HS_OSC & _WDG_OFF & _PWRTE_ON & _CP_OFF

     ; 10 MHZ EXTERNAL CRYSTAL OSCILLATOR.    
     
;----------------- PROGRAM START -------------------------------------


           ORG     0X00          ; RESET VECTOR
           GOTO    INIT
           ORG     0X04          ; INTERRUPT VECTOR
           GOTO    INTR_SVC   

;------------------ INITIAL PROCESS ------------------------------

;-- PORT INITIALIZATION

INIT
           BSF      STATUS,RP0    ; CHANGE TO BANK 1
           MOVLW    B'00000001'   ; AN0 TO INPUT MODE
           MOVWF    TRISA         ; SET TRISA REGISTER
           CLRF     TRISC         ; MAKING PORTC ALL OUTPUT
           BCF      STATUS,RP0    ; CHANGE TO BANK0


;--- A/D CONVERTER INITIALIZATION 

           MOVLW    B'10000001'   ; FOSC/32,RA0/AN0,ADON=ON
           MOVWF    ADCON0        ; SET ADCON0 REGISTER
           BSF      STATUS,RP0    ; CHANGE TO BANK 1
           MOVLW    B'00001110'   ; ADFM=0,PCFG=1110
           MOVWF    ADCON1        ; SET ADCON1 REGISTER,IN BANK 1
           BCF      STATUS,RP0    ; FALLING BACK TO BANK 0

;--- PWM  INITIALIZATION 

           CLRF     TMR2          ; CLEAR TMR2 REGISTER
           CLRF     CCPR1L        ; CLEAR CCPR1L REGISTER
           BSF      STATUS,RP0    ; CHANGE TO BANK 1
           MOVLW    D'255'        ; PERIOD = 1638.4USEC(610 HZ)
           MOVWF    PR2           ; SET PR2 REGISTER,IN BANK 1
           BCF      STATUS,RP0    ; CHANGE TO BANK 0
           MOVLW    B'00000110'   ; PST=1:1,TMR1=ON,PRE=1:16
           MOVWF    T2CON         ; SET T2CON REGISTER
           MOVLW    B'00001100'   ; CCP1XY=0,CCP1M=1100(PWM)
           MOVWF    CCP1CON       ; SET CCP1CON REGISTER

;--- COMPARE MODE INITIALIZATION 

           CLRF     TMR1H         ; CLEAR TMR1H REGISTER
           CLRF     TMR1L         ; CLEAR TMR1L REGISTER
           MOVLW    0X09          ; H '9C4'=2500
           MOVWF    CCPR2H        ; SET CCPR2H REGISTER
           MOVLW    0XC4          ; 2500 X 0.4 uSEC = 1MSEC
           MOVWF    CCPR2L        ; SET CCPR2L REGISTER
           MOVLW    B'00000001'   ; TMR1= ON
           MOVWF    T1CON         ; SET T1 REGISTER
           MOVLW    B'00001011'   ; SET SPECIAL TRIGGER FOR A/D CONVERSION
           MOVWF    CCP2CON       ; SET CCP2CON REGISTER

;---INTERRUPTION  CONTROL

           BSF      STATUS,RP0
           MOVLW    B'00000001'   ; CCP2IE = ENABLE
           MOVWF    PIE2          ; SET PIE2 REGISTER
           BCF      STATUS,RP0
           MOVLW    B'11000000'   ; GIE = ON, PEIE = ON
           MOVWF    INTCON        ; SET INTCON REGISTER

WAIT
           GOTO     $             ; WAIT FOR INTERRUPTION

;------------------- INTERRUPTION  PROCESS --------------------------
INTR_SVC
           CLRF     PIR2          ; CLEAR INTERRUPTION FLAG
AD_CHECK  
           BTFSC    ADCON0,GO     ; A/D CONVERT END?
           GOTO     AD_CHECK      ; NO.CHECK AGAIN
           MOVF     ADRESH,W      ; READ ADRESH REGISTER
           MOVWF    CCPR1L       ; RESET DUTY CYCLE OF PWM
           RETFIE

;------------------- END OF INTERRUPTION PROCESS ---------------------

           END


;--------------------------------------------------------------------
;                   END OF THE MOTOR CONTROL PROCESS
;--------------------------------------------------------------------
 

Attachments

Top