(一),使用延时函数(严重占用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; // 切换到渐亮
}
}
}
}