首页 > 行业资讯 >定制驱动模组
TECHNICAL SUPPORT

STM32 HAL库PWM控制舵机:定时器配置与角度参数计算

发布时间: 2026-09-18

01核心原理:PWM如何驱动舵机

STM32单片机是利用它里面的通用定时器或者是高级定时器自己去产生出那种PWM也就是脉宽调制的信号来的。在这个过程里面, 要通过HAL库把指定的GPIO接口给配置成输出通道的样子。 然后呢, 就是按照一个固定的频率来工作这个事对于控制标准的舵机来说那个频率应该是50赫兹也就是20毫秒的一个周期这么一来。同时再去配合着去改变脉冲的宽度让它在0.5毫秒到2.5毫秒之间变动。这中间呢对应的角度就是从0度一直到180度。通过这种方式就可以实现对舵机旋转角度的控制了。这个场景可以说是嵌入式开发领域里面出现频率最高的关于电机控制入门的内容, 基本上任何项目如果想要实现角度的精准定位, 就不得不依赖这套配置方案, 比如云台机械臂或者是车的转向系统等等都是属于这种情况。

核心结论(先记住):

频率是固定的, 数值为五零赫兹, 也就是周期为零二零毫秒。

当脉宽变成零点五毫秒的时候, 对应的度数就是零度, 而当脉宽调整成是两点五毫秒之后, 所对应的数值就直接变为了一百八十度。

1 ms 脉宽对应 90°

每当脉宽增加一又八十七分之一毫米, 也就是约等于角度增加一个度值的时候, 这种情况就会发生。

使用定时器通道输出 PWM, 通过 HAL 库函数 来进行启动, 并且使用宏 E 来修改脉宽。

02典型硬件连接(以 9g 微型舵机为例)

舵机引脚 接至 STM32 说明
橙色(信号) 某个 对应 GPIO 接在定时器通道引脚上
棕色(GND) 3.3 V 或 5 V 共地 与 STM32 共地
红色(VCC) 5 V 或 6 V 电池 9g 舵机额定 4.8~6 V,不建议直接用 3.3 V

一般情况下, 当开发板的 3.3 V 电压供电力量不够的时候, 舵机的动作会变得磕巴, 或者自动回到中间位置, 这是新手最常遭遇的那种, 实际上并不是因为代码有错误。

03PWM 参数计算(最关键一步)

假设我们使用的是编号为 TIM3 的十六位定时器, 在系统时钟经过锁相环处理之后, 该定时器的时钟频率会变成七十六兆赫兹, 也有可能是在一百六十八兆赫兹, 具体的数值取决于实际的芯片型号。

目标:频率 50 Hz,周期 20 ms,脉宽 0.5~2.5 ms。

3.1 确定预分频器(PSC)

PSC =  / (50 × 1000)  1
    =  /   1
    = 1439

此时分频系数即 PSC 为 1439, 定时器计数时钟被设定为将 72 MHz 除以括号里的数值 1439 再加 1 之和, 结果等于 50 kHz。

3.2 确定自动重装载值(ARR)

ARR =  × 0.020  1 = 999

pwm控制舵机_舵机和电机的区别_stm32 pwm 舵机 hal

也就是说, 每个PWM周期会计数1000个tick。这些tick的取值范围是0到999。这个时间长度对应于20ms。

3.3 脉宽与角度的换算

角度 脉宽 (ms) CCR 值 (1 tick = 20 µs)
0° 0.5 25
45° 1.0 50
90° 1.5 75
135° 2.0 100
180° 2.5 125

计算CCR值使用的完整公式是CCR等于角度乘以2点5减0点5的差值, 除以180之后的结果再乘以1000, 加上25。这个复杂的表达过程可以被简化成为另一种形式, 也就是CCR等于25再加上角度乘以5, 需要说明的是, 这里所使用的角度单位被定为1度伟创动力,而相应的CCR数值单位则是tick。

核心观点存在重复的现象, 具体表现为, 只要把 PSC 和 ARR 这两个参数给配好就可以了, 在后续过程中如果需要修改角度, 那么操作就非常单一, 实际上就是在调整 CCR 这一个寄存器里的值, 而这套做法被公认为是基于 HAL 库来开发 PWM 舵机驱动时所采用的最核心的操作。

04HAL 库配置步骤( + 代码)

4.1 图形配置

1. 关于时钟树的配置操作, 也就是大家通常所说的时钟设置这一方面的内容。

用户需要选择 HSE 8 MHz, 也可以选择与实际晶振相符的值, 然后再对 PLL(锁相环)进行倍频处理, 使频率达到72/168 MHz。

使能 TIM3 时钟源。请注意, 它被接在APB1总线上了。需要考虑到72 MHz或者144 MHz主频时的差异点在哪。因为APB1总线的频率上限, 如果是前者只能跑到36 MHz。 而另一种情况下, 上限是42 MHz。在这两种条件下, 为了匹配要求, TIM的时钟内部都会自动乘以二的增益进行放大处理。

2. GPIO

我们将 Tim3 通道一的所对应的引脚, 也就是 Pa6, 设置为复用功能, 将其拉高, 并且默认状态下把上拉电阻关闭。

3. 定时器 TIM3

运行模式属于脉搏宽度调制信号生成功能中的一个单一类型实例, 具体编号为一。

1: PWM1

其余参数先留默认,代码中再设。

4. 生成代码

4.2 代码实现(main.c 关键部分)

/  1. 时钟初始化( 已生成,此处省略)  /
/  2. GPIO + 定时器时钟使能( 已生成)  /
/  3. 定时器参数(覆盖  默认值)  /
void (void)
{
     htim = &htim3;
    htim>Init.         = 1439;   / PSC → 50 kHz 计数 /
    htim>Init.       = ;
    htim>Init.            = 999;    / ARR → 20 ms 周期 /
    htim>Init.     = V1;
    htim>Init. = ;
    (&htim3, );  / 启动 PWM 输出 /
}
/  4. 角度控制函数  /
void ( angle)   / angle: 0 ~ 180 /
{
    if (angle > 180) angle = 180;
     ccr = 25 + angle  5;     / 核心公式,见第三节 /
    E(&htim3, , ccr);
}

4.3 调用示例(主循环)

();
(0);   (500);
(90);  (500);
(180); (500);
(45);

stm32 pwm 舵机 hal_舵机和电机的区别_pwm控制舵机

我们要再次强调一下核心观点, 整个驱动链路其实就是这样的过程, 先做一次 PSC 初始化, 再做一次 ARR 初始化, 然后就是循环着去修改 CCR, 不需要去重新启动或者停止定时器, 当改完 CCR 之后, 会在下一个 PWM 周期自动就生效了。

05高频疑难与

现象 最可能原因 解决
上电舵机抖动/回中 信号线未接好,或 GPIO 悬空随机电平 确保信号线可靠焊接;未使能 PWM 前将 GPIO 设高阻或默认高电平
角度不精确(偏差 > 5°) 脉宽非线性的"死区"或供电纹波 用万用表/示波器实测 CCR 对应脉宽,微调系数 5 → 4.8 或 5.2
舵机有"咔咔"步进声 供电不足(USB 500 mA 不够) 改用 5 V 2 A 以上独立供电伟创动力舵机,GND 与 STM32 共地
换到 TIM2/TIM4 后角度反了 不同定时器通道号映射不同 GPIO 查芯片数据手册,确认通道与引脚对应关系
72 MHz 与 168 MHz 芯片参数不同 TIM 时钟 = APB1 × 2,分频系数变了 按实际 TIM 时钟重新算 PSC,不能直接复制 72 MHz 的值

06行动建议(强化结论)

1. 要先计算出参数, 然后再编写代码。每当更换定时器或者调整主频的时候, 都要重新运行一遍关于 PSC 和 ARR 的计算公式, 绝对不要直接沿用先前设定的旧数值。这是导致出现“复制粘贴失败”情况的最常见原因。

2. 你可以使用示波器或者逻辑分析仪来进行验证, 在完成配置之后, 要在 50% 的占空比条件下, 并且设定 CCR=500, 去进行量测, 此时周期大约等于 20毫秒, 只要误差小于 200微秒, 那么就视为合格。

3. 供电单独走线。这样就把"代码正确"跟"供电正确"给分开了。你得先确认供电没有任何问题, 然后再去调整角度。这么做就可以避免了那种情况, 防止把供电产生的噪声搞混了, 别错误地当成是 PWM 的参数出错了。

4. 要把 和 这两个函数, 封装到一个统一接口里面。把它们封装到头文件里之后, 以后在用多路舵机的时候, 只需要为每个实例指不同 TIM 通道的硬件资源就行了。这样做的话, 主逻辑里调用的方式, 依然不变。

5. 掌握核心, 只需要记住一句话。这句话的内容是: 在五十一十赫兹这个周期保持不变的前提下, 改变CCR值就是改变角度, 而改变PSC值和ARR值就是改变频率和量程。只要把握了这一点, 无论是在更换任何定时器, 还是面对任何脉宽范围的情况下, 都能够直接应用同一套计算公式。

07扩展:多路舵机与高分辨率

该多路舵机方案利用同一个定时器开启多个工作通道, 以 TIM3 芯片为例, 其具备从 CH1 到 CH4 共计四个可用通道。在硬件配置上, 要求为每个独立的通道单独设置 CCR 比较寄存器数值。 在实际开发中, 程序员仅需调用一次 函数来启动 PWM波输出控制程序, 便能够直接同步驱动包含四个通道在内的所有舵机设备, 无需对每一路信号进行分别初始化和开始操作。

高分辨率, 这个指标如果大于两百五十角度每周期, 我们就需要把 ARR 设置为较大的数值, 举例来说可以是一九九九九, 这对应着一百千赫兹的计数频率。同时 PSC 参数要相应收小, 那么 CCR 的计算公式就会变成五百加角度乘以五十, 结果就是分辨率提升到了零点五度每个刻度。

如果你要同时驱动 H 桥, 而且这个 H 桥不是普通的舵机, 那么你启用互补这种模式, 同时还要设置死区时间, 这东西和一般的单极性 PWM 完全不一样, 千万别把这两种配置搞混了。

最终结论:STM32 + HAL 库 + 定时器 PWM 是驱动标准 50 Hz 舵机最稳定、最通用的方案。参数计算决定精度,供电质量决定能否跑起来,而代码本身只有三行核心逻辑——初始化、启动、改 CCR。把这三步做对,舵机就能在 0°~180° 之间精确响应。

为所有产品提供动力单元

联系伟创动力产品专家,为你的产品推荐合适的驱动系统所需部件。

发送邮件
在线留言
WhatsApp
+86 0769 8399 3238
 
kpowerMap