Skip to content

CDSTEP 代码说明

dukelec edited this page Jun 26, 2024 · 6 revisions

Bootloader 代码说明请参考:https://github.com/dukelec/cdfoc/wiki/CDFOC-代码说明-上篇-之-bootloader

CDSTEP 步进电机控制器的代码功能先参见 Readme 开头的框图。

其它步进电机控制器往往会考虑精准输出指定数量的 STEP 脉冲,而我们不是,我们把步进电机当作普通有刷或无刷电机,譬如参见 CDFOC 的框图,开头的模块是相同的,只是精简很多。

我们使用位置环 PID 来让当前位置追随目标位置,PID 输出的速度值直接控制 pwm 输出的频率,pwm 输出的脉冲数会通过另一个 timer 记录下来,当作编码器读到的真实位置。

如果发多了一些脉冲出去,位置环 PID 会自动控制电机反转,直到当前位置等于目标位置。
更高级的 FOC 等伺服驱动器,也没法做到走到目标位置后,一点都不超,步进电机完全可以按照 FOC 伺服方式来控制,不用担心性能问题。

使用 PID 追随位置,虽然使用的是梯形加减速,但是被 PID 柔和之后,实际波形比较接近 S 型加减速,这样就同时拥有 T 型的简单、快速和 S 型柔和的优点。

如果我们需要增加真实的编码器做闭环,代码改起来会很容易,改为把编码器读到的位置信息喂给位置环 PID 即可。

这样,无论是有刷、无刷六步换相、无刷 FOC、步进电机,都是使用相同的控制架构,更加简单灵活。

梯形加减速

梯形加减速规划的函数为 t_curve_compute, 它的思路为:

任意时刻,我们计算从当前位置减速停到目标位置,所需要的减速度为多少。

如果算出来的减速度比用户设置的目标减速度弱,那么表示当前还不着急开始减速,当前要么保持匀速,要么加速运行(如果当前速度小于目标速度)。

如果算出来的减速度比用户设置的目标减速度强,那么表示要开始减速了,再不减速要超过指定目标,没法停在指定目标。

由于我们是周期性运算,上一个周期计算出来不用减速,这一个周期计算出来需要减速,理论上是要在这两个周期之间的某个时间点就应该减速,我们推迟了一小会才开始减速, 说明我们用较高的速度已经移动了一段位移,如果此时按照用户设定的减速度开始减速,那么一定无法不超过目标位置。

这种离散计算带来的误差,我们通过适当放大用户设定的减速度来解决(代码中乘以 1.2 倍放大)。

最后,为了防止到目标位置停不下来,反复振荡,所以判断如果到达目标位置时,电机速度很慢,就直接停止。 (如果过快,要先超过再掉头,譬如用户临时修改目标位置到很近的位置。)

其它方面,可以参考 CDFOC 的代码说明:https://github.com/dukelec/cdfoc/wiki/CDFOC-代码说明-下篇-之-app

Clone this wiki locally