
一、概述本文讲述关于PWM呼吸灯不使用定时器的呼吸方式并且可以实现随时暂停至某一单个亮度的PWM调光程序具有非常高的实时性对外界改变操作实时做出反馈。二、实现思路本文的实现思路是以非定时器PWM实现的需要先学习文章STM32实现模拟呼吸灯效果-非PWM-STM32CubeMx项目生成-手动控制呼吸灯调光下面我们需要使用此思路重新完成呼吸灯的配置其只要思路即在主函数中一直进行PWM的呼吸效果将完整的PWM过程拆分为若干个过程使得程序具有实时性且可以随时停留在某个占空比上当且仅当主程序调用调光函数时占空比才会相应增加或减少。三、代码实现首先定义两个变量分别代表占空比与占空比上升标志位。int zkb0; int up1;主要代码实现如下void breath() { GpioWrite(Led1,0); if(up1) { zkb; if(zkb1500) up0; } else { zkb--; if(zkb0) up1; } for(int i0;i1500;i) { if(izkb) { GpioWrite(Led1,1); } } }通过阅读本段代码可以得知我们只需要在主函数中不断调用即可实现呼吸灯效果且当我们不在调用时LED灯将熄灭。下面我们继续增加一个标志位仅当标志位为真时才会提高会降低占空比代码实现如下int zkb0; int up1; int breathflag0; void breath() { GpioWrite(Led1,0); if(breathflag1) { if(up1) { zkb; if(zkb1500) up0; } else { zkb--; if(zkb0) up1; } } for(int i0;i1500;i) { if(izkb) { GpioWrite(Led1,1); } } }通过这个函数我们可以看出我们在主函数中循环调用该函数当呼吸标志位为真时则占空比会改变否则将持续当前亮度。主函数调用方法int main( void ) { Init(); while( 1 ) { breath(); if(isKey2Pressed()) { breathflag1; resetKey2(); } if(isKey3Pressed()) { breathflag0; resetKey3(); } } }函数解析如下当按下key2键时程序开始进入呼吸灯当按下key3键时呼吸灯停止并一直展示当前亮度。四、总结本文阐述了一种除定时器PWM调光外的一种虚拟的PWM过程且在实时性、效率方便提高以最简单的方式完成呼吸灯的暂停与开始。