在步進電機控制中,調節速度通常是通過改變脈沖頻率實現的。代碼中選擇調節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 更適合超低速或時鐘分頻場景,在您的代碼中無需修改。