我正在为使用 16 位 PIC 以 40 MIPS 运行并用 C 编程的嵌入式设备开发一些固件。系统将控制两个步进电机的位置并始终保持每个电机的步进位置。每个电机的最大位置大约是 125000 步,所以我不能使用 16 位整数来跟踪位置。我必须使用 32 位无符号整数 (DWORD)。电机以每秒 1000 步的速度移动,我设计了固件,以便在 Timer ISR 中处理步数。定时器 ISR 执行以下操作:
1)比较一个电机的当前位置和目标位置,如果它们相同,将isMoving标志设置为false并返回。如果它们不同,则将 isMoving 标志设置为 true。
2) 如果目标位置大于当前位置,向前移动一步,然后增加当前位置。
3) 如果目标位置小于当前位置,则向后移动一步,然后递减当前位置。
这是代码:
void _ISR _NOPSV _T4Interrupt(void)
{
static char StepperIndex1 = 'A';
if(Device1.statusStr.CurrentPosition == Device1.statusStr.TargetPosition)
{
Device1.statusStr.IsMoving = 0;
// Do Nothing
}
else if (Device1.statusStr.CurrentPosition > Device1.statusStr.TargetPosition)
{
switch (StepperIndex1) // MOVE OUT
{
case 'A':
SetMotor1PosB();
StepperIndex1 = 'B';
break;
case 'B':
SetMotor1PosC();
StepperIndex1 = 'C';
break;
case 'C':
SetMotor1PosD();
StepperIndex1 = 'D';
break;
case 'D':
default:
SetMotor1PosA();
StepperIndex1 = 'A';
break;
}
Device1.statusStr.CurrentPosition--;
Device1.statusStr.IsMoving = 1;
}
else
{
switch (StepperIndex1) // MOVE IN
{
case 'A':
SetMotor1PosD();
StepperIndex1 = 'D';
break;
case 'B':
SetMotor1PosA();
StepperIndex1 = 'A';
break;
case 'C':
SetMotor1PosB();
StepperIndex1 = 'B';
break;
case 'D':
default:
SetMotor1PosC();
StepperIndex1 = 'C';
break;
}
Device1.statusStr.CurrentPosition++;
Device1.statusStr.IsMoving = 1;
}
_T4IF = 0; // Clear the Timer 4 Interrupt Flag.
}
当接收到移动请求时,在主程序循环中设置目标位置。SetMotorPos 行只是用于打开/关闭特定端口引脚的宏。
我的问题是:有什么办法可以提高这段代码的效率吗?如果位置是 16 位整数,则代码功能正常,但作为 32 位整数,处理过多。该设备必须毫不犹豫地与 PC 通信,并且正如所写的那样,性能会受到明显影响。我真的只需要 18 位数学,但我不知道这样做的简单方法!任何建设性的意见/建议将不胜感激。