• 【mcuclub】PWM(呼吸灯、调节灯亮度)


    一、简介

    PWM,脉冲宽度调制,是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。

    二、重要概念

    1、PWM的频率:

    是指1秒钟内信号从高电平到低电平再回到高电平的次数(一个周期);也就是说一秒钟PWM有多少个周期
    单位:Hz
    表示方式: 50Hz

    2、PWM的周期:

    T = 1/f        周期 = 1/频率
    50Hz = 20ms   一个周期

    如果频率为50Hz ,也就是说一个周期是20ms,那么一秒钟就有50次PWM周期

    3、占空比

    是一个脉冲周期内,高电平的时间与整个周期时间的比例
    单位:% (0%-100%)
    表示方式:20%

    在上图中,频率F的值为1/(T1+T2),占空比D的值为T1/(T1+T2)。

    三、PWM原理

    单片机的IO口输出的是数字信号,IO口只能输出高电平和低电平。假设高电平为5V,低电平为0V,那么我们要输出不同的模拟电压,就要用到PWM,通过改变IO口输出的方波的占空比从而获得使用数字信号模拟成的模拟电压信号。

    电压是以一种连接1或断开0的重复脉冲序列被加载到模拟负载上去的(例如LED灯,直流电机等),连接即是直流供电输出,断开即是直流供电断开。通过对连接和断开时间的控制,理论上来讲,可以输出任意不大于最大电压值(即0~5V之间任意大小)的模拟电压。比方说,占空比为50%,那就是高电平时间一半,低电平时间一半,在一定的频率下,就可以得到模拟的2.5V输出电压,那么75%的占空比,得到的电压就是3.75V。

     

    PWM的调节作用来源于对“占周期”的宽度控制,“占周期”变宽,输出的能量就会提高,通过阻容变换电路所得到的平均电压值也会上升,“占周期”变窄,输出的能量就会降低,通过阻容变换电路所得到的平均电压值也会下降。也就是,在一定的频率下,通过不同的占空比,即可得到不同的输出模拟电压。PWM就是通过这种原理实现D/A转换的。

    总结:

    PWM就是在合适的信号频率下,通过一个周期里改变占空比的方式来改变输出的有效电压。

    四、PWM输出呼吸灯

    人眼对于每11毫秒闪烁一次约83赫兹基本感觉不到闪烁,每13毫秒闪烁一次约66赫兹感觉到轻微频闪。那么我们平时见到的LED灯,当它的频率大于50Hz的时候,人眼就会产生视觉暂留效果,基本就看不到闪烁了,而是一个常亮的LED灯。

    比如,你在1秒内,高电平0.5秒,低电平0.5秒,(频率1Hz)如此反复,那么你看到的LED灯就会闪烁。但是如果是10毫秒内,高电平5毫秒,低电平5毫秒,(频率100Hz) 这时候LED灯的亮灭速度赶不上开关速度(LED灯还没完全亮就又熄灭了),由于视觉暂留作用,人眼感觉不到LED灯在闪烁,而是感觉灯的亮度少了,因为高电平时间(占空比)为50%,亮度也就为之前的50% 。

    频率很高时,看不到闪烁,占空比越大,LED越亮;

    频率很低时,可看到闪烁,占空比越大,LED越亮。

    所以,在频率一定时,可以用不同占空比改变LED灯的亮度。使其达到一个呼吸灯的效果。

    代码如下:

    /**********************************

    变量定义

    **********************************/

    uint pwm_value;                 //pwm值

    /**********************************

    函数定义

    **********************************/

    /****

    *******定时器0初使化函数

    *****/

    void Timer0_Init(void)

    {

       TMOD &= 0xF0;                 //清除 T0 的工作模式

       TMOD |= 0x01;                 //配置 T0 的GATE=0; C/T=0; M1=0; M0=1;(模式1(16位))

       TH0 = (65536-921)/256;        //配置 T0 高8位计数初始值

       TL0 = (65536-921)%256;        //配置 T0 低8位计数初始值

       TR0 = 1;                     //启动 T0

       ET0 = 1;                     //启动 T0 中断

       EA = 1;                      //打开总中断

    }

    /****

    *******T1计时中断函数

    *****/

    void Timer0_Handler(void) interrupt 1

    {

       static uint pwm_count;

       TH0 = (65535-921)/256;           //重新赋初值

       TL0 = (65535-921)%256;

       pwm_count++;

       if(pwm_count >= 10)              //定义一段周期

       {

          pwm_count = 0;

       }

       if(pwm_count < pwm_value)        //改变占空比

       {

          LED = 0;

       }

       else

       {

          LED = 1;

       }

    }

    五、PWM调亮流程设计

    首先初始化引脚,然后初始化定时器,在定时器中断函数中定义一个周期,调节周期内高电平的占空比,从而调整灯的亮度。

  • 相关阅读:
    MySQL 存储过程,语法+示例,超详细!!
    WebGIS 地铁交通线网数据可视化监控平台
    项目成本管理
    Go :验证编译器是否检测到错误的switch语句(附完整源码)
    ContentProvider启动流程分析
    Spring框架学习(二)---- 我的第一个Spring程序
    Python爬虫实战:自动化数据采集与分析
    虚幻阴影整理
    自动抓取app数据技术方案总结
    Java 常用类(包装类)
  • 原文地址:https://blog.csdn.net/weixin_61121477/article/details/127746732