今日分享野火瑞薩創(chuàng)意氛圍賽選手的作品——基于RA6M5的智能煙霧感應(yīng)吸除系統(tǒng)。
該系統(tǒng)是基于野火啟明RA6M5開發(fā)板制作的一款智能煙霧感應(yīng)裝置。創(chuàng)作背景是作者在手工焊接電子元器件或電路板時(shí)候,常常會(huì)因?yàn)殚L(zhǎng)時(shí)間吸入焊接產(chǎn)生的煙霧而導(dǎo)致身體不適。因此趁著野火創(chuàng)意氛圍賽提供的學(xué)習(xí)機(jī)會(huì),在啟明開發(fā)板上實(shí)現(xiàn)感應(yīng)煙霧并利用風(fēng)扇吸除的功能,經(jīng)過初步驗(yàn)證,該系統(tǒng)能較好的達(dá)到理想控制狀態(tài)。
一、項(xiàng)目簡(jiǎn)介
該系統(tǒng)使用的開發(fā)板是野火啟明RA6M5,使用到的額外外設(shè)模塊有一路繼電器、7.4V電池模塊、煙霧傳感器。是基于瑞薩FSP庫完成軟件程序的編寫,由于時(shí)間原因,所有電路連接采用杜邦線完成。
二、項(xiàng)目說明
該系統(tǒng)有兩個(gè)工作模式,可通過野火啟明RA6M5上板載按鍵2切換工作模式。其中工作模式一是通過按鍵手動(dòng)控制風(fēng)扇轉(zhuǎn)動(dòng)。工作模式二是通過煙霧傳感器感應(yīng)煙霧從而發(fā)送信號(hào)驅(qū)動(dòng)風(fēng)扇轉(zhuǎn)動(dòng)。
三、系統(tǒng)方案
由于該系統(tǒng)結(jié)構(gòu)比較簡(jiǎn)單,因此無需給出系統(tǒng)框圖。簡(jiǎn)述過程就是利用GPIO輸出功能去驅(qū)動(dòng)繼電器打開,將風(fēng)扇與7.4V模塊導(dǎo)通轉(zhuǎn)動(dòng)。利用GPIO輸入功能識(shí)別煙霧傳感器電平信號(hào)從而驅(qū)動(dòng)繼電器。
四、硬件方案展示
1.風(fēng)扇模塊
模塊介紹:該模塊額定電壓為12V,工作電壓為7~12V由于作者手上沒有12V直流電池,因此用7.4V電池模塊替代。
2.繼電器模塊
模塊介紹:由于風(fēng)扇模塊工作電壓遠(yuǎn)高于單片機(jī)工作電壓3.3V,因此利用繼電器特性,可實(shí)現(xiàn)GPIO輸出功能控制風(fēng)扇轉(zhuǎn)動(dòng)或停止。
3.煙霧傳感器
模塊介紹:MQ-2氣體傳感器所使用的氣敏材料是在清潔空氣中電導(dǎo)率較低的二氧化錫 (SnO2)。當(dāng)傳感器所處環(huán)境中存在可燃?xì)怏w時(shí),傳感器的電導(dǎo)率隨空氣中可燃?xì)怏w濃度的增加而增大。使用簡(jiǎn)單的電路即可將電導(dǎo)率的變化轉(zhuǎn)換為與該氣體濃度相對(duì)應(yīng)的輸出信號(hào)。可以用于該系統(tǒng)中煙霧監(jiān)測(cè)裝置,傳感器特設(shè)M3固定安裝孔,使用寬電壓LM393比較器,信號(hào)干凈,波形好,驅(qū)動(dòng)能力強(qiáng),超過15mA,配可調(diào)精密電位器調(diào)節(jié)靈敏度。
4.杜邦線連接介紹
繼電器信號(hào)引腳連接P500,煙霧傳感器信號(hào)線連接P200,按鍵、LED燈均使用板載外設(shè),因此不再聲明。
五、軟件配置(RASC)
與程序編寫
1.RASC部分
(一)系統(tǒng)時(shí)鐘配置
系統(tǒng)時(shí)鐘使用默認(rèn)設(shè)置200M
(二)LED燈配置
啟動(dòng)板載LED燈用來顯示當(dāng)前工作狀態(tài)
(三)按鍵配置
配置按鍵用于切換功能
(四)煙霧傳感器輸入檢測(cè)配置
和按鍵配置同理
(五)繼電器配置
2.KEIL程序編寫部分
(一)系統(tǒng)框圖
(二)LED部分
bsp_led.c代碼
左右滑動(dòng)查看更多
#include "bsp_led.h" void Led_init(void) { //調(diào)用 R_IOPORT_Open 函數(shù)來初始化 IOPORT 模塊 R_IOPORT_Open (&g_ioport_ctrl, g_ioport.p_cfg); }
bsp_led.h代碼
左右滑動(dòng)查看更多
#ifndef _BSP_LED_H #define _BSP_LED_H #include "hal_data.h" #define LED1_TOGGLE R_PORT4->PODR ^= 1<<(BSP_IO_PORT_04_PIN_00 & 0xFF) #define LED2_TOGGLE R_PORT4->PODR ^= 1<<(BSP_IO_PORT_04_PIN_03 & 0xFF) #define LED3_TOGGLE R_PORT4->PODR ^= 1<<(BSP_IO_PORT_04_PIN_04 & 0xFF) #define LED1_ON R_IOPORT_PinWrite(&g_ioport_ctrl,BSP_IO_PORT_04_PIN_00,BSP_IO_LEVEL_LOW); #define LED2_ON R_IOPORT_PinWrite(&g_ioport_ctrl,BSP_IO_PORT_04_PIN_03,BSP_IO_LEVEL_LOW); #define LED3_ON R_IOPORT_PinWrite(&g_ioport_ctrl,BSP_IO_PORT_04_PIN_04,BSP_IO_LEVEL_LOW); #define LED1_OFF R_IOPORT_PinWrite(&g_ioport_ctrl,BSP_IO_PORT_04_PIN_00,BSP_IO_LEVEL_HIGH); #define LED2_OFF R_IOPORT_PinWrite(&g_ioport_ctrl,BSP_IO_PORT_04_PIN_03,BSP_IO_LEVEL_HIGH); #define LED3_OFF R_IOPORT_PinWrite(&g_ioport_ctrl,BSP_IO_PORT_04_PIN_04,BSP_IO_LEVEL_HIGH); void Led_init(void); #endif
(三)按鍵部分
bsp_key.c代碼
左右滑動(dòng)查看更多
#include "bsp_key.h" /* 定義宏 KEY_ON 表示按鍵按下 定義宏 KEY_OFF 表示按鍵沒有按下 */ /* 按鍵初始化函數(shù) */ void Key_Init(void) { /* 初始化配置引腳(這里重復(fù)初始化了,可以注釋掉) */ //R_IOPORT_Open (&g_ioport_ctrl, g_ioport.p_cfg); } uint32_t Key_Scan(bsp_io_port_pin_t key) { bsp_io_level_t state; // 讀取按鍵引腳電平 R_IOPORT_PinRead(&g_ioport_ctrl, key, &state); if (BSP_IO_LEVEL_HIGH == state) { return KEY_OFF; //按鍵沒有被按下 } else { do //等待按鍵釋放 { R_IOPORT_PinRead(&g_ioport_ctrl, key, &state); } while (BSP_IO_LEVEL_LOW == state); } return KEY_ON; //按鍵被按下了 }
bsp_key.h代碼
左右滑動(dòng)查看更多
#ifndef _BSP_KEY_H #define _BSP_KEY_H #include "hal_data.h" #define KEY_ON 1 #define KEY_OFF 0 #define KEY1_SW2_PIN BSP_IO_PORT_00_PIN_04 #define KEY2_SW3_PIN BSP_IO_PORT_00_PIN_05 #define FAN_TOGGLE R_PORT5->PODR ^= 1<<(BSP_IO_PORT_05_PIN_00 & 0xFF)//繼電器狀態(tài)翻轉(zhuǎn) void Key_Init(void); uint32_t Key_Scan(bsp_io_port_pin_t key); #endif
(四)系統(tǒng)滴答定時(shí)器部分
bsp_SysTick.c代碼
左右滑動(dòng)查看更多
#include "bsp_SysTick.h" static __IO uint32_t IT_nums; //延時(shí)需要觸發(fā)中斷的次數(shù) static uint32_t IT_Period; //中斷周期(單位為時(shí)鐘節(jié)拍數(shù)) uint32_t Mode_mstick; uint32_t Systick_mstick; /** * @brief 啟動(dòng)系統(tǒng)滴答計(jì)時(shí)器 SysTick * @param IT_frequency: 滴答計(jì)時(shí)器每秒的中斷次數(shù) * @retval 無 */ void SysTick_Init(uint32_t IT_frequency) { /* SystemFrequency在這里默認(rèn)為200M * SystemFrequency / 1000 1ms中斷一次 * SystemFrequency / 100000 10us中斷一次 * SystemFrequency / 1000000 1us中斷一次 */ IT_Period = SystemCoreClock / IT_frequency;//個(gè)人理解:設(shè)置分頻 uint32_t err = SysTick_Config (IT_Period);//把分頻設(shè)置進(jìn)系統(tǒng) assert(err==0); //capture error } /** * @brief 延時(shí)程序 * @param delay: 延時(shí)的單位時(shí)間 * @param unit: 延時(shí)的單位 * @retval 無 */ void SysTick_Delay(uint32_t delay, sys_delay_units_t unit) { uint32_t SumTime = delay * unit; //計(jì)算總延時(shí)時(shí)間 (單位為時(shí)鐘節(jié)拍數(shù)) IT_nums = SumTime/IT_Period;//計(jì)算次數(shù),比如1ms一次中斷,設(shè)置1000,就是1s while (IT_nums != 0);//中斷進(jìn)去一次-一次,直到為0跳出 } /** * @brief SysTick的中斷服務(wù)函數(shù) * @param 無 * @retval 無 * @attention 用e2 studio編譯會(huì)出現(xiàn)警告,但是沒有影響,不需要管 */ void SysTick_Handler(void) { Systick_mstick++; } /*********************************************END OF FILE**********************/
bsp_Systick.h代碼
左右滑動(dòng)查看更多
#ifndef _BSP_SYSTICK_H #define _BSP_SYSTICK_H #include "hal_data.h" typedef enum { SYS_DELAY_UNITS_SECONDS = 200000000, ///< Requested delay amount is in seconds ? ?SYS_DELAY_UNITS_MILLISECONDS = 200000, ? ?///< Requested delay amount is in milliseconds ? ?SYS_DELAY_UNITS_MICROSECONDS = 200 ? ? ? ?///< Requested delay amount is in microseconds } sys_delay_units_t; void SysTick_Init(uint32_t IT_frequency); void SysTick_Delay(uint32_t delay, sys_delay_units_t unit); #endif
(五)煙霧傳感器部分
bsp_sensor.c代碼
左右滑動(dòng)查看更多
#include "bsp_sensor.h" void Eensor_Init(void) { //調(diào)用 R_IOPORT_Open 函數(shù)來初始化 IOPORT 模塊 R_IOPORT_Open (&g_ioport_ctrl, g_ioport.p_cfg); }
bsp_sensor.h代碼
左右滑動(dòng)查看更多
#ifndef _BSP_SENSOR_H #define _BSP_SENSOR_H #include "hal_data.h" #define Fan_PIN BSP_IO_PORT_02_PIN_00 #define FAN_ON R_IOPORT_PinWrite(&g_ioport_ctrl,BSP_IO_PORT_05_PIN_00,BSP_IO_LEVEL_HIGH); #define FAN_OFF R_IOPORT_PinWrite(&g_ioport_ctrl,BSP_IO_PORT_05_PIN_00,BSP_IO_LEVEL_LOW); extern uint32_t Mode_mstick; extern uint32_t Systick_mstick; void Eensor_Init(void); #endif
(六)主函數(shù)部分
其余部分均為默認(rèn)程序,在這里不進(jìn)行展示。至此,硬件和軟件部分均介紹完成。
左右滑動(dòng)查看更多
#include "hal_data.h" #include "led/bsp_led.h" #include "key/bsp_key.h" #include "SysTick/bsp_SysTick.h" #include "sensor/bsp_sensor.h" FSP_CPP_HEADER void R_BSP_WarmStart(bsp_warm_start_event_t event); FSP_CPP_FOOTER void Fan_Proc(void);//系統(tǒng)運(yùn)行函數(shù) bsp_io_level_t Fan_flag;//風(fēng)扇開啟變量,0-關(guān)閉,1-打開 uint8_t Work_Mode = 0;//工作模式 0-手動(dòng)模式 1-煙霧傳感器模式 /*******************************************************************************************************************//** * main() is generated by the RA Configuration editor and is used to generate threads if an RTOS is used. This function * is called by main() when no RTOS is used. **********************************************************************************************************************/ void hal_entry(void) { /* TODO: add your own code here */ Led_init();//LED燈初始化 Key_Init();//按鍵初始化 Eensor_Init();//傳感器初始化 SysTick_Init(1000);//滴答定時(shí)器1ms while(1){ Fan_Proc(); } #if BSP_TZ_SECURE_BUILD /* Enter non-secure code */ R_BSP_NonSecureEnter(); #endif } void Fan_Proc(void) { if(Systick_mstick-Mode_mstick <= 50)return; ? ? ? ? ? ? ? ?Mode_mstick = Systick_mstick; ? ? ? ? ? ? ? ?if( Key_Scan(KEY1_SW2_PIN) == KEY_ON && Work_Mode == 0) //掃描按鍵1 ? ? ? ?{ ? ? ? ? ? ? ? ?LED1_TOGGLE; //翻轉(zhuǎn) LED1 狀態(tài) ? ? ? ? ? ? ? ?FAN_TOGGLE; //開啟風(fēng)扇 ? ? ? ?} ? ? ? ?if( Key_Scan(KEY2_SW3_PIN) == KEY_ON ) //掃描按鍵2 ? ? ? ?{ ? ? ? ? ? ? ? ?LED3_TOGGLE; //翻轉(zhuǎn) LED3 狀態(tài) ? ? ? ? ? ? ? ?Work_Mode ^= 1;//反轉(zhuǎn)模式 ? ? ? ?} ? ? ? ?if(Work_Mode == 1) ? ? ? ?{ ? ? ? ? ? ? ? ?R_IOPORT_PinRead(&g_ioport_ctrl, Fan_PIN, &Fan_flag); ? ? ? ? ? ? ? ?if(Fan_flag == BSP_IO_LEVEL_LOW) ? ? ? ? ? ? ? ?{ ? ? ? ? ? ? ? ? ? ? ? ?LED2_ON; //打開 ? ? ? ? ? ? ? ? ? ? ? ?FAN_ON;//風(fēng)扇開啟 ? ? ? ? ? ? ? ?} ? ? ? ? ? ? ? ?else if(Fan_flag == BSP_IO_LEVEL_HIGH) ? ? ? ? ? ? ? ?{ ? ? ? ? ? ? ? ? ? ? ? ?LED2_OFF; //關(guān)閉 ? ? ? ? ? ? ? ? ? ? ? ?FAN_OFF;//風(fēng)扇關(guān)閉 ? ? ? ? ? ? ? ?} ? ? ? ?} }
六、總結(jié)
此次項(xiàng)目由于時(shí)間緊迫,整體設(shè)計(jì)較為簡(jiǎn)單,主要原因是由于本人前期一直在準(zhǔn)備電子設(shè)計(jì)競(jìng)賽,直到14號(hào)綜測(cè)結(jié)束才開始學(xué)習(xí)瑞薩啟明RA6M5開發(fā)板,在學(xué)習(xí)野火瑞薩開發(fā)板中,我領(lǐng)略到了不同于意法半導(dǎo)體系列開發(fā)板的魅力。我認(rèn)為瑞薩半導(dǎo)體是一個(gè)非常值得學(xué)習(xí)的芯片系列,其圖形化配置有良好的生態(tài),在學(xué)習(xí)野火編寫的教學(xué)文檔中也受益匪淺。在此,再次感謝野火舉辦創(chuàng)意氛圍賽,讓我有機(jī)會(huì)接觸瑞薩開發(fā)板。如果有機(jī)會(huì)參與下一期創(chuàng)意氛圍賽,我會(huì)努力創(chuàng)造更有特色的產(chǎn)品。
-
繼電器
+關(guān)注
關(guān)注
132文章
5354瀏覽量
149130 -
單片機(jī)
+關(guān)注
關(guān)注
6037文章
44569瀏覽量
636187 -
mcu
+關(guān)注
關(guān)注
146文章
17172瀏覽量
351574 -
瑞薩
+關(guān)注
關(guān)注
35文章
22309瀏覽量
86419 -
開發(fā)板
+關(guān)注
關(guān)注
25文章
5074瀏覽量
97661
原文標(biāo)題:【瑞薩RA MCU創(chuàng)意氛圍賽作品賞析】項(xiàng)目12——智能煙霧感應(yīng)吸除系統(tǒng)
文章出處:【微信號(hào):瑞薩MCU小百科,微信公眾號(hào):瑞薩MCU小百科】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論