1. 项目背景与核心需求
去年接手一个工业自动化改造项目时,客户反馈他们老旧的包装线经常出现产品移位问题。排查发现是传送带启停时步进电机加减速曲线不合理导致的机械冲击。传统梯形加减速算法在速度突变点会产生明显抖动,而S形曲线计算复杂度又太高。最终我们采用指数规律升降速方案,在STM32F103上实现了既平滑又高效的运动控制。
这种控制方式特别适合需要频繁启停的中低速场景,比如3D打印机喷头移动、小型CNC机床进给、自动化检测设备等。核心优势在于:
- 加速度连续变化,避免机械冲击
- 算法计算量适中,对MCU资源要求低
- 参数调节直观,便于现场调试
2. 系统架构设计
2.1 硬件组成框图
code复制[步进电机驱动器] <-PWM/DIR-> [STM32F103C8T6] <-UART-> [上位机]
↑
[57HS22步进电机]
选用带PWM输出的STM32F103C8T6作为主控,通过定时器产生脉冲信号。关键外设配置:
- TIM3_CH1:PWM脉冲输出(ARR寄存器控制频率)
- GPIOB.12:方向控制信号
- USART1:接收上位机速度参数
2.2 软件状态机设计
c复制enum {
STATE_IDLE,
STATE_ACCEL,
STATE_CONST,
STATE_DECEL
};
状态转换条件基于当前步数计数:
- 加速段:step_count < accel_steps
- 匀速段:accel_steps ≤ step_count < (total_steps - decel_steps)
- 减速段:step_count ≥ (total_steps - decel_steps)
3. 指数加减速算法实现
3.1 速度曲线数学模型
采用时间常数τ的指数函数:
code复制v(t) = Vmax * (1 - e^(-t/τ)) // 加速阶段
v(t) = Vmax * e^(-(t-t1)/τ) // 减速阶段
离散化处理时,第n个脉冲的周期:
code复制T(n) = T∞ * exp(-n/τf)
其中τf = τ/T∞,T∞是目标周期
3.2 单片机代码实现
c复制// 定时器中断服务函数
void TIM2_IRQHandler(void) {
static uint32_t step_cnt = 0;
if(TIM_GetITStatus(TIM2, TIM_IT_Update)) {
if(state == STATE_ACCEL) {
current_freq = start_freq + (target_freq - start_freq)
* (1 - expf(-step_cnt/accel_param));
step_cnt++;
}
// 更新ARR寄存器改变频率
TIM_SetAutoreload(TIM3, SystemCoreClock/current_freq/2 - 1);
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
}
}
关键参数计算:
- accel_param = τ * 初始频率
- 总步数 = 移动距离 / (步距角 * 细分数)
4. 参数整定与优化
4.1 时间常数τ的选取
通过实验测得不同τ值下的特性:
| τ(ms) | 加速时间(s) | 最大冲击(g) |
|---|---|---|
| 50 | 0.12 | 0.8 |
| 100 | 0.25 | 0.5 |
| 200 | 0.48 | 0.3 |
经验公式:
code复制τ ≥ J * ω_max / T_max
其中J为转动惯量,ω_max为最大角速度,T_max为电机最大转矩
4.2 动态调整策略
在运行中根据负载变化自动调节:
c复制if(measured_current > rated_current*0.8) {
tau *= 1.2; // 增大时间常数降低加速度
}
else if(measured_current < rated_current*0.5) {
tau = MAX(tau*0.9, min_tau); // 适当提高加速度
}
5. 实测效果对比
使用示波器捕获的电机相电流波形:
梯形加减速:
- 速度突变点出现明显电流尖峰(约2.8A)
- 机械振动加速度达1.2g
指数加减速:
- 电流平滑过渡,最大值2.1A
- 振动控制在0.4g以内
6. 常见问题排查
6.1 电机出现失步
可能原因:
- 初始τ值设置过小 → 逐步增大τ直到运行稳定
- 电源电压不足 → 测量供电电压是否≥电机额定电压的1.5倍
- 机械负载突变 → 检查传动机构是否卡顿
6.2 加减速过程不连续
检查:
- 定时器中断优先级是否最高
- 浮点运算是否超过中断处理时间
- 加速度参数是否超出TIM_ARR寄存器范围
7. 进阶优化方向
- 前馈补偿:根据负载惯量预先调整τ值
c复制tau = K_j * measured_inertia + K_f;
- 自适应控制:基于电流反馈实时调节曲线
- S曲线混合:在指数曲线基础上叠加S形过渡段
这个方案在包装产线上连续运行6个月后,设备故障率降低了73%。实际调试中发现,对于57mm步进电机,τ值在80-150ms区间适应性最好。如果负载转动惯量较大,可以按每100g·cm²增加5ms来估算初始τ值。