STM32F1基于HAL库的学习记录实用使用教程分享(一、GPIO_Output)
STM32F1基于HAL库的学习记录实用使用教程分享(二、GPIO_Input 按键)
STM32F1基于HAL库的学习记录实用使用教程分享(三、外部中断 按键)
STM32F1基于HAL库的学习记录实用使用教程分享(四、OLED IIC驱动 软件IIC 硬件IIC)
本文记录了通过使用STM32F103ZET6单片机PWM的学习
随着嵌入式行业的兴起,于此记录个人的一些学习过程并进行分享,本次是单片机控制里很重要的一个功能PWM
声明:本文章在编写过程中,我始终致力于尊重并保护所有原创内容及其知识产权。然而,由于信息来源的多样性和复杂性,可能存在个别内容未明确标注出处、存在事实性错误或无意中侵犯了他人的知识产权的情况。对于任何可能存在的上述问题,我深感歉意,并在此提前向受影响的作者表示最诚挚的歉意。我始终秉持着尊重原创、维护知识产权的原则,绝无意侵犯任何人的合法权益。一旦收到您的反馈,我将立即核实并在第一时间内对文章进行修改。这包括但不限于补充相关引用信息、更正错误内容或删除涉嫌侵权的内容。再次感谢您的关注与支持,期待与您共同营造一个更加美好的知识共享空间。新手文章诸多不足,还望海涵。
PWM(Pulse Width Modulation,脉冲宽度调制),是一种通过调整数字信号中脉冲的“宽度”(即高电平持续时间),来模拟控制电压或电流大小的技术。简单来说,它能让数字信号“伪装”成模拟信号,从而实现对设备的精细控制。
例如,在嵌入式系统中,虽然LED只能完全点亮或熄灭(数字特性),但通过PWM技术,可以让LED快速闪烁,利用人眼的视觉暂留效应,让人感觉亮度被“调暗”或者“调亮”了,即为“呼吸灯”。
核心原理:占空比
占空比 = (高电平时间 / 一个完整周期时间)× 100%。
例如:若占空比为50%,表示LED在半个周期内亮,半个周期内灭;若占空比为20%,则亮的时间更短,平均亮度更低。
通过调节占空比,可以等效改变LED的平均电压,从而实现亮度的连续调节。
PWM的效果依赖于系统的“惯性”。例如:
LED余晖:LED熄灭时不会瞬间变暗,而是逐渐衰减。
人眼视觉暂留:人眼对快速变化的亮灭无法分辨,会感知为持续亮度。
如果没有这种惯性,PWM的快速开关会直接被察觉为闪烁,而非平滑的亮度变化。
电机调速:通过调节占空比控制电机转速。
智能家居:调光LED灯、风扇转速控制。
电源管理:高效DC-DC电压转换。
0
到 AutoReload
。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 |
在选择好芯片并进入配置界面后的操作如下进行
以上三个部分再前三期文章中都已赘述过,而且也很基础,故在从今以后的文章中都会省略,有需要的同学可翻阅往期文章查阅。
STM32F1基于HAL库的学习记录实用使用教程分享(一、GPIO_Output)
定时器参数设置:
// 将角度转换为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输出(呼吸灯)