再发一个步进电机程序
这次将TIM3 OC1定义为翻转模式,IO口电平不用程序干预。但是CCR1的更新仍未有更好的方法。void TIM3_IRQHandler(void)
{
u16 temp;
static u8 j;
static u16 x_step,counter;
if(TIM3->SR&=0x0002)
{
TIM3->SR&=0xfffd; //清中断标志
*X_EN=0;//开X驱动器
j++; //J为中断次数计数器,每2次中断为一个周期
if(j==2)
{
j=0;
if(jstop==TRUE) //判断是否急停,为1减速停机
{
xup_step=0;
xhigh_step=0;
x_exti_trigger=FALSE;
}
if(xup_step==0) //加速段结束
{
if(xhigh_step==0) //高速段结束
{
if(xdown_step!=0) //减速段结束
{
xdown_step--; //降速段减一
counter=1000000/(START_FRE+(UPDOWN_FRE*xdown_step));//减速段,调整脉冲频率
x_step++; //总步数加一
}
}
else
{
xhigh_step--; //高速段减一
x_step++; //总步数加一
}
}
else
{
x_step++; //总步数加一
counter=1000000/(START_FRE+(UPDOWN_FRE*x_step));//加速段,调整脉冲频率
xup_step--; //升速段减一
}
if(xup_step==0) //判断是否结束,脉冲数是否已为0
{
if(xhigh_step==0)
{
if(xdown_step==0)
{
TIM3->CR1&=0xfffe;//关定时器和中断
TIM3->DIER&=0xfffd;
*X_EN=1; //关X驱动器
x_step=0;
TIM2->DIER|=0x0010;
if(x_exti_trigger==TRUE)//因主轴关闭不能产生线中断,因此
{ //用软件产生线中断,读取下一个步进值
x_exti_trigger=FALSE;
TIM2->EGR|=0x0010; //软中断
}
}
}
}
}
if((TIM3->CCR1+counter)>0xffff) //更新CCR寄存器值
{
temp=0xffff-TIM3->CCR1;
TIM3->CCR1=counter-temp;
}
else
{
TIM3->CCR1+=counter;
}
}
} 先收藏 mark 回复【楼主位】lqhm0927
-----------------------------------------------------------------------
mark 顶一下,刚刚开始学习。。。 谢谢分享! 先收藏!~~ 收藏!~~
页:
[1]