工程師3 發表於 2018-04-30 17:52:00
1、紅外發射協議
紅外發射協議已經在之前的文章中寫過,在此就不贅述。
2、定時器計數和輸入捕獲
定時器就是按照一個特定的頻率對計數值進行加一或減一操作,當數值溢出時則產生一個標誌或中斷。
定時器的輸入捕獲就是可以測量輸入信號的脈衝寬度。
本次就是通過普通計數和輸入捕獲的結合來實現的。
3、實現方法
利用定時器記錄輸入信號高脈衝的時間,通過該時間來判斷數據是否是同步頭信息、數據 1 或者數據 0。
1、配置 定時器2 輸入捕獲通道
示例代碼中使用 PA1 管腳,配置為上拉輸入模式,復用功能為定時器2的通道2。
定時器採用普通定時器,定時器2,該定時器具有輸入捕獲功能。
配置定時器的兩種工作模式,一個是普通計數器TIM_TimeBaseInit,一個是輸入捕獲模式TIM_ICInit。
配置定時器2的中斷源,有兩個中斷源,一個是更新中斷TIM_IT_Update,一個是輸入捕獲中斷TIM_IT_CC2。
配置代碼如下:
2、添加定時器2的中斷服務函數
使用了兩種定時器中斷源,分別為計數溢出中斷和輸入捕獲中斷。但是這兩種方式觸發中斷的中斷服務函數是同一個,即void TIM2_IRQHandler(void)。
定時器使用的是 TIM2 通用定時器,模式為向上計數。在該模式中,計數器從 0 計數到自動加載值 (TIMx_ARR計數器的內容) ,然後重新從 0 開始計數並且產生一個計數器溢出事件。定時器計數溢出的周期為10ms,該中斷的產生說明在10ms內都沒有輸入捕獲來清空計數值,也就是輸入信號沒有發生變化,說明 10ms 沒有收到紅外信號了,因此可判斷為接收完成。
輸入捕獲是為了測量高電平的持續時間,因此採用上升沿觸發中斷,對計數值清零,切換下一次為下降沿觸發;在下降沿觸發中斷時,記下計數值,切換下一次為上升沿觸發。因此在下降沿記下的時間即為高電平的時序時間。記錄高電平持續時間的原因,是因為紅外信號在表示邏輯0、邏輯1時低電平的持續時間的相同的,而高電平的持續時間不同的。
示例代碼如下:
3、紅外按鍵掃描函數
該函數放在主循環中,輪訓判斷按鍵是否接收完成。如果接收完成則開始分析鍵值。
該函數返回一個16位的數值,其中低八位表示鍵值,高八位表示按下的次數,依次來分析長按鍵和短按鍵。這一點主要是通過紅外協議中重複碼的規定來實現的。
紅外協議中規定,若按下一個鍵後沒有放開,則會以 108ms 為一個周期發送重複碼。重複碼錶現為2.25ms的高電平。
示例代碼如下:
4、主函數
在 main 函數中,對 IO 口和 定時器進行初始化。
主循環中,通過判斷接收完成標誌位,對接收完成的按鍵控制碼進行列印。
SystemKeyHandle()函數處理每一個按鍵的操作邏輯。
示例代碼如下:
如下圖為串口列印出接收的紅外按鍵值信息:
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容圖片侵權或者其他問題,請聯繫本站作侵刪。 侵權投訴