STM32之使用定时器中断控制步进电机

@fsw  May 27, 2019

毕设做的是一个蔬菜移栽控制系统,需要用到很多电机,而且需要精确控制电机所需脉冲频率、占空比与数量。最开始考虑使用定时器产生的PWM,但是数量不可控,查了很多资料,这里分析了一些方法以及优缺点https://www.cnblogs.com/bytebee/p/7068259.html

考虑实际情况最后我决定利用定时器中断来产生PWM,部分代码如下。

u16 Pulse_High=5;//脉冲高电平中断次数
u16 Pulse_Period=10;//脉冲周期中断次数
int PulseCount=0;//脉冲计数

//完成一个脉冲周期动作
void tim3PP(GPIO_TypeDef *GPIOx,uint16_t GPIO_Pin)
{
    
    if(Tim3Count<Pulse_High)//控制脉冲高电平时间
    {
        GPIO_SetBits(GPIOx,GPIO_Pin);
    }
    else if(Tim3Count>Pulse_High)//控制脉冲低电平时间
    {
        GPIO_ResetBits(GPIOx,GPIO_Pin);
    }
    if(Tim3Count>Pulse_Period)//控制脉冲周期时间
    {
        Tim3Count=0;
        PulseCount++;
    }
}

Tim3Count是记录定时器中断的变量,定时器每中断一次Tim3Count就+1。Pulse_Period为一个脉冲周期,假如Pulse_Period=10,即10个中断为一个周期,Pulse_High为脉冲高电平中断次数,假如Pulse_High=5,即一个周期内前五次把GPIO拉高,占空比为50%,这样就实现了周期占空比可控,想要多少个脉冲就调用多少次这个函数,实现了数量可控。

如此一来想要对步进电机进行变速也很方便,只要按一定规律改变脉冲周期即可

void TIM3_IRQHandler(void)   //TIM3中断
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 
    {
        TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx的中断待处理位:TIM 中断源 
            Tim3Count++;
    }    
}
阅读量:104

添加新评论