四 【單片機入門】應用層軟件開發的單片機學習之路-----ESP32開發板PWM控制電機以及中斷的使用

引言各位大佬,晚上好?。?在上一篇博客中 , 我們講了什么是UART串口通訊,以及使用USB轉TTL使得單片機可以和c#上位機做一個串口通訊,接下來,為大家帶來PWM的概念原理,以及實際案例 , 使用PWM對電機進行速度調制,因為本課程的最后是做一個紅外遙控的智能小車,所以是需要電機四個,驅動四個,輪胎四個 , 所以PWM對于最后的成果也是極為重要,并且在實際開發中,PWM也是比較常用的調速方式 。
概念PWM全稱Pulse width modulation,中文翻譯為脈沖寬度調制,其基本原理為控制方式就是對逆變電路開關器件的通斷進行控制 , 使輸出端得到一系列幅值相等但寬度不一致的脈沖 , 用這些脈沖來代替正弦波或所需要的波形 。也就是在輸出波形的半個周期中產生多個脈沖 , 使各脈沖的等值電壓為正弦波形,所獲得的輸出平滑且低次諧波少 。按一定的規則對各脈沖的寬度進行調制,既可改變逆變電路輸出電壓的大?。部篩謀涫涑銎德?。
可能上面對于原理的解釋過于官方,大家可能看不懂,通俗易懂的來說,就是通過對電子元器件的電路進行高低電平進行控制 , 在一段時間內,高低電平在輸出會形成一段波動,這個波動可以成為PWM波形,而我們需要使用代碼去控制PWM的輸出波形,高電平在這一段波動中,通電時間即高電平時間是占了總時間多少,同時在這一段PWM波形中,高低電平來回切換的頻率又是多少,形成了這么一段波形,這就引入了兩個概念,占空比(Duty Ratio)和頻率,占空比代表著,高電平通電總時和總時的一個占比(這段波形中,高低電平的總共占用時間),而頻率則是高低電平在這段波形中,來回切換的一個頻率 。
如下圖,下方在Arduino串口繪圖器中,展示了一段鋸齒波形,看下方的GIF我們可以看到對應的電機運動也是有快到慢的一個運動狀態 。

四 【單片機入門】應用層軟件開發的單片機學習之路-----ESP32開發板PWM控制電機以及中斷的使用

文章插圖
代碼解析void setup() {Serial.begin(9600);ledcSetup(0, 5000, 8);ledcAttachPin(12, 0);}// the loop function runs over and over again forevervoid loop() {for (int dutyCycle = 0; dutyCycle <= 255; dutyCycle++) {ledcWrite(0, dutyCycle);delay(7);Serial.println(dutyCycle);}}在Arduino中我們可以使用LEDC來實現對PWM的控制,而在純c樂鑫的開發板中 , 是可以使用MCPWM進行控制,但是由于Arduino在此處不能使用MCPWM,則就有了LEDC作為替代品,ESP32帶有一個16通道的一個LED PWM控制器 , 對應使用的是樂鑫的LED PWM控制,ESP32 LED PWM,分為8路高速通道和8路低速通道,然后我們使用不同的頻率,和占空比來實現控制電機轉速的控制 。
在上面的代碼中,我們先設置了ledc的通道為0,頻率為5000,第八個低速LED控制器,即代碼為 ledcSetup(0, 5000, 8);然后需要將通道和引腳進行管理使用ledcAttachPin(12, 0);將引腳12和第0個通道關聯起來 , 在loop代碼中 , 可以看到,我們寫入的最大的占空比為255,而0-255總數為256 , 那是因為,占空比是和通道是有關系的,上文提到 , LED的PWM控制器一共有16個,此處我們使用8,而256則為2的8次方的值 , 所以占空比最大為256,如果取值為10,占空比的最大值則為1024-1;ledcwrite(0,dutyCycle);則是將占空比寫入對應的通道,便完成了PWM對電機進行調速設置 。
四 【單片機入門】應用層軟件開發的單片機學習之路-----ESP32開發板PWM控制電機以及中斷的使用

文章插圖
Arduino針對ESP32 樂鑫PWM的封裝,目前已知的有LEDC,不需要安裝,默認就可以使用,而其他的也有對于PWM的封裝 , 個人測試了一兩個倒也沒有這個好用,后續各位朋友也可以繼續探索其他好用的PWM庫進行開發 。
中斷在上面講完PWM之后,我們再來講一下中斷 , 以及中斷的一個實際案例 。中斷,顧名思義,是在程序執行期間 , 遇到某一個事件的時候,將暫停手上的工作先去執行某一件事情 , 這個事情則是我們中斷當下工作,去執行的事情,這個動作,稱之為中斷 。雖然在代碼中,可以注冊一個后臺任務(在純c中),進行不停的while,但是這樣在性能上還是無法發揮單片機的功效 , 所以這種場景下我們便需要使用中斷,來實現我們的某種功能,例如使用按鈕,來判斷是否需要打開LED,或者是其他的行為 。
在Arduino中,我們可以使用attachInterrupt函數來進行對引腳增加中斷以及使用detachInterrupt來移除中斷,
attachInterrupt函數需要三個參數,第一個為中斷需要使用的引腳pin , 第二個為中斷觸發的函數,第三個為中斷的類型 , 對于ESP32的中斷,在Arduino中 , 其方法名前面必須加一個IRAM_ATTR標記其為中斷函數,第一個函數中的digitalPinToInterrupt為將27和中斷進行一個綁定,同時還有其他方法,但是官方均不推薦,

推薦閱讀