void TM1_Isr() interrupt 3
{
TL1 = (65535-CYCLE)%256;
TH1 = (65535-CYCLE)/256;
DIR = direction;
ENA = 1; //打开步进电机
CLK = ~CLK;
PWM_count++; //输出脉冲个数
if(PWM_count >= 200*cy_count || emergency_stop == 1) //cy_count如果800个脉冲为1圈的话200个脉冲就是位1/4圈=90度
{
PWM_count = 0;
CLK = 0;
TR1 = 0; //关闭TR1定时器
ENA = 0; //电机使能位
PWM_Finished_Flag = 1; //PWM 脉冲发送完成
}
}
void stepper_motor(unsigned int CYCLE1,unsigned int cy_count1,unsigned char DIR)
{
CYCLE = CYCLE1; //数值越大 PWM周期越长电机越慢(150-6000)
cy_count = cy_count1; //800个脉冲为1圈
direction = DIR; //转动方向:0远离步进电机
TR1 = 1; //启动定时器TM1发送脉冲
//重置PWM发送完成标志位和紧急停止标志位
PWM_Finished_Flag = 0;
emergency_stop = 0;
//等待PWM脉冲发送完成或紧急停止被触发
while(!PWM_Finished_Flag)
{
if(emergency_stop)
{
PWM_count = 0;
CLK = 0;
TR1 = 0; //关闭TR1定时器
ENA = 0; //电机使能位
PWM_Finished_Flag = 1; //PWM 脉冲发送完成
break;
}
}
}
//紧急停止开关中断服务程序
void emergency_stop_isr()
{
emergency_stop = 1;
}
哪位可以帮忙指点一下 想执行stepper_motor() 输出PWM的时候 接近开关X1接通后 PWM立即停止不在输出剩余的部分, 为什么直接将TR1 = 0关闭定时器之后还是会输出完整的PWM 呢? 先谢谢
|