在步进电机控制中,调节速度通常是通过改变脉冲频率实现的。代码中选择调节ARR(Auto-Reload Register)而非PSC(Prescaler)的原因如下:
1. ARR 与 PSC 的核心区别
• ARR(自动重载寄存器):决定定时器的计数周期(即脉冲频率)。
公式:脉冲频率 = 定时器时钟 / (ARR + 1)
◦ 优点:直接控制输出频率,细粒度调整(ARR 取值范围大,如 0-65535)。
• PSC(预分频器):对时钟源分频,改变计数基频。
公式:计数频率 = 定时器时钟 / (PSC + 1)
◦ 缺点:调整范围有限(PSC 通常较小,如 0-65535),且改变 PSC 需重新初始化定时器,效率低。
2. 代码中选择 ARR 的原因
在您的代码中,速度调节通过 SetMotor1RPM 和 SetMotor2RPM 函数实现:
void SetMotor1RPM(float rpm) {
const uint32_t timer_clock = 84000000; // 84MHz 时钟
const uint32_t steps_per_rev = 3200; // 每转步数
float freq = (rpm * steps_per_rev) / 60.0f; // 计算所需频率
uint32_t arr = (uint32_t)(timer_clock / freq) - 1; // 关键:通过 ARR 设置频率
__HAL_TIM_SET_AUTORELOAD(&htim5, arr); // 动态修改 ARR
__HAL_TIM_SET_COMPARE(&htim5, TIM_CHANNEL_3, arr / 2); // 占空比 50%
}
为何不调 PSC?
• 动态调速需求:步进电机在梯形速度剖面(加速/匀速/减速)中需频繁调整频率。修改 ARR 只需一条指令,而修改 PSC 需停止定时器并重新配置,破坏实时性。
• 精度要求:例如在 84MHz 时钟下:
◦ 若用 PSC 调速:PSC 每增加 1,频率跳跃较大(如 84MHz → 42MHz → 28MHz...),无法精确匹配 RPM。
◦ 用 ARR 调速:ARR 从 100 到 65535,可精确生成 1.28kHz 到 840kHz 的脉冲,适配不同 RPM。
• 代码简化:固定 PSC 为 0(即无分频),专注 ARR 调整,避免硬件重新初始化。
- PSC 的适用场景
PSC 通常在以下情况使用:
• 极低速需求:若 RPM 极低(如 0.1 RPM),需超低脉冲频率(如 5.3Hz),此时可设 PSC 分频以扩大 ARR 范围。
• 时钟源超频:定时器时钟远高于所需频率时(如 84MHz 驱动 1kHz 脉冲),设 PSC 分频可避免 ARR 溢出(>65535)。
代码选择 ARR 调速是因为:
- 直接控制脉冲频率,动态响应快。
- 精度高,适配步进电机的实时梯形速度剖面。
- 避免频繁操作 PSC 导致的性能损失。
PSC 更适合超低速或时钟分频场景,在您的代码中无需修改。