单片机工控的电机减速算法是什么?

描述

有不少网友感叹高铁技术之稳,一杯水放在窗户上面都不会晃动.要达到这个‘稳’,就要在电机启动停止时,有一个加减速.电机启动时,速度需要逐渐提高,停止时,速度逐渐减小,这就是步进电机的加减速过程。单片机给步进驱动一个脉冲,电机转动一个步距角,单片机给脉冲越快,步进电机单位时间内,转动的角度也就越大.即脉冲频率正比于电机转速.另一方面,速度的变化对应的物理量是加速度,高中物理可以知道,一个加速过程一般涉及:初始速度,加速度,加速时间这三个量.对应到电机转动:起始转速(rpm),最大速度(rpm),加速时间(min),转速对应单片机定时器的频率 pulse/ms(单片机定时器1毫秒中断次数).

工控行业电机加减速一般有T型加速,S型加速.负载惯量比较轻的情况就可以使用T型曲线,负载惯量比较重的情况一般使用S型曲线,S型曲线光滑,速度不突变.

单片机速度控制原理

单片机通过调节频率控制电机速度,频率是单片机定时器的定时间隔决定的,只需要在定时器中断处理程序里边翻转脉冲输出端口即可.单片机的RAM和CPU不是很快,定时器的间隔使用查表的方法来获取,效率比较高.

电机

控制流程

电机

T型曲线

T型曲线的加速减阶段是线性加减速的,整个运动[加速,匀速,减速]速度变化看起来像一个等腰梯形.

电机

加速阶段就是一个一次线性函数,斜率不变[加速度不变],公式如下:

电机

单片机生成加速数组代码:

//生成T形加速数组
//Vmin:起始速度(pulse/s)
//Vmax:最大速度,即匀速速度(pulse/s)
//AccTime:加速时间(ms)
//pBuffer:数组缓存区
//返回值:数组长度
int GenTTable(uint Vmin,uint Vmax,int AccTime,uint* pBuffer)
{
  //计算加速度
  uint a = (Vmax-Vmin)/AccTime;
  uint v = Vmin;
  uint t = 0;
  int index = 0;
  while(v<=Vmax)
  {
    v = a*t+Vmin;
    pBuffer[index] = f/v;  //f为定时器的工作频率
    t += 1000000/v;  //v的速度为pulse/s,一个脉冲的时间为:1/v s=1000000/v us
    index++;
  }
  
  return index;
}

S形加减速

T形加速曲线的图形,可以看出加速阶段转向匀速阶段时加速度是突然变为零的,这对大惯量的设备晃动比较大,要想设备晃动比较小,就需要加速过渡到匀速阶段是渐进光滑的,加速度不突变,进入到匀速阶段时加速度刚好为0.数学模型的S形曲线就是光滑,加速度不突变的。数学方程可以参考**逻辑斯蒂**曲线,下图是公式推导:

电机

电机

单片机S形曲线加速数组生成:

上面的公式推导有一个结论:

电机

程序代码就是根据这个公式来生成数组数据

//生成S形加速数组
//Vmin:起始速度(pulse/s)
//Vmax:最大速度,即匀速速度(pulse/s)
//AccTime:加速时间(s)
//pBuffer:数组缓存区
//返回值:数组长度
int GenSTable(uint Vmin,uint Vmax,int AccTime,uint* pBuffer)
{
    double tSum = 0;
    double T= AccTime*f;      //f为定时器工作频率
    uint C0 = (uint)(f/Vmin);
    uint Cmax = (uint)(f/Vmax);
    uint index = 0;
    while (tSum < T)
    {
      pBuffer[index]= (uint)(Cmax+pow(C0-Cmax,(T-tSum)/T));
      tSum += pBuffer[index];
      index++;
    }
    return index;
}

上面生成的加速数据就是定时器的间隔,可以把这边这份数据写到Flash的扇区,这样不用电机每次运动都来生成一次,减少单片机的运算量.也可使用上位机改变电机的起始速度,匀速速度,加速时间来调节电机加速性能,不用重新编译单片机代码,使用起来很方便.

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分