蓝桥杯单片机学习7——PWM脉宽调制&控制LED的亮度

上期我们学习了定时器的相关内容,这次我们来学习PWM脉宽调制

什么是PWM

PWM(Pulse Width Modulation)简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在测量、通信、工控等方面。

PWM的频率

在一秒内,电平从高电平变化为低电平,再从低电平变化为高电平的次数就是PWM的频率
频率的单位为HZ(赫兹),计算公式:f = 1/T

PWM的周期

在一个PWM波形中,电压经过一个完整的高电平和低电平所用的时间就是一个周期,
计算公式:T = 1/f
举个栗子:
在这里插入图片描述

占空比

在一个周期内,高电平的时间占整个周期占比称为占空比,计算公式: Duty = 高电平时间 /T

利用PWM控制LED的亮度

任务要求在这里插入图片描述

控制原理

  • 通过设置不同的占空比,控制LED在一个周期内亮起的时间,实现对LED亮度的控制,
  • 定义一个LED工作模式mode,通过按键按下改变mode,再通过mode去调节占空比,实现对LED亮度的控制。
  • f = 100HZ,那么T = 1/100 = 0.01s = 10ms 我们可以控制定时器每0.1s触发一次,那么触发一百次就是一个周期,假设现在占空比为50%,那么电平就应该在第50次触发定时器中断时由高电平跳变为低电平

不同mode对应的占空比如下:
完全熄灭 mode = 0 Duty = 0%
10%亮度 mode= 1 Duty = 10%
50%亮度 mode = 2 Duty = 50%
90%亮度 mode = 3 Duty = 90%

代码实现

1.main.c

#include <STC15F2K60S2.H>

sbit Key7 = P3^0;       //位定义按键S7

unsigned char Timer0_Duty = 0;      //定义占空比
unsigned char LED_MOde = 0;         //定义LED工作模式
unsigned char Timer0_Count = 0; 

//延时函数,延时xms
void Delayxms(unsigned int x)		//@12.000MHz
{
	unsigned char i, j,k;

	for(k=0;k<x;k++)
    {
        i = 12;
        j = 169;
        do
        {
            while (--j);
        } while (--i);
    }
}
//LED控制函数,控制L1的亮起和熄灭
void LED_Control(unsigned int Flag)
{
   if(Flag)
   {
        P2 = 0x1F | 0x80;
        P0 = 0xFE;
   }
   else
   {
        P2 = 0x1F | 0x80;
        P0 = 0xFF;
   }
}
//按键扫描函数,判断S7是否按下
unsigned int  Key_Scan(void)
{
    if(Key7==0)
    {
        Delayxms(20);
        if(Key7==0)
        {
            LED_MOde >= 3 ? LED_MOde=0 : LED_MOde++;
            while(!Key7)
            {
                
            }
            return 1;
        }
    }
    return 0;
}
//占空比改变函数,根据LED的工作模式,控制占空比
void Duty_Control(unsigned Mode)
{
    if(Mode == 0)
    {
        Timer0_Duty = 0;
    }
    switch(Mode)
    {
        case 1: Timer0_Duty = 10;
            break;
        case 2: Timer0_Duty = 50;
            break;
        case 3: Timer0_Duty = 90;
            break;
    }
    
}
//定时器0初始化函数,0.1ms触发一次中断
void Timero_Init(void)
{
    TMOD = TMOD | 0x00;     //设置工作模式为16位自动重装载
    TL0 = 0x9B;             //设置定时器溢出时间为0.1ms
    TH0 = 0xFF;
    ET0 = 1;                //开启定时器0中断允许
    EA =1;                  //开启中断总允许
    TR0 = 1;                //开启定时器0
}
void main()
{   
    Timero_Init();          //定时器0初始化
	while(1)
	{
        if(Key_Scan());     //判断S7是否按下
        Duty_Control(LED_MOde);     //通过LED工作模式改变占空比
	}
}

//定时器0中断服务函数
void Timer0_Interrupt() interrupt 1
{
    Timer0_Count>100 ? Timer0_Count=0 : Timer0_Count++ ;    
    if(Timer0_Count <= Timer0_Duty)     
    {
        LED_Control(1);
    }
    else
    {
        LED_Control(0);
    }
    
}
  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
按键PWM控制LED亮度是一种常见的电路应用,通过调节PWM信号的占空比来实现LED亮度控制。在Cubemx程序中,我们可以通过以下步骤来实现这种控制方式。 步骤一:在Cubemx中选择合适的MCU型号,并添加按钮和LED组件。这里我们假设使用的是STM32F103C8T6 Microcontroller,需要添加一个GPIO Input和GPIO Output组件。 步骤二:为按钮和LED组件分配相应的引脚。这里我们将按钮分配到PA0引脚,LED分配到PB0引脚,具体分配方式可以通过Cubemx的GPIO配置界面实现。 步骤三:设置PWM通道。在Cubemx的RCC配置中找到TIM4定时器,并使能其时钟。然后,转到TIM4的PWM输出配置对话框,并将它与PB0引脚关联。接下来,选择一个合适的预分频值和计数周期,并将PWM输出模式设置为PWM模式1。最后,启用PWM输出通道2的DMA操作。 步骤四:编写代码。通过Cubemx代码生成器,我们可以得到一个基础代码框架。在这个框架中,我们可以添加按键中断服务函数,并在其中编写PWM控制代码。在按键中断服务函数中,我们可以通过读取PA0引脚的状态来确定PWM占空比的大小,然后利用TIM4的PWM输出通道2来控制LED亮度。 综上所述,按键PWM控制LED亮度程序Cubemx的实现步骤包括:选择MCU型号和添加按钮和LED组件、分配引脚、设置PWM通道和编写代码。通过这些步骤的实现,我们可以很轻松地实现这种亮度控制方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不想写代码的我

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值