本帖最后由 lovjue 于 2021-12-10 09:48 编辑
一、PWM介绍
脉冲宽度调制(PWM)是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。简单来讲PWM是占空比可调的方波。在程序上实现的思路为,在一个周期内控制GPIO引脚的输出高低电平时间实现占空比可调的PWM输出。
二、程序介绍
函数介绍:
- HAL_StatusTypeDef HAL_PWM_Init(PWM_HandleTypeDef *hpwm);
- HAL_StatusTypeDef HAL_PWM_DeInit(PWM_HandleTypeDef *hpwm);
- void HAL_PWM_MspInit(PWM_HandleTypeDef *hpwm);
- void HAL_PWM_MspDeInit(PWM_HandleTypeDef *hpwm);
- HAL_StatusTypeDef HAL_PWM_Start(PWM_HandleTypeDef *hpwm, uint32_t Channel);
- HAL_StatusTypeDef HAL_PWM_Stop(PWM_HandleTypeDef *hpwm, uint32_t Channel);
- HAL_StatusTypeDef HAL_PWM_Duty_Set(PWM_HandleTypeDef *hpwm, uint32_t Channel, uint32_t Duty);
- HAL_StatusTypeDef HAL_PWM_Freq_Set(PWM_HandleTypeDef *hpwm, uint32_t Channel, uint32_t Prescaler, uint32_t Period);
PWM初始化如下所示,使用通道0,引脚为PB_0引脚。
- static void PWM_Init(void)
- {
- hpwm.Instance = PWM;
- hpwm.Init.AutoReloadPreload = PWM_AUTORELOAD_PRELOAD_ENABLE;
- hpwm.Init.CounterMode = PWM_COUNTERMODE_EDGEALIGNED_DOWN;
- hpwm.Init.Prescaler = 4;
- hpwm.Init.Period = 99; // 40M / 4 / 100K - 1
- hpwm.Init.Pulse = 19; // 20% DUTY
- hpwm.Init.OutMode = PWM_OUT_MODE_5SYNC;
- hpwm.Channel = PWM_CHANNEL_0;
-
- HAL_PWM_Init(&hpwm);
- }
PWM初始化包括自动重载使能、递减计数法、频率、分屏、输出模式和通道等设置。
三、效果展示
四、使用感想
W806有5路PWM在一般使用中足够使用,但是在机器人或者控制类的系统设计中就具有PWM输出不足的风险,要注意提前甄别。
编程方面,PWM设置比较简单,注意设置好分频系数、计数模式和工作模式等即可。