有不少网友感叹高铁技术之稳,一杯水放在窗户上面都不会晃动.要达到这个‘稳’,就要在电机启动停止时,有一个加减速.电机启动时,速度需要逐渐提高,停止时,速度逐渐减小,这就是步进电机的加减速过程。单片机给步进驱动一个脉冲,电机转动一个步距角,单片机给脉冲越快,步进电机单位时间内,转动的角度也就越大.即脉冲频率正比于电机转速.另一方面,速度的变化对应的物理量是加速度,高中物理可以知道,一个加速过程一般涉及:初始速度,加速度,加速时间这三个量.对应到电机转动:起始转速(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的扇区,这样不用电机每次运动都来生成一次,减少单片机的运算量.也可使用上位机改变电机的起始速度,匀速速度,加速时间来调节电机加速性能,不用重新编译单片机代码,使用起来很方便.
全部0条评论
快来发表一下你的评论吧 !