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


在下方的代碼中,我們定義了一個change的函數用來處理ESP32 27引腳的中斷 , 用27引腳的電平控制LED引腳2的電平,以此來控制是否點亮LED燈 , 先設置引腳2為輸出模式,27引腳為上拉輸入模式 , 可以理解為上拉電阻的一般都需要用到這種模式,然后我們將引腳27和中斷進行關聯,設置中斷函數為change,模式為CHANGE 。然后在LOOP函數中 , 我們給引腳2寫入state的值,當進入change中斷函數中,會將state取反,然后進入loop寫入值 。以此實現控制LED的顯示和不顯示,在這里 , 提醒一下,由于在單片機中 , 中斷以及定時器都是非阻塞模式 , 而Serial.println函數是阻塞寫入緩沖區,會導致中斷函數會不斷的輸出錯誤,錯誤:Guru Meditation Error: Core 1 panic'ed (Interrupt wdt timeout on CPU1).
這是因為println函數阻塞導致定時器無法繼續執行,所過非要使用此函數,可以嘗試設置中間變量,然后在loop函數中判斷是否改變值 , 然后進行輸出信息到串口 。
可以在下方GIF看到,我們使用按鈕進行控制LED的顯示和不顯示 。
volatile byte state = LOW;void IRAM_ATTR change(){state=!state;}void setup() {// put your setup code here, to run once:Serial.begin(9600);pinMode(2, OUTPUT);pinMode(27, INPUT_PULLUP);attachInterrupt(digitalPinToInterrupt(27), change, CHANGE);}void loop() {digitalWrite(2, state);// put your main code here, to run repeatedly:}可以看到第二個方法是傳入一個interrupt的中斷編號,但是ESP32上面的中斷編號,不在官方資料中,所以我們只有需要第一個方法來進行引腳和中斷函數的關聯,當然了可能最后一個也是可以,只是此處我沒有嘗試 , 感興趣的可以進行嘗試,
在mode中,Arduino是支持五種模式,第一種為LOW,,看翻譯我們知道,這個是在電平處于低電平時會觸發中斷函數,
第二個CHANGE是不管是高到低,還是低到高,都會觸發
第三種是引腳在由低電平到高電平時觸發,而不是已經到了高電平觸發,
第四種是下降 , 當電平由高到低時會觸發中斷函數,
第五種是電平處于高電平時會觸發中斷函數 。

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

文章插圖

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

文章插圖
結語今天講了PWM還有中斷的使用,可能一次性講的有點多,有點難以消化,有什么不懂的可以及時問我,以及后面我更新的時間會稍微慢一點,防止講的過快,一時間不明白,后面還會有對于IIC,SPI的一個案例講解,在這些講完后,我會開始準備最終極的目標,做一個智能小車,其中會需要的配件,這兩天我會總結好發到群里,以及購買鏈接 。有感興趣的同學可以加QQ群 , 一起學習,一起討論,博主也是一個剛開始玩單片機的學徒 , 后面也會研究stm32系列單片機,歡迎大家加入討論 , 學習 。
四 【單片機入門】應用層軟件開發的單片機學習之路-----ESP32開發板PWM控制電機以及中斷的使用

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

推薦閱讀