平头哥CDK W806-KIT单片机技术交流组
直播中

lovjue

6年用户 9经验值
擅长:可编程逻辑 模拟技术 嵌入式技术
私信 关注

【联盛德W806-KIT开发板试用体验】PWM点亮呼吸灯

本帖最后由 lovjue 于 2021-12-10 09:48 编辑

一、PWM介绍
       脉冲宽度调制(PWM)是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。简单来讲PWM是占空比可调的方波。在程序上实现的思路为,在一个周期内控制GPIO引脚的输出高低电平时间实现占空比可调的PWM输出。
二、程序介绍

函数介绍:
  1. HAL_StatusTypeDef        HAL_PWM_Init(PWM_HandleTypeDef *hpwm);
  2. HAL_StatusTypeDef        HAL_PWM_DeInit(PWM_HandleTypeDef *hpwm);
  3. void                                HAL_PWM_MspInit(PWM_HandleTypeDef *hpwm);
  4. void                                HAL_PWM_MspDeInit(PWM_HandleTypeDef *hpwm);

  5. HAL_StatusTypeDef        HAL_PWM_Start(PWM_HandleTypeDef *hpwm, uint32_t Channel);
  6. HAL_StatusTypeDef        HAL_PWM_Stop(PWM_HandleTypeDef *hpwm, uint32_t Channel);
  7. HAL_StatusTypeDef        HAL_PWM_Duty_Set(PWM_HandleTypeDef *hpwm, uint32_t Channel, uint32_t Duty);
  8. HAL_StatusTypeDef        HAL_PWM_Freq_Set(PWM_HandleTypeDef *hpwm, uint32_t Channel, uint32_t Prescaler, uint32_t Period);

PWM初始化如下所示,使用通道0,引脚为PB_0引脚。
  1. static void PWM_Init(void)
  2. {
  3.         hpwm.Instance = PWM;
  4.         hpwm.Init.AutoReloadPreload = PWM_AUTORELOAD_PRELOAD_ENABLE;
  5.         hpwm.Init.CounterMode = PWM_COUNTERMODE_EDGEALIGNED_DOWN;
  6.         hpwm.Init.Prescaler = 4;
  7.         hpwm.Init.Period = 99;        // 40M / 4 / 100K - 1
  8.         hpwm.Init.Pulse = 19;        // 20% DUTY
  9.         hpwm.Init.OutMode = PWM_OUT_MODE_5SYNC;
  10.         hpwm.Channel = PWM_CHANNEL_0;
  11.         
  12.         HAL_PWM_Init(&hpwm);
  13. }
PWM初始化包括自动重载使能、递减计数法、频率、分屏、输出模式和通道等设置。
三、效果展示
PWM输出波形

四、使用感想
       W806有5路PWM在一般使用中足够使用,但是在机器人或者控制类的系统设计中就具有PWM输出不足的风险,要注意提前甄别。
       编程方面,PWM设置比较简单,注意设置好分频系数、计数模式和工作模式等即可。





更多回帖

发帖
×
20
完善资料,
赚取积分