snifer

[原创]利用ADSP BF51X实现的步进电机的控制

0
阅读(2799)

针对电机控制解决方案,A D I 公司提供了门类齐全的产品组合,其中包括了模数/ 数模转换器、放大器、嵌入式处理器、i Coupler
数字隔离器和电源管理器件;这些高性能的器件和增加系统集成度有助于实现更新型的拓扑结构设计,提供优于普通客户高附加值。伺服驱动系统的性能同用户最终所构建的运动控制系统的性能和所能提供的精度密切相关,多数情况下,最终的用途可以是一个高精度数控机床系统、运动控制系统或机器人系统,这些系统要求能够精确控制位置及电机的扭矩。A D I 公司能够提供涵盖信号链中所有重要器件的完整解决方案。-摘自ADI

下面我写一下我们利用这个PMSM实现的实验室智能管理系统中的窗帘自动关闭和打开的这个功能,具体的程序如下:_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
设计过程中参考了很多资料,利用ADSP BF51X实现了处理,整个系统目前正在设计中,提前露个面,占个座啊,感觉还可以的童鞋们鼓个掌