源码文件
涉及源代码文件
Marlin/src/module/planner.h /.cpp
Marlin/src/module/stepper.h /.cpp
电机加减速控制
在电机运动控制中会频繁涉及加减速问题。如下图所示,电机速度从 t = 1 t=1 t=1时刻开始,以 2 m m 2 / s 2{mm}^2/s 2mm2/s的加速度加速到 4 m m / s 4mm/s 4mm/s。如果采用线性加速模式,由于速度函数不可导,会在加速开始和结尾( t = 1 t=1 t=1 和 t = 2 t=2 t=2)时刻产生无穷大的加速度,宏观表现就是电机运行过程中会出向明显的震动和噪音。
解决这个问题的方法之一就是采用S曲线加速。通过平滑速度曲线,以确保加速开始和结尾过程的加速度是有限的,从而保证了电机的平稳运行。
Marlin的S曲线加速 S_CURVE_ACCELERATION
S形曲线可以有多种数学表达,Marlin 固件中采用的是5阶贝塞尔曲线。
标准的贝塞尔5阶多项式公式为:
V t = ( 1 − t ) 5 P 0 + 5 t ( 1 − t ) 4 P 1 + 10 t 2 ( 1 − t ) 3 P 2 + 10 t 3 ( 1 − t ) 2 P 3 + 5 t 4 ( 1 − t ) P 4 + t 5 P 5 , t ∈ [ 0 , 1 ] V_t=(1-t)^5P_0+5t(1-t)^4P_1+10t^2(1-t)^3P_2+10t^3(1-t)^2P_3+5t^4(1-t)P_4+t^5P_5, t\in[0,1] Vt=(1−t)5P0+5t(1−t)4P1+10t2(1−t)3P2+10t3(1−t)2P3+5t4(1−t)P4+t5P5,t∈[0,1]
由公式可以得到:
V 0 = P 0 V_0=P_0 V0=P0 表示初始速度
V 1 = P 5 V_1=P_5 V1=P5 表示末尾速度
展开上式可得
V t = A t 5 + B t 4 + C t 3 + D t 2 + E t + F , t ∈ [ 0 , 1 ] V_t=At^5+Bt^4+Ct^3+Dt^2+Et+F,t\in[0,1] Vt=At5+Bt4+Ct3+Dt2+Et+F,t∈[0,1]
其中的控制参数,
A = − P 0 + 5 P 1 − 10 P 2 + 10 P 3 − 5 P 4 + P 5 A=-P_0 + 5P_1 - 10P_2+10P_3- 5P_4+P_5 A=−P0+5P1−10P2+10P3−5P4+P5
B = 5 P 0 − 20 P 1 + 30 P 2 − 20 P 3 + 5 P 4 B = 5P_0 - 20P_1 + 30P_2 - 20P_3 + 5P_4 B=5P0−20P1+30P2−20P3+5P4
C = − 10 P 0 + 30 P 1 − 30 P 2 + 10 P 3 C = -10P_0 + 30P_1 - 30P_2 + 10P_3 C=−10P0