stm32f103讀取紅外置收HS0038A2

2021-07-10 22:38:57 字數 2405 閱讀 1831

軟體:

iar 7.4

stm32cubemx 4.14.0

硬體:stm32f103vbt6

原理圖,和手冊建議的基本一致,只是上拉電阻不是手冊建議的10k以上,這裡的面板距離控制器比較遠,可能是考慮到線阻。

hal配置,使用cubemx。

hs0038a2的輸出,帶有上拉電阻,接著乙個led燈,因此tim3的ic腳浮空。

設計者恰好把ir設計在tim3的通道4上。如果使用了通道1/2, 就可以使用pwm輸入方式來捕捉紅外脈衝,可以拿到每個脈衝的資料。

ic模式使用下降沿。

紅外控制這裡是常用的nec協議。遙控器輸出高電平,而hs0038a2轉換低電平輸出。 如,乙個9ms高+4.5ms的低,組成乙個header,out資料線上訊號是 9ms低+4ms高,空閒時資料線是高(避免干擾)。

因此,我們只檢測下降沿中斷,就可以識別紅外的乙個脈衝訊號(1幀訊號發出,9ms一開始就拉底,而後4.5ms拉高再拉低)。邏輯1為2.25ms,邏輯0為1.12ms. 

tim3還給其他外設提供即時,所以這裡使用了1us的解析度。

需要啟用tim3的中斷,因為使用了freertos,所以其中斷設定到最低15級。也不怕其他外設中斷紅外讀取。

**.h

/*

* hs0038a2

* ir.h**/

#ifndef _ir_h

#define _ir_h

#include "tim.h"

#include "cmsis_os.h"

#define delta 200

#define header_min 13500 - delta

#define header_max 13500 + delta

#define data1_min 2250 - delta

#define data1_max 2250 + delta

#define data0_min 1120 - delta

#define data0_max 1120 + delta

#define ir_addr 2

typedef enum nec_state;

#endif

**.c:

/*

* ir.c

*/#include "ir.h"

extern osmessageqid q_irhandle;

static uint32_t ccr_prev = 0;

static uint32_t ccr_cur = 0;

static uint32_t timeout = 0;

static uint8_t pulse_cnt = 0;

static uint32_t ir_code;

nec_state state = necstate_idle;

void hal_tim_ic_capturecallback(tim_handletypedef *htim)

else

// 接收到資訊頭,就接收4個8位元組。。

// 校驗

if ((uint8_t)(~code[0])!=code[1] || (uint8_t)(~code[2])!=code[3])

return;

if (code[0] != ir_addr)

return;

// 放到佇列

if (q_irhandle != null)

}// 超時 110ms

if (timeout >= 110*1000)

ccr_prev = ccr_cur;

} //

}

檢測到資訊頭後,連續讀32bit到乙個uint32_t資料中。

這裡沒有依靠最後1給560us來做結束判斷,只是乙個 pulse_cnt>=32 來做判斷,開始寫到  pulse_cnt>=31,結果反碼總是差0x80。

最後分離出4個位元組,做位址檢測,以及校驗。 校驗是使用 ~ 取反碼,iar下需要強制轉換到uint8_t,否則判斷條件為假。

也沒有做連續按鍵處理。

超時處理,乙個是判斷脈衝持續時間在3ms內,另乙個是判斷脈衝總時間在110ms內。

因為板子用可控矽控制罩極電機,啟動電機後,能看到out輸出干擾訊號,但是被headr判斷給擋掉了。

stm32f103外部中斷

void extix init void 外部中斷0服務程式 void exti9 5 irqhandler void 這是簡單的外部中斷的配置,pc7作為中斷輸入 上面補充io口的初始化 gpio initstructure.gpio mode gpio mode ipu pc6配置為快充指示 1...

STM32F103啟動檔案

目錄 一 概述 二 彙編指令 2.1 equ 2.2 area 2.3 space 2.4 preserve8 2.5 thumb 2.6 export 2.7 dcd 2.8 proc 2.9 ldr 2.10 blx 2.11 bx 2.12 temport 2.13 b 2.14 if,els...

關於STM32F103精確延時

為了相容freertos,所以將延時函式統一規範,後續使用方便移植。此延時針對無晶振,示例為系統倍頻64mhz,型號 stm32f103c8t6。新建system資料夾,新增兩個檔案,delay.c和delay.h 以下為delay.c內容 其中系統已倍頻為64m include stm32f10x...