关于PWM的函数还是非常多的,此次功能比较简单,仅仅用到了红框中的几个函数,主要看看start函数,其他的初始化过程中自动调用了,不用关心。

start函数需要传两个参数,一个是定时器,另一个是对应的PWM通道号,本次 利用到的是TIM4,通道4

启动定时器之后,我们需要更改的参数是PWM的占空间比,HAL库以宏定义的方式给了我们定义,看了这个代码之后,你有没有一种感觉,每天满世界找优秀的代码,找优美的宏定义写法,这不就挺好的...所以,库函数本身就是一个宝藏学习资料,大家不要忽略了

代码编写看了上面的函数介绍之后,其实写起来就很简单了,结构体能够让代码变得整洁一些,先来定义一个呼吸灯相关的结构体: - typedef struct{
- uint16_t LedpwmVal;//占空比调整参数
- uint8_t LedpwmVal_Dir:1;//调整方向,1-递增,0递减
- }peripheral;
复制代码
初始化结构体成员为0,1,启动PWM波,接下来编写呼吸灯效果代码,代码也是非常的简单,延时是不能省略的,否则效果是眼睛分辨不出来的...代码也是非常的简单
- while (1)
- {
- /* USER CODE END WHILE */
- /* USER CODE BEGIN 3 */
- HAL_Delay(10);//加延时,否则变化不明显,看不到效果
- if(PWM.LedpwmVal_Dir)
- PWM.LedpwmVal++;
- else
- PWM.LedpwmVal--;
- if(PWM.LedpwmVal>breath_UP)
- PWM.LedpwmVal_Dir=Breath_DOWN;//切换为PWM值递减状态
- if(PWM.LedpwmVal==Breath_DOWN)
- PWM.LedpwmVal_Dir=1;//切换为PWM值递增状态
- // TIM4->CCR4 = PWM.LedpwmVal;
- __HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_4,PWM.LedpwmVal);//设置占空比参数
- }
复制代码
呼吸灯波形实际是怎么样的呢,接下来通过逻辑分析仪来看看波形
为了效果明显,我们选择10ms增加10的比例来看看波形: 递增效果:

递减效果:

|