STM32F1基于HAL库的学习记录实用使用教程分享(五、PWM驱动舵机、呼吸灯)

往期内容

STM32F1基于HAL库的学习记录实用使用教程分享(一、GPIO_Output)

STM32F1基于HAL库的学习记录实用使用教程分享(二、GPIO_Input 按键)

STM32F1基于HAL库的学习记录实用使用教程分享(三、外部中断 按键)

STM32F1基于HAL库的学习记录实用使用教程分享(四、OLED IIC驱动 软件IIC 硬件IIC)

文章目录

  • 往期内容
  • 前言
  • 一、PWM
    • PWM如何控制LED亮度?
    • 为什么需要“惯性系统”?
    • PWM的应用场景
  • PWM的核心参数与STM32的实现原理
    • PWM的三大参数:频率、占空比、分辨率
      • 频率(Frequency)
      • **占空比(Duty Cycle)**
        • **3. 分辨率(Resolution)**
      • 1.2 STM32F103的定时器资源与PWM通道分配
  • 二、配置
    • 1.RCC
    • 2.SYS
    • 3.时钟树
    • 4.引脚配置
  • 三、代码
  • 四、演示效果
  • 总结
  • 参考文献引用


前言

本文记录了通过使用STM32F103ZET6单片机PWM的学习

随着嵌入式行业的兴起,于此记录个人的一些学习过程并进行分享,本次是单片机控制里很重要的一个功能PWM


声明:本文章在编写过程中,我始终致力于尊重并保护所有原创内容及其知识产权。然而,由于信息来源的多样性和复杂性,可能存在个别内容未明确标注出处、存在事实性错误或无意中侵犯了他人的知识产权的情况。对于任何可能存在的上述问题,我深感歉意,并在此提前向受影响的作者表示最诚挚的歉意。我始终秉持着尊重原创、维护知识产权的原则,绝无意侵犯任何人的合法权益。一旦收到您的反馈,我将立即核实并在第一时间内对文章进行修改。这包括但不限于补充相关引用信息、更正错误内容或删除涉嫌侵权的内容。再次感谢您的关注与支持,期待与您共同营造一个更加美好的知识共享空间。新手文章诸多不足,还望海涵。

一、PWM

PWM(Pulse Width Modulation,脉冲宽度调制),是一种通过调整数字信号中脉冲的“宽度”(即高电平持续时间),来模拟控制电压或电流大小的技术。简单来说,它能让数字信号“伪装”成模拟信号,从而实现对设备的精细控制。
例如,在嵌入式系统中,虽然LED只能完全点亮或熄灭(数字特性),但通过PWM技术,可以让LED快速闪烁,利用人眼的视觉暂留效应,让人感觉亮度被“调暗”或者“调亮”了,即为“呼吸灯”。

PWM如何控制LED亮度?

核心原理:占空比

占空比 = (高电平时间 / 一个完整周期时间)× 100%。

例如:若占空比为50%,表示LED在半个周期内亮,半个周期内灭;若占空比为20%,则亮的时间更短,平均亮度更低。

通过调节占空比,可以等效改变LED的平均电压,从而实现亮度的连续调节。

为什么需要“惯性系统”?

PWM的效果依赖于系统的“惯性”。例如:

LED余晖:LED熄灭时不会瞬间变暗,而是逐渐衰减。

人眼视觉暂留:人眼对快速变化的亮灭无法分辨,会感知为持续亮度。

如果没有这种惯性,PWM的快速开关会直接被察觉为闪烁,而非平滑的亮度变化。

PWM的应用场景

电机调速:通过调节占空比控制电机转速。

智能家居:调光LED灯、风扇转速控制。

电源管理:高效DC-DC电压转换。

PWM的核心参数与STM32的实现原理

PWM的三大参数:频率、占空比、分辨率

频率(Frequency)

  • 定义:每秒内完整脉冲周期的数量,单位赫兹(Hz)。
  • STM32实现:由定时器时钟源、预分频器(Prescaler)和自动重装载值(AutoReload)共同决定。
  • 计算公式
    PWM频率 = 定时器时钟 ( Prescaler + 1 ) × ( AutoReload + 1 ) \text{PWM频率} = \frac{\text{定时器时钟}}{(\text{Prescaler} + 1) \times (\text{AutoReload} + 1)} PWM频率=(Prescaler+1)×(AutoReload+1)定时器时钟
  • 典型场景
    • 舵机控制:50Hz(周期20ms)
    • LED调光:1kHz~10kHz(避免人眼感知闪烁)
    • 电机调速:10kHz~20kHz(降低噪声)

占空比(Duty Cycle)

  • 定义:高电平时间占整个周期的百分比,决定等效输出的平均电压。
  • STM32设置:通过修改捕获比较寄存器(CCR)实现,取值范围为 0AutoReload
  • 计算公式
    占空比 = CCR值 AutoReload + 1 × 100 % \text{占空比} = \frac{\text{CCR值}}{\text{AutoReload} + 1} \times 100\% 占空比=AutoReload+1CCR×100%
3. 分辨率(Resolution)
  • 定义:占空比的最小调节步长,由AutoReload值决定。
  • 提高分辨率的方法:增大AutoReload值(需权衡频率限制)。
  • 示例
    • AutoReload=199 → 分辨率≈0.5%
    • AutoReload=9999 → 分辨率≈0.01%

1.2 STM32F103的定时器资源与PWM通道分配

STM32F103的定时器分为三类(以ZET6为例):

定时器类型 包含定时器 功能特性
高级定时器 TIM1、TIM8 支持互补输出、死区控制,适合电机驱动
通用定时器 TIM2~TIM4 4通道PWM输出,支持输入捕获
基本定时器 TIM6、TIM7 仅支持基础计时功能

关键引脚映射表

定时器 通道 典型引脚(以C8T6为例)
TIM1 CH1~CH4 PA8, PA9, PA10, PA11
TIM2 CH1~CH4 PA0, PA1, PA2, PA3
TIM3 CH1~CH4 PA6, PA7, PB0, PB1

二、配置

在选择好芯片并进入配置界面后的操作如下进行

1.RCC

2.SYS

3.时钟树

以上三个部分再前三期文章中都已赘述过,而且也很基础,故在从今以后的文章中都会省略,有需要的同学可翻阅往期文章查阅。
STM32F1基于HAL库的学习记录实用使用教程分享(一、GPIO_Output)

4.引脚配置

定时器参数设置

  • Prescaler:71 → 分频后时钟 = 72MHz / (71+1) = 1MHz
  • Counter Mode:Up(向上计数)
  • AutoReload:999 → PWM频率 = 1MHz / (999+1) = 1kHz
  • Pulse:初始占空比(例如500,对应50%)

STM32F1基于HAL库的学习记录实用使用教程分享(五、PWM驱动舵机、呼吸灯)_第1张图片

三、代码

// 将角度转换为CCR值(假设AutoReload=19999,对应20ms周期)
uint32_t angle_to_ccr(float angle) {
    return (500 + (angle / 180.0) * 2000); // 0.5ms~2.5ms → 500~2500
}

// 调用示例:设置舵机为90°
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, angle_to_ccr(90));
// 全局变量
volatile uint16_t pwm_val = 0;
volatile int8_t dir = 1;  // 方向:1为渐亮,-1为渐暗

// 在定时器中断回调函数中更新占空比
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
    if (htim == &htim4) {  // 假设TIM4用于控制呼吸节奏
        pwm_val += dir * 10;
        if (pwm_val >= 1000) dir = -1;
        else if (pwm_val <= 0) dir = 1;
        __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, pwm_val);
    }
}
//别忘记启动定时器
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_1);

四、演示效果

呼吸灯演示视频

舵机一点一点转动

总结

本篇内容略少,但这也是为后期的内容做铺垫衔接。后面的内容“干货”会更多一些,敬请期待。

又是经过一个充实而忙碌的夜晚,深知文章中仍不免有诸多省略和未及细讲之处。对于那些在阅读过程中仍感意犹未尽、存有疑问的同学,建议大家不妨拓宽视野,多阅读几篇来自不同作者、风格各异的优秀文章。相信通过多角度、多层次的学习,你们定能集百家之长从而对单片机有更加深入和全面的理解。

在此,我的初衷不仅是为初学者提供一份学习路上的指引,也是对自己学习历程的一次回顾与总结。通过分享,我希望能激发更多人对单片机技术的兴趣,共同探索这片充满挑战与机遇的领域。

为了保持内容的连贯性和避免不必要的重复,我计划在未来的博客中,对于本文中已提及但未深入展开的话题,将通过链接的方式引导大家回到本文进行查阅。同时,我也将不断优化和完善文章内容,力求为大家提供更加准确、全面、易于理解的学习资源。

感谢大家的关注与支持!接下来我可能新开一个栏目讲解舵机机械臂的控制


参考文献引用

STM32——PWM原理及应用(附代码)

【STM32】HAL库 STM32CubeMX教程七—PWM输出(呼吸灯)

你可能感兴趣的:(STM32学习,stm32,学习,数据库)