Follow along with the video below to see how to install our site as a web app on your home screen.
Note: This feature may not be available in some browsers.
flemmard said:Hi all,
Can anyone give me the stepper motor control circuit for PIC ?
Thanks,
ericgibbs said:I can send you my version, but its in assembler, IIRC you a 'C' writer??
ericgibbs said:hi,
Look at Nigel's :
I'll tidy up my code, add a few comments and post it later.
I have read the motor data sheet.
;Stepper Motor 4 Winding Driver Half Step Mode.
;27/09/2007 Program in development stage.
;
;Uses Macro's to control motor
list p=16f877
#include <p16f877.inc>
errorlevel -302
__CONFIG _CP_OFF & _XT_OSC & _PWRTE_ON & _WDT_OFF & _LVP_OFF
VARIABLE SIM1
SIM1 SET .1 ;if 1 then its picsim, then USEC delays are skipped.
; Set stepper PORT & pins
#define MTRPORT PORTB
#define MTRW 0 ; west pole
#define MTRN 1 ; north pole
#define MTRE 2 ; east pole
#define MTRS 3 ; south pole
;General Registers
GR20 EQU 0x20
GR21 EQU 0x21
GR22 EQU 0x22
GR23 EQU 0x23
GR24 EQU 0x24
GR25 EQU 0x25
GR26 EQU 0x26
GR27 EQU 0x27
GR28 EQU 0x28
GR29 EQU 0x29
GR2A EQU 0x2A
GR2B EQU 0x2B
STEP_VAL EQU 0x2C
an0 EQU 0x2D ;uses ADC chan0, reference only.
LOOPL EQU 0X30 ;delay subr registers
LOOPH EQU 0X31
;
USECL EQU 0X32 ;user delay entry
USECH EQU 0X33
;clock wise number of STEP_VAL and uSec delay between STEP_VAL.
MTRCW MACRO STEP,USEC
LOCAL STEP,USEC
MOVLW STEP
MOVWF GR2A
MOVLW LOW USEC
MOVWF USECL
MOVLW HIGH USEC
MOVWF USECH
CALL TURN_CW
ENDM
;counter clockwise number of STEP_VAL and uSec delay between STEP_VAL.
MTRCCW MACRO STEP,USEC
LOCAL STEP,USEC
MOVLW STEP
MOVWF GR2A
MOVLW LOW USEC
MOVWF USECL
MOVLW HIGH USEC
MOVWF USECH
CALL TURN_CCW
ENDM
;Program
ORG 0x0000
BCF PCLATH,3
BCF PCLATH,4
GOTO START
ORG 0x0004
RETFIE
START:
BSF STATUS,RP0 ;bank1
MOVLW 0x0E ;d,d,d,d,d,d,d,a0
MOVWF ADCON1
CALL DATUM ;init PORT & move motor to 315deg Datum NW
BCF STATUS,RP0 ;bank0
MAIN:
MTRCCW .25, .500; mtr cw 25 steps, with 500uSec interstep delay
MTRCW .10, .5 ; mtr ccw 10 steps, 5uSec delay
TRAP:
GOTO MAIN
TURN_CCW:
MOVF GR2A,F
BTFSC STATUS,Z
RETURN
DO_CCW:
CALL STEP_CCW
MOVF USECL,W
MOVWF LOOPL
MOVF USECH,W
MOVWF LOOPH
CALL US_LOOP
DECFSZ GR2A,F
GOTO DO_CCW
RETURN
TURN_CW:
MOVF GR2A,F
BTFSC STATUS,Z
RETURN
DO_CW:
CALL STEP_CW
MOVF USECL,W
MOVWF LOOPL
MOVF USECH,W
MOVWF LOOPH
CALL US_LOOP
MOVF STEP_VAL,W
DECFSZ GR2A,F
GOTO DO_CW
RETURN
; 16 bit micro-sec loop subr
US_LOOP:
IF SIM1 == 0X01
RETURN
else
MOVLW 0x10
SUBWF LOOPL,F
CLRW
BTFSS STATUS,C
ADDLW 0x01
SUBWF LOOPH,F
BTFSS STATUS,C
RETURN
GOTO WW2
WW2: MOVLW 0x0A
SUBWF LOOPL,F
CLRW
BTFSS STATUS,C
ADDLW 0x01
SUBWF LOOPH,F
BTFSS STATUS,C
RETURN
GOTO WW2
ENDIF
;Init PORT & Move stepper to Datum 315deg
DATUM:
BSF STATUS,RP0
BCF TRISB,MTRW
BCF TRISB,MTRN
BCF TRISB,MTRE
BCF TRISB,MTRS
BCF STATUS,RP0
BSF MTRPORT,MTRW
BSF MTRPORT,MTRN
BCF MTRPORT,MTRE
BCF MTRPORT,MTRS
CLRF STEP_VAL
BCF STATUS,RP0
RETURN
; Half-Step Routine
STEP_CW:
INCF STEP_VAL,F
GOTO ST03
STEP_CCW:
DECF STEP_VAL,F
ST03: BTFSC STEP_VAL,2
GOTO ST04
BTFSC STEP_VAL,1
GOTO ST05
BTFSC STEP_VAL,0
GOTO ST21
GOTO ST20
ST05: BTFSC STEP_VAL,0
GOTO ST23
GOTO ST22
ST04: BTFSC STEP_VAL,1
GOTO ST06
BTFSC STEP_VAL,0
GOTO ST25
GOTO ST24
ST06: BTFSC STEP_VAL,0
GOTO ST27
GOTO ST26
ST20: BSF MTRPORT,MTRW
BSF MTRPORT,MTRN
BCF MTRPORT,MTRE
BCF MTRPORT,MTRS
RETURN
ST21: BCF MTRPORT,MTRW
BSF MTRPORT,MTRN
BCF MTRPORT,MTRE
BCF MTRPORT,MTRS
RETURN
ST22: BCF MTRPORT,MTRW
BSF MTRPORT,MTRN
BSF MTRPORT,MTRE
BCF MTRPORT,MTRS
RETURN
ST23: BCF MTRPORT,MTRW
BCF MTRPORT,MTRN
BSF MTRPORT,MTRE
BCF MTRPORT,MTRS
RETURN
ST24: BCF MTRPORT,MTRW
BCF MTRPORT,MTRN
BSF MTRPORT,MTRE
BSF MTRPORT,MTRS
RETURN
ST25: BCF MTRPORT,MTRW
BCF MTRPORT,MTRN
BCF MTRPORT,MTRE
BSF MTRPORT,MTRS
RETURN
ST26: BSF MTRPORT,MTRW
BCF MTRPORT,MTRN
BCF MTRPORT,MTRE
BSF MTRPORT,MTRS
RETURN
ST27: BSF MTRPORT,MTRW
BCF MTRPORT,MTRN
BCF MTRPORT,MTRE
BCF MTRPORT,MTRS
RETURN
END
ericgibbs said:hi,
Here is my working code, works OK, needs optimising.
Code:;Stepper Motor 4 Winding Driver Half Step Mode. ;27/09/2007 Program in development stage. ; ;Uses Macro's to control motor list p=16f877 #include <p16f877.inc> errorlevel -302 __CONFIG _CP_OFF & _XT_OSC & _PWRTE_ON & _WDT_OFF & _LVP_OFF VARIABLE SIM1 SIM1 SET .1 ;if 1 then its picsim, then USEC delays are skipped. ; Set stepper PORT & pins #define MTRPORT PORTB #define MTRW 0 ; west pole #define MTRN 1 ; north pole #define MTRE 2 ; east pole #define MTRS 3 ; south pole ;General Registers GR20 EQU 0x20 GR21 EQU 0x21 GR22 EQU 0x22 GR23 EQU 0x23 GR24 EQU 0x24 GR25 EQU 0x25 GR26 EQU 0x26 GR27 EQU 0x27 GR28 EQU 0x28 GR29 EQU 0x29 GR2A EQU 0x2A GR2B EQU 0x2B STEP_VAL EQU 0x2C an0 EQU 0x2D ;uses ADC chan0, reference only. LOOPL EQU 0X30 ;delay subr registers LOOPH EQU 0X31 ; USECL EQU 0X32 ;user delay entry USECH EQU 0X33 ;clock wise number of STEP_VAL and uSec delay between STEP_VAL. MTRCW MACRO STEP,USEC LOCAL STEP,USEC MOVLW STEP MOVWF GR2A MOVLW LOW USEC MOVWF USECL MOVLW HIGH USEC MOVWF USECH CALL TURN_CW ENDM ;counter clockwise number of STEP_VAL and uSec delay between STEP_VAL. MTRCCW MACRO STEP,USEC LOCAL STEP,USEC MOVLW STEP MOVWF GR2A MOVLW LOW USEC MOVWF USECL MOVLW HIGH USEC MOVWF USECH CALL TURN_CCW ENDM ;Program ORG 0x0000 BCF PCLATH,3 BCF PCLATH,4 GOTO START ORG 0x0004 RETFIE START: BSF STATUS,RP0 ;bank1 MOVLW 0x0E ;d,d,d,d,d,d,d,a0 MOVWF ADCON1 CALL DATUM ;init PORT & move motor to 315deg Datum NW BCF STATUS,RP0 ;bank0 MAIN: MTRCCW .25, .500; mtr cw 25 steps, with 500uSec interstep delay MTRCW .10, .5 ; mtr ccw 10 steps, 5uSec delay TRAP: GOTO MAIN TURN_CCW: MOVF GR2A,F BTFSC STATUS,Z RETURN DO_CCW: CALL STEP_CCW MOVF USECL,W MOVWF LOOPL MOVF USECH,W MOVWF LOOPH CALL US_LOOP DECFSZ GR2A,F GOTO DO_CCW RETURN TURN_CW: MOVF GR2A,F BTFSC STATUS,Z RETURN DO_CW: CALL STEP_CW MOVF USECL,W MOVWF LOOPL MOVF USECH,W MOVWF LOOPH CALL US_LOOP MOVF STEP_VAL,W DECFSZ GR2A,F GOTO DO_CW RETURN ; 16 bit micro-sec loop subr US_LOOP: IF SIM1 == 0X01 RETURN else MOVLW 0x10 SUBWF LOOPL,F CLRW BTFSS STATUS,C ADDLW 0x01 SUBWF LOOPH,F BTFSS STATUS,C RETURN GOTO WW2 WW2: MOVLW 0x0A SUBWF LOOPL,F CLRW BTFSS STATUS,C ADDLW 0x01 SUBWF LOOPH,F BTFSS STATUS,C RETURN GOTO WW2 ENDIF ;Init PORT & Move stepper to Datum 315deg DATUM: BSF STATUS,RP0 BCF TRISB,MTRW BCF TRISB,MTRN BCF TRISB,MTRE BCF TRISB,MTRS BCF STATUS,RP0 BSF MTRPORT,MTRW BSF MTRPORT,MTRN BCF MTRPORT,MTRE BCF MTRPORT,MTRS CLRF STEP_VAL BCF STATUS,RP0 RETURN ; Half-Step Routine STEP_CW: INCF STEP_VAL,F GOTO ST03 STEP_CCW: DECF STEP_VAL,F ST03: BTFSC STEP_VAL,2 GOTO ST04 BTFSC STEP_VAL,1 GOTO ST05 BTFSC STEP_VAL,0 GOTO ST21 GOTO ST20 ST05: BTFSC STEP_VAL,0 GOTO ST23 GOTO ST22 ST04: BTFSC STEP_VAL,1 GOTO ST06 BTFSC STEP_VAL,0 GOTO ST25 GOTO ST24 ST06: BTFSC STEP_VAL,0 GOTO ST27 GOTO ST26 ST20: BSF MTRPORT,MTRW BSF MTRPORT,MTRN BCF MTRPORT,MTRE BCF MTRPORT,MTRS RETURN ST21: BCF MTRPORT,MTRW BSF MTRPORT,MTRN BCF MTRPORT,MTRE BCF MTRPORT,MTRS RETURN ST22: BCF MTRPORT,MTRW BSF MTRPORT,MTRN BSF MTRPORT,MTRE BCF MTRPORT,MTRS RETURN ST23: BCF MTRPORT,MTRW BCF MTRPORT,MTRN BSF MTRPORT,MTRE BCF MTRPORT,MTRS RETURN ST24: BCF MTRPORT,MTRW BCF MTRPORT,MTRN BSF MTRPORT,MTRE BSF MTRPORT,MTRS RETURN ST25: BCF MTRPORT,MTRW BCF MTRPORT,MTRN BCF MTRPORT,MTRE BSF MTRPORT,MTRS RETURN ST26: BSF MTRPORT,MTRW BCF MTRPORT,MTRN BCF MTRPORT,MTRE BSF MTRPORT,MTRS RETURN ST27: BSF MTRPORT,MTRW BCF MTRPORT,MTRN BCF MTRPORT,MTRE BCF MTRPORT,MTRS RETURN END