板-非定時(shí)器方式實(shí)現(xiàn)PWM呼吸燈-實(shí)時(shí)狀態(tài)更改方法-呼吸燈簡易實(shí)現(xiàn)方法)
一、概述本文講述關(guān)于PWM呼吸燈不使用定時(shí)器的呼吸方式并且可以實(shí)現(xiàn)隨時(shí)暫停至某一單個(gè)亮度的PWM調(diào)光程序具有非常高的實(shí)時(shí)性對外界改變操作實(shí)時(shí)做出反饋。二、實(shí)現(xiàn)思路本文的實(shí)現(xiàn)思路是以非定時(shí)器PWM實(shí)現(xiàn)的需要先學(xué)習(xí)文章STM32實(shí)現(xiàn)模擬呼吸燈效果-非PWM-STM32CubeMx項(xiàng)目生成-手動控制呼吸燈調(diào)光下面我們需要使用此思路重新完成呼吸燈的配置其只要思路即在主函數(shù)中一直進(jìn)行PWM的呼吸效果將完整的PWM過程拆分為若干個(gè)過程使得程序具有實(shí)時(shí)性且可以隨時(shí)停留在某個(gè)占空比上當(dāng)且僅當(dāng)主程序調(diào)用調(diào)光函數(shù)時(shí)占空比才會相應(yīng)增加或減少。三、代碼實(shí)現(xiàn)首先定義兩個(gè)變量分別代表占空比與占空比上升標(biāo)志位。int zkb0; int up1;主要代碼實(shí)現(xiàn)如下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); } } }通過閱讀本段代碼可以得知我們只需要在主函數(shù)中不斷調(diào)用即可實(shí)現(xiàn)呼吸燈效果且當(dāng)我們不在調(diào)用時(shí)LED燈將熄滅。下面我們繼續(xù)增加一個(gè)標(biāo)志位僅當(dāng)標(biāo)志位為真時(shí)才會提高會降低占空比代碼實(shí)現(xiàn)如下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); } } }通過這個(gè)函數(shù)我們可以看出我們在主函數(shù)中循環(huán)調(diào)用該函數(shù)當(dāng)呼吸標(biāo)志位為真時(shí)則占空比會改變否則將持續(xù)當(dāng)前亮度。主函數(shù)調(diào)用方法int main( void ) { Init(); while( 1 ) { breath(); if(isKey2Pressed()) { breathflag1; resetKey2(); } if(isKey3Pressed()) { breathflag0; resetKey3(); } } }函數(shù)解析如下當(dāng)按下key2鍵時(shí)程序開始進(jìn)入呼吸燈當(dāng)按下key3鍵時(shí)呼吸燈停止并一直展示當(dāng)前亮度。四、總結(jié)本文闡述了一種除定時(shí)器PWM調(diào)光外的一種虛擬的PWM過程且在實(shí)時(shí)性、效率方便提高以最簡單的方式完成呼吸燈的暫停與開始。