
一、概述本文講述關于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過程且在實時性、效率方便提高以最簡單的方式完成呼吸燈的暫停與開始。