步进电机梯形加减速

1. 为什么要使用加减速

为什么要使用加减速呢?硬件驱动细分器与软件的细分参数或定时器分频参数设置不当时启动电机时,会遇见步进电机有啸叫声但是不会转动,这是因为软件产生脉冲的频率大于步进电机的启动频率,步进电机有一个很重要的技术参数:空载启动频率。也就是在没有负载的情况下能够正常启动的最大脉冲频率,如果脉冲频率大于该值,步进电机则不能够正常启动,发生丢步或者堵转的情况;或者也可以理解为由于步进脉冲变化过快,转子由于惯性的作用跟不上电信号的变化。所以要使用加减速来解决启动频率低的问题,在启动时使用较低的脉冲频率,然后逐渐的加快频率。

2. 算法原理

2.1 特点

在这里插入图片描述

2.2 概念

在这里插入图片描述

2.3 公式

在这里插入图片描述
在这里插入图片描述

2.4 脉冲时间间隔计算

在这里插入图片描述
在这里插入图片描述

2.5 加减速度与步数的关系

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nR45NeRV-1634472928715)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211014000718261.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-btdJNePZ-1634472928721)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211014002651601.png)]

3.算法理论实现

由于算法在计算过程中涉及到一些浮点型运算,大量的浮点型运算会使得效率大大降低为了使在计算浮点型的速度得到更好的优化,所以这一小节主要讲解由算法到代码的一些变量参数的放大转换过程和一些相关算法的不同情况。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YzQYa1UT-1634472928730)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211014003031487.png)]

3.1 设置计算

3.1.1 最小间隔 min_delay

3.1.2 脉冲间隔 C0

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4ox505Q5-1634472928752)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211017200421206.png)]

#define TIM_PRESCALER      5 
#define T1_FREQ           (SystemCoreClock/(TIM_PRESCALER+1)) // 频率ft值


/*电机单圈参数*/
#define STEP_ANGLE				1.8			//步进电机的步距角 单位:度
#define FSPR              (360.0/1.8)       //步进电机的一圈所需脉冲数

#define MICRO_STEP        32          		//细分器细分数 
#define SPR               (FSPR*MICRO_STEP)   //细分后一圈所需脉冲数

/*数学常数,用于简化计算*/

#define ALPHA             ((float)(2*3.14159/SPR))       // α= 2*pi/spr
#define A_T_x10           ((float)(10*ALPHA*T1_FREQ))
#define T1_FREQ_148       ((float)((T1_FREQ*0.676)/10)) // 0.69为误差修正值
#define A_SQ              ((float)(2*100000*ALPHA)) 
#define A_x200            ((float)(200*ALPHA))
// 设置最大速度极限, 计算得到min_delay用于定时器的计数器的值。
// min_delay = (alpha / tt)/ w
srd.min_delay = (int32_t)(A_T_x10/speed);

// 通过计算第一个(c0) 的步进延时来设定加速度,其中accel单位为0.1rad/sec^2
// step_delay = 1/tt * sqrt(2*alpha/accel)
// step_delay = ( tfreq*0.676/10 )*10 * sqrt( (2*alpha*100000) / (accel*10) )/100
srd.step_delay = (int32_t)((T1_FREQ_148 * sqrt(A_SQ / accel))/10);

3.2 加减速情况分析

对于加减速的情况来说,由于已经设定好了步进电机加速度、减速度、最大速度和步数,所以说
一共分为两种情况:
第一种情况:持续加速到最大速度然后再减速到 0
第二种情况:在没达到最大速度之前就需要开始减速到 0

3.2.1 第一种情况

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zsAmIzrm-1634472928769)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211017191842956.png)]

根据上图可以很明显的看到 7 个参数,其中

• speed: 算法设置的最大速度;

• accel:加速度;

• decel:加速度;
• step :总步数;

• max_s_lim:速度从 0 加速到 speed 所需的步数;

• accel_lim:在忽略虽大速度的情况下,开始减速之前的步数,也可以理解为加速度曲线与
减速度曲线的交点;
• decel_val:实际减速的步数;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hJJuu7ZM-1634472928781)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211017192830448.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RNMy6u0Q-1634472928784)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211017192924045.png)]

3.2.2 第二种情况

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wedJoTti-1634472928801)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211017193051885.png)]
这种情况是在还未达到最大速度时就已经开始减速了;其中 accel_lim、max_s_lim 不需要重复计
算了;当 max_s_lim>accel_lim 时,如上图加速受减速开始的限制,所以 decel_val 表达式为

// 计算多少步之后达到最大速度的限制
// max_s_lim = speed^2 / (2*alpha*accel)
max_s_lim = (uint32_t)(speed*speed/(A_x200*accel/10));
// 如果达到最大速度小于0.5步,我们将四舍五入为0
// 但实际我们必须移动至少一步才能达到想要的速度
if(max_s_lim == 0)
{
    max_s_lim = 1;
}

// 计算多少步之后我们必须开始减速
// n1 = (n1+n2)decel / (accel + decel)
accel_lim = (uint32_t)(step*decel/(accel+decel));
// 我们必须加速至少1步才能才能开始减速.
if(accel_lim == 0)
{
    accel_lim = 1;
}
// 使用限制条件我们可以计算出第一次开始减速的位置
//srd.decel_val为负数
if(accel_lim <= max_s_lim)
{
    srd.decel_val = accel_lim - step;
}
else{
    srd.decel_val = -(max_s_lim*accel/decel);
}
// 当只剩下一步我们必须减速
if(srd.decel_val == 0)
{
    srd.decel_val = -1;
}

// 计算开始减速时的步数
srd.decel_start = step + srd.decel_val;

// 如果最大速度很慢,我们就不需要进行加速运动
if(srd.step_delay <= srd.min_delay)
{
    srd.step_delay = srd.min_delay;
    srd.run_state = RUN;
}
else
{
    srd.run_state = ACCEL;
}

3.3 速度状态转换

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Fmox9BEn-1634472928811)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211017193806279.png)]
在这里插入图片描述
上图是这几个状态机之间切换的的关系图:
• 第一种情况:当步数为 1 时,毫无疑问直接进入到减速阶段然后到停止状态
• 第二种情况:当步数大于 1,并且会加到最大速度,会经过:加速状态-> 匀速状态-> 减速状态-> 停止状态
• 第三种情况:当步数大于 1,并且不会加到最大速度,会经过:加速状态-> 减速状态-> 停止状态

对于加减速的每一步来说,都需要重新计算下一步的时间,计算的过程中可能会出现除不尽的项式,为了更有利的加减速,可以采用加速向上取整,减速向下取整的原则来做运算,也可以采用余数累计的方法,在这里使用的是将余数累计的方法来提高间隔时间的精度和准确性。

在这里插入图片描述

//计算新(下)一步脉冲周期(时间间隔)
new_step_delay = srd.step_delay - (((2 *srd.step_delay) + rest)/(4 * srd.accel_count + 1));
// 计算余数,下次计算补上余数,减少误差
rest = ((2 * srd.step_delay)+rest)%(4 * srd.accel_count + 1);

附录1

向上取整和向下取整

//C库函数
#define ACCEL_R(x) 		ceil(x)  //向上取整
#define DECEL_R(X)		floor(x) //向下取整

  • 7
    点赞
  • 85
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值