схема.
Тут при нажатии на forward/reverse двигатель идет с одной скоростью(ооочень медленно) , при нажатии full step скорость можно менять с помощью переменного резистора.
Хотелось бы откинуть full step и сделать чтобы резистором регулировалась скорость кнопок forward/reverse.
Код на ассемблере
Код: Выделить всё
;*******************************
;Stepper.asm
;drives a Stepper motor forward and reverse
;13-11-2010
;*******************************
list p=12F629
radix dec
include "p12f629.inc"
errorlevel -302 ; Don't complain about BANK 1 registers
__CONFIG _MCLRE_OFF & _CP_OFF
& _WDT_OFF & _INTRC_OSC_NOCLKOUT ;Internal osc.
;_MCLRE_OFF - master clear must be off for gp3 as input pin
;******************************
; variables - names and files
;*****************************
temp1 equ 20h ;
temp2 equ 21h ;
Sw_Flag equ 25h ;switch flag for "inching"
loops equ 26h ;loops for full stepping
count equ 27h ;loops of discharge time for 100n
PotValue equ 28h ;value of pot
look equ 29h ;look for pot value every 100 loops
;***************************
;Equates
;***************************
status equ 0x03
rp1 equ 0x06
rp0 equ 0x05
GPIO equ 0x05
status equ 03h
option_reg equ 81h
; bits on GPIO
pin7 equ 0 ;GP0 100k speed pot
pin6 equ 1 ;GP1 output1 to stepper motor
pin5 equ 2 ;GP2 output2 to stepper motor
pin4 equ 3 ;GP3 Input from buttons
pin3 equ 4 ;GP4 output3 to stepper motor
pin2 equ 5 ;GP5 output4 to stepper motor
;bits
rp0 equ 5 ;bit 5 of the status register
;**********************
;Beginning of program
;**********************
org 0x00
nop
nop
nop
nop
nop
SetUp bsf status, rp0 ;Bank 1
movlw b'11001000' ;Set TRIS GP1,2,4,5 out GP3 input
movwf TRISIO
bcf status, rp0 ;bank 0
movlw 07h ;turn off Comparator ports
movwf CMCON ;must be placed in bank 0
clrf GPIO ;Clear GPIO of junk
clrf Sw_Flag
incf Sw_Flag,1 ;put a bit onto Sw_Flag
goto Main
;****************
;delays *
;****************
_uS movlw 08Ch
movwf temp1
decfsz temp1,f
goto $-1
retlw 00
;delay for pulsing servo anticlockwise
acw
movlw 60h
movwf temp1
decfsz temp1,f
goto $-1
retlw 00
_1mS nop
decfsz temp1,f
goto _1mS
retlw 00
_5mS movlw .5
movwf temp2
nop
decfsz temp1,f
goto $-2
decfsz temp2,f
goto $-4
retlw 00
_10mS movlw 0Ah
movwf temp2
nop
decfsz temp1,f
goto $-2
decfsz temp2,f
goto $-4
retlw 00
_15mS movlw .15
movwf temp2
nop
decfsz temp1,f
goto $-2
decfsz temp2,f
goto $-4
retlw 00
_18mS movlw .18
movwf temp2
nop
decfsz temp1,f
goto $-2
decfsz temp2,f
goto $-4
retlw 00
_50mS movlw .50
movwf temp2
nop
decfsz temp1,f
goto $-2
decfsz temp2,f
goto $-4
retlw 00
_100mS movlw .100
movwf temp2
nop
decfsz temp1,f
goto $-2
decfsz temp2,f
goto $-4
retlw 00
_200mS movlw .200
movwf temp2
nop
decfsz temp1,f
goto $-2
decfsz temp2,f
goto $-4
retlw 00
;delay to create value for pot for speed
PotDel movlw 040h ;40h produces 12 loops
movwf temp1
decfsz temp1,f
goto $-1
retlw 00
;***************************
; Sub Routines *
;***************************
;position of pot creates a value in PotValue
Pot bsf status,rp0
bcf trisio,0 ;Make GP0 output
bcf status,rp0
bcf gpio,0 ;make GP0 LOW
call _1mS ;create delay to discharge 100n
bsf status,rp0
bsf trisio,0 ;Make GP0 input
bcf status,rp0
clrf PotValue
call PotDel
incf PotValue,f
btfss gpio,0 ;is input HIGH?
goto $-3
retlw 00 ;returns with a value in PotValue
;******************
;* Main *
;******************
Main clrf gpio
bcf gpio,5 ;gpio,5 high for a short time
call _1mS
bsf gpio,5
nop
btfss gpio,3
goto $+2
goto $+6 ;go to half step Forward
clrf gpio
bsf gpio,1
btfss gpio,3
goto Reverse ;go to half step Reverse
goto _FS ;go to Full Step - for forward or reverse
btfsc Sw_Flag,0
goto _1HSF_
btfsc Sw_Flag,1
goto _2HSF_
btfsc Sw_Flag,2
goto _3HSF_
btfsc Sw_Flag,3
goto _4HSF_
btfsc Sw_Flag,4
goto _5HSF_
btfsc Sw_Flag,5
goto _6HSF_
btfsc Sw_Flag,6
goto _7HSF_
goto _8HSF_
_1HSF_ movlw b'00100000' ;1
goto _C
_2HSF_ movlw b'00110000' ;2
goto _C
_3HSF_ movlw b'00010000' ;3
goto _C
_4HSF_ movlw b'00010100' ;4
goto _C
_5HSF_ movlw b'00000100' ;5
goto _C
_6HSF_ movlw b'00000110' ;6
goto _C
_7HSF_ movlw b'00000010' ;7
goto _C
_8HSF_ movlw b'00100010' ;8
movwf gpio
call _200mS
clrf gpio
call _200mS
call _200mS
clrf Sw_Flag
incf Sw_Flag,1
bsf gpio,5
nop
btfsc gpio,3 ;see if sw is still pressed for full speed
goto HS_Fwd
bcf gpio,5
goto Main
_C movwf gpio
call _200mS
clrf gpio
call _200mS
call _200mS
bcf status,0 ;clear the carry
rlf Sw_Flag,1
bsf gpio,5
nop
btfsc gpio,3 ;see if sw is still pressed for full speed
goto HS_Fwd
bcf gpio,5
goto Main
;reverse - half step
Reverse
clrf gpio
bcf gpio,4 ;gpio,4 high for a short time
call _1mS
bsf gpio,4
nop
btfss gpio,3
goto Main
btfsc Sw_Flag,0
goto _1HSR_
btfsc Sw_Flag,1
goto _2HSR_
btfsc Sw_Flag,2
goto _3HSR_
btfsc Sw_Flag,3
goto _4HSR_
btfsc Sw_Flag,4
goto _5HSR_
btfsc Sw_Flag,5
goto _6HSR_
btfsc Sw_Flag,6
goto _7HSR_
goto _8HSR_
_1HSR_ movlw b'00100000' ;1
movwf gpio
call _200mS
clrf gpio
call _200mS
call _200mS
Movlw 80h
movwf Sw_Flag
bsf gpio,4
nop
btfsc gpio,3 ;see if sw is still pressed for full speed
goto HS_Rev
bcf gpio,4
goto Main
_2HSR_ movlw b'00110000' ;2
goto _D
_3HSR_ movlw b'00010000' ;3
goto _D
_4HSR_ movlw b'00010100' ;4
goto _D
_5HSR_ movlw b'00000100' ;5
goto _D
_6HSR_ movlw b'00000110' ;6
goto _D
_7HSR_ movlw b'00000010' ;7
goto _D
_8HSR_ movlw b'00100010' ;8
goto _D
_D movwf gpio
call _200mS
clrf gpio
call _200mS
call _200mS
bcf status,0 ;clear the carry
rrf Sw_Flag,1
bsf gpio,4
nop
btfsc gpio,3 ;see if sw is still pressed for full speed
goto HS_Rev
bcf gpio,4
goto Main
;half step forward
HS_Fwd
clrf gpio
bcf gpio,5 ;gpio,5 high for a short time
call _1mS
bsf gpio,5
nop
btfss gpio,3
goto Main
btfsc Sw_Flag,0
goto _1HSF
btfsc Sw_Flag,1
goto _2HSF
btfsc Sw_Flag,2
goto _3HSF
btfsc Sw_Flag,3
goto _4HSF
btfsc Sw_Flag,4
goto _5HSF
btfsc Sw_Flag,5
goto _6HSF
btfsc Sw_Flag,6
goto _7HSF
goto _8HSF
_1HSF movlw b'00100000' ;1
goto _CC
_2HSF movlw b'00110000' ;2
goto _CC
_3HSF movlw b'00010000' ;3
goto _CC
_4HSF movlw b'00010100' ;4
goto _CC
_5HSF movlw b'00000100' ;5
goto _CC
_6HSF movlw b'00000110' ;6
goto _CC
_7HSF movlw b'00000010' ;7
goto _CC
_8HSF movlw b'00100010' ;8
movwf gpio
call _5mS
clrf gpio
clrf Sw_Flag
incf Sw_Flag,1
goto HS_Fwd
_CC movwf gpio
call _5mS
clrf gpio
bcf status,0 ;clear the carry
rlf Sw_Flag,1
goto HS_Fwd
;half step reverse
HS_Rev
clrf gpio
bcf gpio,4 ;gpio,4 high for a short time
call _1mS
bsf gpio,4
nop
btfss gpio,3
goto Main
btfsc Sw_Flag,0
goto _1HSR
btfsc Sw_Flag,1
goto _2HSR
btfsc Sw_Flag,2
goto _3HSR
btfsc Sw_Flag,3
goto _4HSR
btfsc Sw_Flag,4
goto _5HSR
btfsc Sw_Flag,5
goto _6HSR
btfsc Sw_Flag,6
goto _7HSR
goto _8HSR
_1HSR movlw b'00100000' ;1
movwf gpio
call _10mS
clrf gpio
Movlw 80h
movwf Sw_Flag
goto HS_Rev
_2HSR movlw b'00110000' ;2
goto _G
_3HSR movlw b'00010000' ;3
goto _G
_4HSR movlw b'00010100' ;4
goto _G
_5HSR movlw b'00000100' ;5
goto _G
_6HSR movlw b'00000110' ;6
goto _G
_7HSR movlw b'00000010' ;7
goto _G
_8HSR movlw b'00100010' ;8
goto _G
_G movwf gpio
call _10mS
clrf gpio
bcf status,0 ;clear the carry
rrf Sw_Flag,1
goto HS_Rev
;decide on full step forward or reverse
_FS clrf gpio
bsf gpio,5
btfss gpio,3
goto $+2
goto FS_Fwd
bsf gpio,4
btfss gpio,3
goto $+2
goto FS_Rev
clrf gpio
call _1mS
goto $-10
;Full Step Forward
FS_Fwd call pot ;returns with value in PotValue
movlw .50
movwf look ;look at pot every 50 loops
movlw b'00000010' ;full step forward
movwf gpio
movf PotValue,w
movwf loops
call _1mS
decfsz loops,1
goto $-2
movlw b'00000100'
movwf gpio
movf PotValue,w
movwf loops
call _1mS
decfsz loops,1
goto $-2
movlw b'00010000'
movwf gpio
movf PotValue,w
movwf loops
call _1mS
decfsz loops,1
goto $-2
movlw b'00100000'
movwf gpio
movf PotValue,w
movwf loops
call _1mS
decfsz loops,1
goto $-2
decfsz look,1
goto FS_Fwd+3 ;don't look at pot
goto FS_Fwd ;look at pot
;Full Step Reverse
FS_Rev call pot ;returns with value in PotValue
movlw .50
movwf look ;look at pot every 50 loops
movlw b'00100000' ;full step reverse
movwf gpio
movf PotValue,w
movwf loops
call _1mS
decfsz loops,1
goto $-2
movlw b'00010000'
movwf gpio
movf PotValue,w
movwf loops
call _1mS
decfsz loops,1
goto $-2
movlw b'00000100'
movwf gpio
movf PotValue,w
movwf loops
call _1mS
decfsz loops,1
goto $-2
movlw b'00000010'
movwf gpio
movf PotValue,w
movwf loops
call _1mS
decfsz loops,1
goto $-2
decfsz look,1
goto FS_Rev+3 ;don't look at pot
goto FS_Rev ;look at pot
END