⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stepmotor.asm

📁 利用凌阳单片机开发电机,方便制作与学习凌阳单片机
💻 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 + -