Continue to Site

Welcome to our site!

Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.

  • Welcome to our site! Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.

Stepper motor circuit for PIC16f877

Status
Not open for further replies.
flemmard said:
Hi all,
Can anyone give me the stepper motor control circuit for PIC ?
Thanks,

I can send you my version, but its in assembler, IIRC you a 'C' writer??
 
ericgibbs said:
I can send you my version, but its in assembler, IIRC you a 'C' writer??

Hi Gibbs,
Thanks for your reply.yes, I'm a C writer but i know a bit of assembly.So i can understand your code.Please send me.Btw, do you have circuit diagram ?Attached is the stepper motor I'm using for my school project :(
 

Attachments

  • stepper_motor.pdf
    126.9 KB · Views: 1,727
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.
 
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
 
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

Hi, thanks again !:)
 
Status
Not open for further replies.

Latest threads

Back
Top