本节是对PWM模式的一个拓展应用,利用PWM波驱动LED灯,实现一个呼吸灯!

    开发环境:CubeMX+MDK5.27
    芯片型号:STM32F103ZET6
    时间:2020/07/14

    简介:上一节介绍了什么叫做PWM波,那么PWM波是如何实现呼吸灯的呢?下面就简单介绍一下实现呼吸灯的原理。首先PWM波的输出电压范围是在0~3V,而输出到引脚的实际电压是平均电压,平均电压是受占空比的控制的,当占空比越大,平均电压越大,占空比越小,平均电压越小。因此占空比越大LED灯越亮,反之LED灯越暗
    呼吸灯就是让灯从亮到暗然后再从暗到亮,如此循环往复的过程就实现了呼吸灯的效果。另外,市面上有些台灯的亮度分档位调节的原理也是利用PWM来实现的,甚至手机屏幕亮度也有用PWM调节的,所以PWM是很常用的一种技术,不光是亮度调节,在电机驱动方面,也会用到PWM波来控制电机的转速,以及舵机的角度。
    本节只介绍如何利用PWM实现呼吸灯,而其他的PWM驱动电机以及PWM驱动舵机不作详细介绍,如有兴趣可自行了解。

    实现步骤
    第一步,配置定时器TIM3,具体配置如图,参数的意义可见定时器的PWM输出功能
    注:这里配置TIM3是因为开发板的LED0对应的引脚PB5可复用为TIM3的通道2,即TIM3可通过该引脚输出PWM波来控制LED0.关于引脚复用功能,可查看数据手册的Pinouts and pin description下的
    Hig-density STM32F103xC/D/E pin definitions最右方的Alternate functions就代表复用功能
    右方就是数据手册DS5792.pdf
    TIM.png
    这里我们设置Pulse为0,即PWM波初始占空比为0%,配置完成后,可以观察到PB5引脚变绿,且上方有TIM3_CH2的字样。
    注:PWM波的频率要大于50HZ,因为人眼的视觉暂留效果,频率小于50HZ会看到明显的闪烁。

    第二步,编写代码,修改main.c的内容如下
    在USER CODE BEGIN PV下添加如下代码

    1. uint16_t Duty = 0; //占空比
    2. uint16_t Step = 100; //占空比的步进值

    在USER CODE BEGIN 2下添加如下代码

    HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2);//启动定时器2的通道1输出PWM信号
    

    在USER CODE BEGIN 3下添加如下代码

    for(Duty = 0;Duty <= 1000;Duty = Duty + Step )//占空比不断增加,灯从暗变亮
    {
        __HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_2,Duty);
        HAL_Delay(100);
    }
    for(Duty = 1000;Duty > 0;Duty = Duty - Step)//占空比不断减小,灯从亮变暗
    {
        __HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_2,Duty);
        HAL_Delay(100);
    }
    

    总结:到此我们就可以实现呼吸灯了,具体现象请烧录板子观察。除此功能外,PWM波还可控制电机转动,实现风扇调速,PWM波还可以驱动舵机,实现机械臂的控制。更多有趣的功能,等你去发现!!!