wenbo2005.online

学习记录 / STM32

模拟呼吸灯

STM322024-11-29

(一),使用延时函数(严重占用CPU)

void TryLedPwm()
{
    for(int i=0;i<=20;i++)
    {
        GpioWrite(&Led1,0);
        GpioWrite(&Led2,0);
        HAL_Delay(20-i);
        GpioWrite(&Led1,1);
        GpioWrite(&Led2,1);
        HAL_Delay(i);
    }
    for(int i=0;i<=20;i++)
    {
        GpioWrite(&Led1,1);
        GpioWrite(&Led2,1);
        HAL_Delay(20-i);
        GpioWrite(&Led1,0);
        GpioWrite(&Led2,0);
        HAL_Delay(i);
    }
}

(二),使用定时器,运行流畅

uint8_t time = 70;                // PWM周期长度(太大有频闪)
uint8_t high_time = 1;        // 初始LED高电平时长
uint8_t low_time = 1;             // 初始LED低电平时长
uint8_t now_time = 0;         // 当前计时器值
_Bool flag = 0;                   // 渐亮渐灭切换

extern uint8_t led_ststus;

void Time3Handler()//每1ms进入一次
{
    if(led_ststus==1)//呼吸灯开启标志
    {
        now_time = (now_time + 1) % time;
        if (now_time < high_time)
        {
            GpioWrite(&Led1, 1);
            GpioWrite(&Led2, 1);
        }
        else
        {
            GpioWrite(&Led1, 0);  // LED1灭
            GpioWrite(&Led2, 0);  // LED2灭
        }
        //每个周期结束后调整高电平和低电平时长
        if(now_time == 0)
        {
            if(flag == 0)
            {
                high_time = (high_time + 1) % time;   // 高电平时长逐渐增加
                low_time = (low_time + 1) % time;   // 低电平时长保持小值
                if (high_time == time - 1)
                 flag = 1;
            }
            else
            {
                high_time = (high_time - 1) % time;       // 高电平时长逐渐减少
                low_time = (low_time - 1) % time;       // 低电平时长逐渐增大
                if (high_time == 1)                     // 达到最小亮度后切换为渐亮
                flag = 0;                         // 切换到渐亮
            }
        }
    }
}