一个基于STM32实现的多组分气体分析仪项目
本篇將簡要的總結一下一個基于STM32F412ZG實現的多組分氣體分析儀的項目。簡要描述該項目的軟硬件設計及其驗證。
一、項目概述
多組分氣體分析儀是我公司近期研發的三個主要產品之一。采用模塊化設計,可增減配置,可分析混合氣體中的氧氣、氫氣、甲烷、丙烷等氣體的組分。氧氣可以采用順磁氧傳感器、電化學氧傳感器兩種;氫氣傳感器可采用熱式氫氣傳感器;炭氫傳感器采用遠紅外氣體傳感,可探測甲烷和丙烷。氣體組分的分析要求能夠快速反應,運行穩定,對硬件的要求比較高。
二、硬件設計
在硬件方面充分考慮系統應用的需求,AD采集、DA輸出、DI輸入、DO輸出以及通訊等。
通訊部分主要包括串口通訊與以太網通訊。以太網的通訊采用W5500以太網控制器與MCU通過SPI總線通訊,在本項目中使用SPI2來實現通訊,以太網通訊部分的硬件設計如下:
串口通訊主要對象有兩個,遠紅外炭氫傳感器和顯示屏。遠紅外炭氫傳感器采用單總線串行通訊,TTL電平。兩路接口,通常一用一備,在需要時也可接兩臺傳感器,如一臺甲烷一臺丙烷。硬件接口的設計如下:
對于顯示屏其通訊接口采用RS485或者RS232。主要是因為面向不同的應用場合,在需要大顯示屏的時候選擇的是RS485接口,在普通小顯示屏是使用的是RS232接口。但這兩個屏不會同時使用所以采用一個USART口,實際使用的USART2通訊口,是使用RS232還RS485選擇焊接不同的器件。硬件部分的設計如下圖所示:
模擬量輸入輸出采用SPI接口與AD7705和AD5663來完成,模擬量輸入輸出個兩路。模擬量輸入主要用于采集氫氣組分數據和氧氣組分數據。氫氣傳感器采用熱式原理輸出0-5VDC的信號。氧氣傳感器有兩種:順磁傳感器和電化學傳感器,順磁傳感器輸出4-20mA電流信號,電化學傳感器輸出0-2.5VDC的信號,兩者不同時采用,所以采用同一路AI通道,根據不同的傳感器焊接不同的器件。贏家設計如下:
模擬量輸出也是兩路,通過SPI總線與MCU通訊。每路均能輸出0-5VDC信號。這部分硬件設計比較簡單:
數字量輸入輸出主要用于小型真空泵和電磁閥的控制以及按鈕和狀態信息的輸入,硬件電路比較簡單:
還有其他部分的硬件設計,相對比較平常就不在此討論了。
三、軟件調試
軟件的開發環境采用IAR EWARM和STM32CubeMX,在STM32CubeMX完成基本配置并生成項目,再在IAR EWARM開發應用并調試。基本的開發調試就不討論了,主要說一說數字量輸入輸出,模擬量輸入輸出、串口通訊以及以太網通訊幾個方面的應用開發和調試。
為了讓軟件更好地適應更換傳感器和應用不同場合的功能增減要求,我們在設計軟件時使用了一個配置文件來配置更能的使用和增減。這個配置文件就是一個頭文件,定義了一些宏來控制條件編譯,節選部分配置文件如下:
/*多組分氣體分析儀應用版本定義:——0,用于標準的多組分氣體分析儀,版本號VA1.0.1;——1,用于標準的多組分氣體分析儀,版本號VA2.0.1;——2,用于標準的多組分氣體分析儀,版本號VA3.0.1;——3,用于便攜式氣體分析儀,版本號V1.0.1C;——4,B版應用板,版本號V1.0.1B;*/ #ifndef MFC_MasterBoard_VERSION #define MFC_MasterBoard_VERSION (0) #endif/*定義擴展功能的使能,一次只能使能一項*/ //#define EXT_Ethernet_ENABLE???? //擴展以太網通訊 //#define EXT_CAN_ENABLE????????? //擴展CAN總線通訊/*定義片上Flash存取使能*/ #ifndef STORAGE_ENABLE #define STORAGE_ENABLE (1) #endif/*全局變量定義*/ #include "globalvariable.h" /*顯示屏控制*/ #include "lcdcommunication.h" /*數字邏輯處理*/ #include "logicprocess.h" /*模擬量輸入輸出處理*/ #include "addaprocess.h" /*以太網通訊處理*/ #include "ethernetprocess.h" /*紅外炭氫傳感器*/ #include "ndirdataprocess.h"/*片上Flash參數存取操作*/ #if STORAGE_ENABLE > (1) #include "storeprocess.h" #endif/*調試功能*/ #include "CommonConfig.h"關于模擬量輸入輸出、串口通訊以及以太網通訊幾個方面軟件的設計及調試在前面的文章中都已經較少的比較清楚了,只有數字量輸入輸出沒有涉及到,在總結這一篇文章中我們在軟件的設計和調試上主要說說數字量的處理。在多組分氣體成分分析儀中總共有5個DI輸入和5個DO輸出。這10個引腳的GPIO配置如下:
/*Configure GPIO pins : DI1_Pin DI2_Pin DI3_Pin DI4_PinDI5_Pin */GPIO_InitStruct.Pin = DI1_Pin|DI2_Pin|DI3_Pin|DI4_Pin|DI5_Pin;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_NOPULL;HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);/*Configure GPIO pins : DO1_Pin DO2_Pin DO3_Pin DO4_PinDO5_Pin */GPIO_InitStruct.Pin = DO1_Pin|DO2_Pin|DO3_Pin|DO4_Pin|DO5_Pin;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);/*Configure GPIO pin Output Level */HAL_GPIO_WritePin(GPIOD, DO1_Pin|DO2_Pin|DO3_Pin|DO4_Pin|DO5_Pin, GPIO_PIN_RESET);對于DI、DO的操作我們采用定義操作函數來實現對單個通道和全部通道的操作。我們首先定義兩個枚舉類型分別定義如下:
//定義數字量輸出通道枚舉類型,規定通道的范圍 typedef enum {DOChannel1,DOChannel2,DOChannel3,DOChannel4,DOChannel5,DOChannelNum } DigitalOutput;//定義數字量輸入通道枚舉類型,規定通道的范圍 typedef enum {DIChannel1,DIChannel2,DIChannel3,DIChannel4,DIChannel5,DIChannelNum } DigitalInput;數字量輸入輸出的枚舉主要是為了方便操作和識別,通道數量出現變化時只需要增加枚舉兩種的通道定義即可。此處數字量輸入輸出均定義了5個通道。枚舉量的最后一個成員代表了通道的數量,在枚舉全部通道時能夠很好的避免超出范圍的錯誤。
同時還要定義如下的結構體,用于定義需要操作GPIO目標。
//定義用于針腳操作的目標針腳類型 typedef struct{GPIO_TypeDef* GPIOx;uint16_t GPIO_Pin; }TargetPin;有了上述的定義則可以實現前面設想的操作了,接下來我們還需要定義兩個數字量輸入輸出通道的TargetPin類型的數組,用于存放想要操作的目標通道,和前面枚舉兩種定義的通道一致,此處也是5個通道。
//定義DI通道的全部目標針腳數組 TargetPin diPin[]={{GPIOE,GPIO_Pin_2},{GPIOE,GPIO_Pin_3},{GPIOE,GPIO_Pin_4},{GPIOE,GPIO_Pin_5},{GPIOE,GPIO_Pin_6}}; //定義DO通道的全部目標針腳數組 TargetPin doPin[]={{GPIOD,GPIO_Pin_3},{GPIOD,GPIO_Pin_4},{GPIOD,GPIO_Pin_5},{GPIOD,GPIO_Pin_6},{GPIOD,GPIO_Pin_7}};有了以上2個數組就可以在避免在操作過程中大量使用條件分支語句(Switch或if語句),簡化編碼和避免在增加通道時還要修改函數的情況。現在如果通道數量出現變化則只需要修改枚舉量和數組的值就可。或者操作的管腳出現變化則只需要修改數組的值就可以了。而不需要去修改函數體,而且函數體的編碼也非常簡單。
對數字量輸出的操作如下,在操作全部通道時,以枚舉變量作為循環變量,以枚舉的最后定義的數量來控制,并以枚舉量的取值作為數組下標,有效避免出現超出范圍的錯誤,同時在通道數量和通道對應的具體針腳發生變化時,無需修改函數。
//操作全部繼電器DO通道 //輸入參數TargetPin *doPin為要操作的DO通道列表 //輸入參數BOOL *commands欲寫給DO通道的值列表 void OperationAllRelayChannel(TargetPin *doPin,BOOL *commands) {DigitalOutput DOChannel;for(DOChannel=DOChannel1;DOChannel<DOChannelNum;DOChannel++){OperationSingleRelayChannel(doPin[DOChannel],commands[DOChannel]);} }//操作單個繼電器DO通道 //輸入參數TargetPin doPin為要操作的DO通道 //輸入參數BOOL command欲寫給DO通道的值 void OperationSingleRelayChannel(TargetPin doPin,BOOL command) {HAL_GPIO_WritePin(doPin.GPIOx,doPin.GPIO_Pin,command); }對數字量輸入的操作函數的編寫采用與數字量輸出相同的思路。對于枚舉之所以可以用作數組下標,是因為枚舉沒被指定值時,總是從0開始向上累加,正好與數組下標是一致的。這要做還有一個好處是,通道與具體的GPIO引腳是由TargetPin數組的賦值順序決定的,修改非常方便。
//獲取全部DI量狀態輸入值 //輸入參數TargetPin *diPin為需要讀取的DI通道列表 //輸入參數BOOL *result為讀取的通道值返回列表 void GetAllDIStatusInput(TargetPin *diPin,BOOL *result) {DigitalInput DIChannel;for(DIChannel=DIChannel1;DIChannel<DIChannelNum;DIChannel++){result[DIChannel]=GetSingleDIStatusInput(diPin[DIChannel]);} }//獲取單個DI量狀態輸入值 //輸入參數TargetPin diPin是需要讀取的DI通道 //返回值為讀取的通道值 BOOL GetSingleDIStatusInput(TargetPin diPin) {uint8_t readValue;readValue = GPIO_ReadInputDataBit(diPin.GPIOx,diPin.GPIO_Pin);return (readValue>0)?True:False; }最后來一張調試數字量輸入輸出的截圖:
多組分氣體成分分析儀項目軟件其他部分的設計與調試也已經過驗證,在此就不多說了。
四、結果驗證
最后我們來簡要說明一下多組分氣體分析儀的設計驗證。我們對最終的產品進行的軟硬件測試,現將部分過程及結果展示如下,首先來一張調試模擬量數據采集的圖片:
再來看一張顯示界面中顯示組分數據的截圖:
接下來再來一張顯示屏顯示參數設定和操作的界面:
最后展示一張與上位機實現Modbus TCP通訊的截圖。
本篇簡單的總結了基于STM32F412ZG實現的多組分氣體分析儀的設計、實現與驗證,總結項目的目的也是為了更好的改進項目。
歡迎關注:
?
總結
以上是生活随笔為你收集整理的一个基于STM32实现的多组分气体分析仪项目的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Modbus协议栈开发笔记之八:Modb
- 下一篇: 区块链读书笔记四