📄 stepmotor.asm
字号:
//======================================================
// The information contained herein is the exclusive property of
// Sunnnorth Technology Co. And shall not be distributed, reproduced,
// or disclosed in whole in part without prior written permission.
// (C) COPYRIGHT 2003 SUNNORTH TECHNOLOGY CO.
// ALL RIGHTS RESERVED
// The entire notice above must be reproduced on all authorized copies.
//========================================================
//============================================================
// 文件名称:StepMotor.asm
// 实现功能:SPGT62C19B的步进电机驱动程序,使用IRQ4_4KHz中断
// 日期: 2005/7/18
//============================================================
//================================================
// SPGT62C19B控制端口设定
//================================================
/////----- 若使用IOA则使用下面的定义 -----/////
//.define P_Motor_Data 0x7000
//.define P_Motor_Buf 0x7001
//.define P_Motor_Dir 0x7002
//.define P_Motor_Attr 0x7003
/////----- 若使用IOB则使用下面的定义 -----/////
.define P_Motor_Data 0x7005
.define P_Motor_Buf 0x7006
.define P_Motor_Dir 0x7007
.define P_Motor_Attr 0x7008
//================================================
// SPGT62C19B控制引脚设定
//================================================
// bit: FEDCBA9876543210
.define PIN_I01 0000000000001000b //IO PIN 3
.define PIN_I11 0000000000100000b //IO PIN 5
.define PIN_PH1 0000000000000001b //IO PIN 0
.define PIN_I02 0000000000010000b //IO PIN 4
.define PIN_I12 0000000001000000b //IO PIN 6
.define PIN_PH2 0000000000000010b //IO PIN 1
.define PIN_MOTOR PIN_I01+PIN_I11+PIN_PH1+PIN_I02+PIN_I12+PIN_PH2
//================================================
// 步进电机最高速度定义
//================================================
.define MOTOR_MAXSPEED 150 // 单位为拍/秒(P.P.S)
//================================================
// 电机工作模式定义
//================================================
.define STEP_FULL 0x0001 // 整步
.define STEP_HALF 0x0002 // 半步
.define STEP_MOHALF 0x0003 // 优化半步
//================================================
// 中断常量定义
//================================================
.define P_INT_Mask 0x702d
.define C_IRQ4_4KHz 0x0040
//================================================
// 公有函数声明
//================================================
.public _StepMotor_Init
.public F_StepMotor_Init
.public _StepMotor_SetMode
.public F_StepMotor_SetMode
.public _StepMotor_SetSpeed
.public F_StepMotor_SetSpeed
.public _StepMotor_Forward
.public F_StepMotor_Forward
.public _StepMotor_Backward
.public F_StepMotor_Backward
.public _StepMotor_Stop
.public F_StepMotor_Stop
.public _StepMotor_Status
.public F_StepMotor_Status
.public _StepMotor_Drive
.public F_StepMotor_Drive
//================================================
// 三种工作方式的控制时序表
//================================================
.data
Tbl_SMotor_Full: // 整步
.dw PIN_PH1+PIN_PH2
.dw PIN_PH2
.dw 0x0000
.dw PIN_PH1
.dw PIN_PH1+PIN_PH2
.dw PIN_PH2
.dw 0x0000
.dw PIN_PH1
Tbl_SMotor_Half: // 半部
.dw PIN_I11+PIN_PH1+PIN_I02+PIN_I12+PIN_PH2
.dw PIN_I11+PIN_PH1+ PIN_I12+PIN_PH2
.dw PIN_I01+PIN_I11+ PIN_I12+PIN_PH2
.dw PIN_I11+ PIN_I12+PIN_PH2
.dw PIN_I11+ PIN_I02+PIN_I12
.dw PIN_I11+ PIN_I12
.dw PIN_I01+PIN_I11+PIN_PH1+ PIN_I12
.dw PIN_I11+PIN_PH1+ PIN_I12
Tbl_SMotor_MoHalf: // 优化半部
.dw PIN_PH1+PIN_I02+PIN_I12+PIN_PH2
.dw PIN_I01+ PIN_PH1+PIN_I02+ PIN_PH2
.dw PIN_I01+PIN_I11+ PIN_PH2
.dw PIN_I01+ PIN_I02+ PIN_PH2
.dw PIN_I02+PIN_I12
.dw PIN_I01+ PIN_I02
.dw PIN_I01+PIN_I11+PIN_PH1
.dw PIN_I01+ PIN_PH1+PIN_I02
//================================================
// 变量定义
//================================================
.iram
SMotor_StartPtr: .dw 0 // 控制时序表起始地址
SMotor_CurPtr: .dw 0 // 时序表中当前拍的时序指针
SMotor_Dir: .dw 0 // 电机转动方向
SMotor_TimerSet: .dw 0 // 定时器预置数值
SMotor_CurTimer: .dw 0 // 定时器计数值
SMotor_Steps: .dw 0 // 电机剩余转动步数
.code
//======================================================
// 函数名称: StepMotor_Init
// C调用: void StepMotor_Init(void)
// 汇编调用: F_StepMotor_Init
// 实现功能: 步进电机驱动初始化(将开启IRQ4_4KHz中断)
// 入口参数: 无
// 出口参数: 无
// 破坏寄存器: 无
//======================================================
_StepMotor_Init:
F_StepMotor_Init:
push r1 to [sp]
INT OFF
r1 = [P_Motor_Attr]
r1 |= PIN_MOTOR
[P_Motor_Attr] = r1
r1 = [P_Motor_Dir]
r1 |= PIN_MOTOR
[P_Motor_Dir] = r1
r1 = [P_Motor_Buf]
r1 |= PIN_MOTOR
[P_Motor_Data] = r1
r1 = Tbl_SMotor_Full
[SMotor_StartPtr] = r1
[SMotor_CurPtr] = r1
r1 = 0x0000
[SMotor_TimerSet] = r1
[SMotor_CurTimer] = r1
[SMotor_Steps] = r1
[SMotor_Dir] = r1
r1 = [P_INT_Mask]
r1 |= C_IRQ4_4KHz
[P_INT_Mask] = r1
INT FIQ,IRQ
pop r1 from [sp]
retf
//======================================================
// 函数名称: StepMotor_SetMode
// C调用: void StepMotor_SetMode(unsigned ModeCode)
// 汇编调用: F_StepMotor_SetMode
// 实现功能: 设置步进电机工作模式
// 入口参数: ModeCode(r1) - 步进电机工作模式,可以是下列数值之一:
// STEP_FULL - 整步模式
// STEP_HALF - 半步模式
// STEP_MOHALF - 优化半步模式
// 出口参数: 无
// 破坏寄存器: 无
//======================================================
_StepMotor_SetMode:
push r1 to [sp]
r1 = sp + 4
r1 = [r1]
call F_StepMotor_SetMode
pop r1 from [sp]
retf
F_StepMotor_SetMode:
push r1 to [sp]
cmp r1, STEP_FULL
jne ?IsHalf
?Full:
r1 = Tbl_SMotor_Full
jmp ?SetPtr
?IsHalf:
cmp r1, STEP_HALF
jne ?IsMoHalf
?Half:
r1 = Tbl_SMotor_Half
jmp ?SetPtr
?IsMoHalf:
cmp r1, STEP_MOHALF
jne ?Full
?MoHalf:
r1 = Tbl_SMotor_MoHalf
?SetPtr:
[SMotor_StartPtr] = r1
[SMotor_CurPtr] = r1
pop r1 from [sp]
retf
//======================================================
// 函数名称: StepMotor_SetSpeed
// C调用: void StepMotor_SetSpeed(unsigned Speed)
// 汇编调用: F_StepMotor_SetSpeed
// 实现功能: 设置步进电机转速
// 入口参数: Speed(r1) - 转速值,单位为拍/秒(P.P.S),范围从1到MOTOR_MAXSPEED
// 出口参数: 无
// 破坏寄存器: 无
//======================================================
_StepMotor_SetSpeed:
push r1 to [sp]
r1 = sp + 4
r1 = [r1]
call F_StepMotor_SetSpeed
pop r1 from [sp]
retf
.external __divu1 // 除法函数,在CMacro1016.lib或CMacro.lib库中
F_StepMotor_SetSpeed:
push r1,r2 to [sp]
r2 = r1 // TimerData=4096/pps (@4kHz Timer)
jz ?Exit
cmp r2, MOTOR_MAXSPEED
jna ?SetTimer
r2 = MOTOR_MAXSPEED
?SetTimer:
r1 = 4096
push r1,r2 to [sp]
call __divu1
sp += 2
r2 = r2 lsl 1 //余数与4096比较,四舍五入
cmp r2, 4096
jb ?NoCarry
?Carry:
r1 += 1
?NoCarry:
[SMotor_TimerSet] = r1
r1 = 0
[SMotor_CurTimer] = r1
?Exit:
pop r1,r2 from [sp]
retf
//======================================================
// 函数名称: StepMotor_Forward
// C调用: void StepMotor_Forward(unsigned Step)
// 汇编调用: F_StepMotor_Forward
// 实现功能: 使电机正向转动
// 入口参数: Steps(r1) - 使电机转动的拍数,范围从1~65535
// 当Steps设置为0时,电机将持续转动
// 出口参数: 无
// 破坏寄存器: 无
//======================================================
_StepMotor_Forward:
push r1 to [sp]
r1 = sp + 4
r1 = [r1]
call F_StepMotor_Forward
pop r1 from [sp]
retf
F_StepMotor_Forward:
push r1 to [sp]
[SMotor_Steps] = r1
r1 = [SMotor_StartPtr]
[SMotor_CurPtr] = r1
r1 = 1
[SMotor_Dir] = r1
pop r1 from [sp]
retf
//======================================================
// 函数名称: StepMotor_Backward
// C调用: void StepMotor_Backward(unsigned Step)
// 汇编调用: F_StepMotor_Backward
// 实现功能: 使电机反向转动
// 入口参数: Steps(r1) - 使电机转动的拍数,范围从1~65535
// 当Steps设置为0时,电机将持续转动
// 出口参数: 无
// 破坏寄存器: 无
//======================================================
_StepMotor_Backward:
push r1 to [sp]
r1 = sp + 4
r1 = [r1]
call F_StepMotor_Backward
pop r1 from [sp]
retf
F_StepMotor_Backward:
push r1 to [sp]
[SMotor_Steps] = r1
r1 = [SMotor_StartPtr]
r1 += 7
[SMotor_CurPtr] = r1
r1 = -1
[SMotor_Dir] = r1
pop r1 from [sp]
retf
//======================================================
// 函数名称: StepMotor_Drive
// C调用: void StepMotor_Drive(void)
// 汇编调用: F_StepMotor_Drive
// 实现功能: 实现电机转动,该函数仅被IRQ4_4KHz中断服务程序调用
// 入口参数: 无
// 出口参数: 无
// 破坏寄存器: 无
//======================================================
_StepMotor_Drive:
F_StepMotor_Drive:
push r1,r2 to [sp]
r1 = [SMotor_TimerSet]
jz ?Exit
r2 = [SMotor_Dir]
jz ?Exit
r2 = [SMotor_CurTimer]
r2 += 1
[SMotor_CurTimer] = r2
cmp r2, r1
jb ?Exit
r1 = [SMotor_CurPtr]
r2 = [P_Motor_Buf]
r2 &= ~PIN_MOTOR
r2 |= [r1]
[P_Motor_Data] = r2
r1 += [SMotor_Dir]
r2 = [SMotor_StartPtr]
cmp r1, r2
jb ?Rewind_Tail
r2 += 7
cmp r1, r2
jna ?Save_Ptr
?Rewind_Head:
r1 = [SMotor_StartPtr]
jmp ?Save_Ptr
?Rewind_Tail:
r1 = [SMotor_StartPtr]
r1 += 7
?Save_Ptr:
[SMotor_CurPtr] = r1
r1 = [SMotor_Steps]
jz ?NextStep
r1 -= 1
[SMotor_Steps] = r1
jnz ?NextStep
r1 = 0
[SMotor_Dir] = r1
r1 = [P_Motor_Buf]
r1 |= PIN_I01 + PIN_I02 + PIN_I11 + PIN_I12
[P_Motor_Buf] = r1
?NextStep:
r1 = 0
[SMotor_CurTimer] = r1
?Exit:
pop r1,r2 from [sp]
retf
//======================================================
// 函数名称: StepMotor_Stop
// C调用: void StepMotor_Stop(void)
// 汇编调用: F_StepMotor_Stop
// 实现功能: 使电机停止转动
// 入口参数: 无
// 出口参数: 无
// 破坏寄存器: 无
//======================================================
_StepMotor_Stop:
F_StepMotor_Stop:
push r1 to [sp]
r1 = 0
[SMotor_Dir] = r1
[SMotor_CurTimer] = r1
[SMotor_Steps] = r1
r1 = [P_Motor_Buf]
r1 |= PIN_I01 + PIN_I02 + PIN_I11 + PIN_I12
[P_Motor_Buf] = r1
pop r1 from [sp]
retf
//======================================================
// 函数名称: StepMotor_Status
// C调用: unsigned StepMotor_Status(void)
// 汇编调用: F_StepMotor_Status
// 实现功能: 获取当前电机的转动状态(正转、反转或停转)
// 入口参数: 无
// 出口参数: r1 - 电机转动状态,可能是下列数值:
// 0 - 停止状态
// 1 - 正向转动
// 0xffff - 反向转动
// 破坏寄存器: 无
//======================================================
_StepMotor_Status:
F_StepMotor_Status:
r1 = [SMotor_Dir]
retf
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -