STM32L0實現發射空調紅外編碼功能

2021-10-04 22:05:40 字數 2116 閱讀 9038

最近做乙個空調紅外的功能,上網搜了一下格力空調的紅外編碼,就按照編碼模擬時序。

格力空調遙控器(yb0f2)紅外碼組成如下,按解碼順序排列

起始碼(s)+35位資料碼+連線碼(c)+32位資料碼

1、各種編碼的電平寬度:

資料碼由「0」「1」組成:

0的電平寬度為:600us低電平+600us高電平,

1的電平寬度為:600us低電平+1600us高電平

起始碼s電平寬度為:9000us低電平+4500us高電平

連線碼c電平寬度為:600us低電平+20000us高電平

2、資料碼波形捕抓

這是起始碼+前35位資料碼的波形

這是連線碼+後32位資料碼波形

3、原理解釋

我控制pin腳是b點,控制發射的是c點。所以當b點為高電平,a點為低,c點為高,三極體不導通,則led不發光,不發射載波。

當b點為低電平,a點輸出38khz載波,c點導通led也輸出38khz載波。

由於接收器和發射端存在反向關係,看接收端波形圖起始碼是先低電平9ms的,那麼發射端led要發光,即發出38k載波,那麼b點的要輸出低電平。

所以得出的規律:b點輸出低,接收器接收到就是低;b點輸出高電平,接收器接收到就是高。

4、**實現

我用的是定時器來完成100us的延時,所以先初始化乙個定時器,採用向下計數模式。

void

ir_timer_init

(void

)

100us延時的函式實現

static

void

delay_100us

(uint16_t us)

起始碼

/*

起始碼s碼:9000us低電平 + 4500us高電平

*/static

void

start_code

(void

)

連線碼

/*

連線碼c碼:600us低電平 + 20000us高電平

*/static

void

connect_code

(void

)

資料0碼

/*

資料碼0碼:600us低電平 + 600us高電平

*/static

void

zero_code

(void

)

資料1碼

/*

資料碼1碼:600us低電平 + 1600us高電平

*/static

void

one_code

(void

)

編碼資料

uint8_t close_air_condi[67]

=;

傳送紅外編碼函式

#define code_work(on_off)	(on_off)>0 ? one_code(): zero_code()

void

send_code

(uint8_t code_data)

呼叫函式實現紅外發射編碼載波

while(1

)

完成空調紅外編碼載波發射的步驟大概就是這樣,影響這個功能能否真正控制空調有兩個:

1、紅外編碼。不同品牌空調有不同編碼,甚至同乙個品牌不同型號空調也可能不同編碼,因此要找準你要控制的空調的編碼。

2、編碼時序的時間是否精準。要求0碼是要600us低和600us高,然後我發出來的波形0碼只有575us低和575us高。少了25us具體能不能控制找個空調試試才知道。

更新:我已根據遙控器的開關編碼把載波發出來了,實現能對格力空調的開關控制。

STM32L0 內部EEPROM寫讀

stm32l0內部的eeprom寫操作由解鎖,寫入,加鎖過程組成,讀過程則無需解鎖。至於stm32l0內部的非易失空間區分為flash和eeprom,主要體現在用st link等工具進行整片擦除時,只擦除flash的空間,eeprom的部分不會被擦除,如同外部eeprom晶元,mpu的 公升級不影響...

STM32L0開發筆記 手動新增驅動檔案

我們可以通過stm32cubemx生成工程 但是如果我們的工程已經建立完畢了,或者說我們在原有的工程上,開始新的專案設計,此時又需加入新的驅動,該如何呢?本文 其解決方法。1 stm32cubemx的驅動路徑如下圖所示,我們希望加入什麼驅動,就直接將其對應的.c檔案加入到工程中即可。2 為了使該模組...

STM32紅外的實現

剛畢業不久,這可以說是我在公司做的第乙個專案吧,跟大家分享一下!一 環境 公司所採用的是stm32f103rbt6晶元,本人開發是基於官方提供的v3.5.0的函式庫。二 所要實現的功能是 1.開發板能夠學習由遙控器傳送來的紅外碼,並在串列埠上列印出來。2.上位機通過串列埠程式,傳送學習來的碼,可控制...