PWM技术的简单应用
PWM技术的简单应用
1、简介
- 脉冲宽度调变(Pulse Width Modulation,PWM),也成脉冲宽度调制,简称为脉宽调制,是一项功能强大的技术,它是一种对模拟信号电平进行数字化编码的方法。在脉宽调制中使用高分辨率计数器来产生方波,并且可以通过调整方波的占空比来对模拟信号电平进行编码。PWM通常使用在开关电源和电机控制中。
2、具体操作(呼吸灯)
(1)初始化硬件
- 使能RCC
![img]()
- 配置时钟,将HCLK配置为72MHZ
![img]()
- 将对应小灯引脚设置为时钟对应的通道
![img]()
- 使能时钟通道,使用PWM模式
![img]()
PWM配置公式:
- 根据公式设置预分频和重装载值
![img]()
- 启用PWM的计时器
/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2);
(2)操控设备
- 新建2个文件,用来写LED驱动
![img]()
![img]()
记得要放在相应的文件夹中,防止文件管理混乱
- 在
PWM_LED.h中写入以下内容:
#include "main.h"
#include "tim.h"
void PWM_LED(void);
- 在
PWM_LED.c中写入以下内容
int value, step = 2000;//设置步长value,计数step
#include "PWM_LED.h"
/*驱动LED的程序*/
void PWM_LED(){
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, value);//配置计时器
value += step;//每次添加2000
HAL_Delay(200);
//当超过重装载阈值或小于0时,计数翻转(即数大改为减,数小改为加)
if(value > 19999 || value < 0){
step = -step;
}
}
- 记得要在
main.h中引用头文件:
/* USER CODE BEGIN Includes */
#include "PWM_LED.h"
/* USER CODE END Includes */
- 在
main.c中引用头文件
/* USER CODE BEGIN Includes */
#include "PWM_LED.h"
/* USER CODE END Includes */
- 主循环外部启用计时器
/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
/* USER CODE END 2 */
- 在主循环内部配置计数器
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
PWM_LED();
}
3、最终效果
- 小灯将会在"亮","灭"间切换,并且会有过渡效果
![img]()
![img]()
![img]()
流程图
graph TD;
begin((开始)) ---> GPIO_Init[初始化GPIO] ---> TIM_Init[初始化TIM] ---> TIM_Start[ 启用计时器] ---> Add[将比较值加上步长] ---> Delay[延时0.5秒] ---> Pend{比较值是否加满或为0}
Pend --> |是|Toggle[将步长翻转]
Pend --> |否|Delay
Toggle ---> Delay
4、代码清单
/*---------启用计时器的函数,
需要计时器句柄&htim,具体使能的通道TIM_CHANNEL_x---------------------*/
HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel);
/*---驱动LED的函数------*/
void PWM_LED(){
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, value);//configure the TIM
value += step;//Add 2000 each time
HAL_Delay(500);
if(value > 19999 || value < 0){
step = -step;
}
}












浙公网安备 33010602011771号