剛畢業不久,這可以說是我在公司做的第乙個專案吧,跟大家分享一下!一、環境:
公司所採用的是stm32f103rbt6晶元,本人開發是基於官方提供的v3.5.0的函式庫。
二、所要實現的功能是:
1. 開發板能夠學習由遙控器傳送來的紅外碼,並在串列埠上列印出來。
2. 上位機通過串列埠程式,傳送學習來的碼,可控制紅外裝置。
3. 傳送時共有四路,上位機傳送碼子時,可選擇通道。
三、實現:
0. 在寫功能之前先要對我們所用的模組和時鐘進行初始化。
(此部分 自己看手冊)
1. 開發板能夠學習由遙控器傳送來的紅外碼,並在串列埠上列印出來。
紅外的學習功能我是利用中斷+定時,來記錄紅外碼高低電平的時間長度,程式如下:
/********tim2本人設定的是技術一次為1us*************/
void exti9_5_irqhandler(void)
else
num++;}}
此部分**記錄了紅外高低電平的時長,並儲存在陣列ir_data中,在主程式while(1)裡可設定相應的標識列印出這些資料。
2. 上位機通過串列埠程式,傳送學習來的碼,可控制紅外裝置。
3. 傳送時共有四路,上位機傳送碼子時,可選擇通道。
二和三的功能我用乙個函式實現了,因為,功能三,只需要有相應的標識就行了,函式如下:/*************tim2的設定通接受時是一樣的**************/
void send_irda(void)
}while(tim_getflagstatus(tim2, tim_flag_update) == reset);
tim_clearflag(tim2, tim_flag_update);
tim_cmd(tim2, disable);
gpio_resetbits(gpiob, gpio_pin_1 | gpio_pin_12 | gpio_pin_13 | gpio_pin_14);
}想必大家看了**都知道了,我是利用最後乙個位元組選擇的傳送通道,具體是由函式中的switch語句實現的。
把儲存在陣列中的紅外碼通過定時器,還原出接受到得紅外碼子。
附:想必大家都知道紅外的傳送時需要載波訊號的,利用此晶元的pwm功能我也產生了38k的載波訊號,**如下:
tim_timebasestructure.tim_period = 210;
tim_timebasestructure.tim_prescaler = 8;
tim_timebasestructure.tim_clockdivision = 0;
tim_timebasestructure.tim_countermode = tim_countermode_up;
tim_timebaseinit(tim3, &tim_timebasestructure);
tim_ocinitstructure.tim_ocmode = tim_ocmode_pwm1;
tim_ocinitstructure.tim_outputstate = tim_outputstate_enable;
tim_ocinitstructure.tim_pulse = 105;
tim_ocinitstructure.tim_ocpolarity = tim_ocpolarity_high;
tim_oc3init(tim3, &tim_ocinitstructure);
tim_oc3preloadconfig(tim3, tim_ocpreload_enable);
tim_arrpreloadconfig(tim3, enable);
tim_cmd(tim3, enable);
這部分其實看看晶元手冊,就知道了。
這個帖子是我的第乙個帖子,也是我進入公司後,做的第乙個比較像樣的東西,希望大家給給力,多頂頂。
同時,也希望這能為那些剛入門的新手提供點幫助。
STM32紅外的實現
剛畢業不久,這可以說是我在公司做的第乙個專案吧,跟大家分享一下!一 環境 公司所採用的是stm32f103rbt6晶元,本人開發是基於官方提供的v3.5.0的函式庫。二 所要實現的功能是 1.開發板能夠學習由遙控器傳送來的紅外碼,並在串列埠上列印出來。2.上位機通過串列埠程式,傳送學習來的碼,可控制...
STM32紅外尋跡小車
循跡模組我用的是紅外感測器。黑線的檢測原理是紅外發射管發射光線到路面,紅外光遇到白底則被反射,接收管接收到反射光,經施密特觸發器整形後輸出低電平 當紅外光遇到黑線時則被吸收,接收管沒有接收到反射光,經施密特觸發器整形後輸出高電平。簡單的說就是當紅外尋跡模板遇見黑線時會產生乙個高電平,遇見白線時會返回...
stm32紅外遙控的外部中斷實現
花了整整兩天時間終於算是基本把紅外解碼搞明白了,其實並不是很難,用了兩天時間,說來慚愧啊,原因就是細節上的問題,不過最終總算找出問題來了。使用外部中斷來解碼,就先對外部中斷進行配置吧 void exti init rcc apb2enr 1 0 使用外部中斷要開afio復用時鐘,因為要用到用到它的暫...