以前用MEGA8和C参考AVR里的例程做过12864和1602液晶,最近学PIC不到一个月,动手做了个步进电机的笑笑驱动系统,大家讨论。
电机是由硬盘上拆下来的,用三个9013驱动,按照六拍运行,上电后缓慢加速,
效果还不错,只是有点噪声
P16F716的资源用到T0,T1,INDF指针,希望大家给点意见
#include <P16F716.INC>
;*****************变量定义*******************
CBLOCK 70H
ADD_STEP1
ADD_STEP2
ADD_STEP3
ADD_STEP4
ADD_STEP5
ADD_STEP6
STEP_NUM
WREG_TEMP
STATUS_TEMP
BASE_NUM
COUNT
TMR0_V
ENDC
__CONFIG _CP_OFF&_BODEN_ON&_PWRTE_ON&_WDT_OFF&_RC_OSC
;*****************复位入口******************
ORG 00H
GOTO MAIN
;*****************中断入口******************
ORG 04H
MOVWF WREG_TEMP ;保护WREG
SWAPF STATUS,0
MOVWF STATUS_TEMP ;保护STATUS
;****************************************
; 查询中断
; TMR0为最高优先级
;****************************************
BTFSC PIR1,TMR1IF
GOTO T1_SERV
BTFSC INTCON,T0IF
GOTO T0_SERV
GOTO RET
;****************************************
; T0中断
; 查表转换,循环步进数,驱动电机
;****************************************
T0_SERV
BCF INTCON,T0IF ;清中断标志
MOVF TMR0_V,0
MOVWF TMR0 ;赋定时值
INCF FSR
MOVF INDF,0
MOVWF PORTA
SUBLW 0x05
BNZ RET
MOVLW 0x6F
MOVWF FSR ;FSR指向STEP_ONE
GOTO RET
;****************************************
; T1中断处理 1ms定时
; 负责TMR0从00加到D7
; 之后屏蔽此中断
;****************************************
T1_SERV
BCF PIR1,TMR1IF
MOVLW 0xFC
MOVWF TMR1H
MOVLW 0x17
MOVWF TMR1L ;赋定时值
INCF TMR0_V,1
MOVLW 0xEC ;152us
SUBWF TMR0_V,0
BNZ RET ;Z非零,跳到RET
MOVLW 0xEC ;Z=0
MOVWF TMR0_V
BCF T1CON,TMR1ON ;关TMR1中断
GOTO RET
;************中断返回,恢复现场*************
RET
SWAPF STATUS_TEMP,0
MOVWF STATUS ;恢复STATUS
SWAPF WREG_TEMP,1
SWAPF WREG_TEMP,0 ;恢复WREG
RETFIE
;******************主函数******************
ORG 50H
MAIN
BSF STATUS,RP0
MOVLW B'11111000'
MOVWF TRISA ;RA0,RA1,RA2输出
MOVLW B'11111111'
MOVWF TRISB ;RB0作为按键输入
MOVLW B'00000010' ;内部上拉,下降沿触发,
MOVWF OPTION_REG ;T0时钟为内部FOCS/4,;8分频
BSF PIE1,TMR1IE
BCF STATUS,RP0
MOVLW .0
MOVWF T1CON
BCF PIR1,TMR1IF
;MOVLW .101
;MOVWF BASE_NUM ;延时基数
MOVLW 0x01
MOVWF ADD_STEP1
MOVLW 0x03
MOVWF ADD_STEP2
MOVLW 0x02
MOVWF ADD_STEP3
MOVLW 0x06
MOVWF ADD_STEP4
MOVLW 0x04
MOVWF ADD_STEP5
MOVLW 0x05
MOVWF ADD_STEP6
MOVLW 0x70 ;不能用STEP_ONE代替
MOVWF FSR ;FSR指向STEP_ONE所在寄存器
MOVLW 0x01 ;使转子固定在某一相位上,防止启动时的抖动
MOVWF PORTA
CALL DELAY ;等待步进电机平稳
MOVLW 0x00
MOVWF TMR0_V
MOVWF TMR0
MOVLW 0xFC
MOVWF TMR1H
MOVLW 0x17
MOVWF TMR1L
BSF T1CON,TMR1ON
MOVLW B'11110000' ;开外设、T0、INT中断允许
MOVWF INTCON
LOOP GOTO LOOP
;******************DELAY******************
DELAY
MOVLW .201
MOVWF COUNT
LOOP1 DECFSZ COUNT,1
GOTO LOOP1
;DECFSZ BASE_NUM,1
;GOTO DELAY
RETURN
END
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>