赞
踩
前面学了两三天的PWM了,PWM本身不难理解,至于为啥进度缓慢,还不是这时钟定时器分频值重装载啥的太难理解了呜呜呜,今天终于可以掌握并实现PWM脉宽调制了,接下来离调试电机也不远了!
上一篇帖子大致介绍了PWM,时钟,预分频值和重载值等概念,结尾说到
通过设置合适的分频值可以得到我们需要的定时器频率
通过设置合适的重载值可以得到我们需要的定时器周期和PWM信号频率
通过设置脉宽即可得到我们需要的PWM信号。
现在我们来具体尝试一下改变LED灯的亮度:
首先我们对定时器进行简单设置,如下图:
我们设定的重载值为200,那么设定的脉宽就只能在0-200之间,因为是向上计数,因此脉宽越大,占空比越大,我们将三个引脚的脉宽都设置为100,就可以得到一个占空比为50%的PWM信号,相对于LED灯的亮度为最大值的一半。然后我们生成代码
打开源代码后,可以找到我们设置的预分频值、重载值、脉宽等,后续操作如需改变相关参数,只需要直接在源代码里修改即可,无需重新配置
接着打开我们的main.c文件,开始书写代码
第一步:在单片机上电开始工作时,需要进行许多初始化操作,PWM脉宽调制需要用到定时器,因此我们需要把定时器先打开
在int main()函数内,写入代码开启定时器TIM5
HAL_TIM_Base_Start(&htim5);
第二步:我们既然需要开灯,就要在while循环内部设置相关引脚进行输出,而我们在前面配置时,将LED灯的RGB三个引脚设置为了PWM输出模式,因此我们可以利用下面这个函数进行引脚输出
在while循环内部输入
HAL_TIM_PWM_Start(&htim5, TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim5, TIM_CHANNEL_2);
HAL_TIM_PWM_Start(&htim5, TIM_CHANNEL_3);
第三步:编译上传,可以发现我们的LED灯在以一半亮度持续发光,这是因为我们设置的占空比为50%。
至此,PWM调制LED亮度的方式大家应该有所掌握了,那我们可不可以令脉宽(占空比)在一定范围内高低变化,从而实现呼吸灯的效果呢,当然是可以的,只需要在原有的代码上稍作修改即可。
首先我们在主函数内定义一个变量来代表脉宽 uint16_t Pulse=0;
初始值设置为0,代表占空比为0,即LED不亮。
接着while循环代码书写如下:
while (1) { HAL_TIM_PWM_Start(&htim5, TIM_CHANNEL_1); HAL_TIM_PWM_Start(&htim5, TIM_CHANNEL_2); HAL_TIM_PWM_Start(&htim5, TIM_CHANNEL_3); while (Pulse < 200) { Pulse ++; __HAL_TIM_SetCompare(&htim5, TIM_CHANNEL_1, Pulse); __HAL_TIM_SetCompare(&htim5, TIM_CHANNEL_2, Pulse); __HAL_TIM_SetCompare(&htim5, TIM_CHANNEL_3, Pulse); HAL_Delay(5); } while (Pulse) { Pulse --; __HAL_TIM_SetCompare(&htim5, TIM_CHANNEL_1, Pulse); __HAL_TIM_SetCompare(&htim5, TIM_CHANNEL_2, Pulse); __HAL_TIM_SetCompare(&htim5, TIM_CHANNEL_3, Pulse); HAL_Delay(5); } HAL_Delay(200); } }
函数__HAL_TIM_SetCompare(&htim5, TIM_CHANNEL_1, Pulse);
代表将定时器5的PWM输出引脚1的脉宽设定为Pulse。
然后编译烧录,就可以实现呼吸灯的效果啦。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。