全网仅此一篇:工业级压力传感器设计及实现(华大半导体HC32L136)
目錄
1、項(xiàng)目概述
2、模組簡介
2.1、NSA2862物聯(lián)網(wǎng)專用橋式傳感器調(diào)理芯片
2.2、Metallux ME501/ME505陶瓷壓力傳感器
3、驅(qū)動原理
4、項(xiàng)目實(shí)現(xiàn)
近期基于Metallux ME501/ME505陶瓷壓力傳感器模組和NSA2862物聯(lián)網(wǎng)調(diào)理芯片設(shè)計(jì)一款工業(yè)級壓力傳感器,并使用華大半導(dǎo)體HC32L136 MCU實(shí)現(xiàn)控制,特將項(xiàng)目心得與體會分享給各位朋友,目前全網(wǎng)僅此一篇,請多多支持~
1、項(xiàng)目概述
本項(xiàng)目傳感器基于Metallux ME501/ME505陶瓷壓力傳感器模組和納芯微NSA2862物聯(lián)網(wǎng)調(diào)理芯片,微控制器基于華大半導(dǎo)體HC32L136,在保證高性能的前提下,支持待機(jī)與休眠喚醒,具備超低的功耗,可連續(xù)工作10年而無需更換電池,可大規(guī)模應(yīng)用在智慧城市、工業(yè)物聯(lián)網(wǎng)等領(lǐng)域。
項(xiàng)目的測量、校準(zhǔn)、評估和設(shè)計(jì)這里參照于納芯微電子傳感器解決方案實(shí)現(xiàn),沒辦法,工業(yè)級傳感器設(shè)計(jì)就是燒錢啊。
2、模組簡介
2.1、NSA2862物聯(lián)網(wǎng)專用橋式傳感器調(diào)理芯片
NSA2862是一顆專門針對物聯(lián)網(wǎng)應(yīng)用推出的用于阻式或者電壓型傳感器,例如阻式壓力傳感器,熱電偶,RTD等傳感器的超低功耗信號調(diào)理專用芯片。NSA2862集成了24位主信號測量通道和24位輔助溫度測量通道,傳感器校準(zhǔn)邏輯,雙路恒流源等電路,支持I2C、SPI或者OWI輸出。通過內(nèi)置的MCU,NSA2862支持對傳感器的零點(diǎn),靈敏度的二階溫度漂移校準(zhǔn)以及最高三階的非線性校準(zhǔn),校準(zhǔn)精度可以達(dá)到0.1%以內(nèi),其校準(zhǔn)系數(shù)存儲于一組EEPROM中,芯片結(jié)構(gòu)如下所示:
參數(shù)特性所示所示:
- 超低待機(jī)功耗:<100nA
- 低溫漂內(nèi)置參考電壓
- 高精度 1X~256X增益可變儀表放大器
- 24位 ADC用于主信號測量
- 24位 ADC用于溫度測量
- 支持內(nèi)置溫度傳感器和外部溫度傳感器
- 雙路恒流源輸出
- 1X~8X ADC數(shù)字增益
- 多種 ODR 設(shè)置,支持 50/60Hz 工頻抑制
- 基于內(nèi)置 MCU的通用傳感器校準(zhǔn)邏輯
- EEPROM,可多次編程
- 支持 SPI和 I2C及OWI接口
- 封裝:TSSOP20
- 工作溫度范圍:-40℃~105℃
芯片功能框圖如下圖所示:
2.2、Metallux ME501/ME505陶瓷壓力傳感器
?壓力傳感器一般用于對傳感器敏感器件所處氣體或液體氛圍的壓力測量,一般用于反饋給系統(tǒng)主控單元,實(shí)現(xiàn)系統(tǒng)精確控制。壓力傳感器作為傳感器中的一大門類,在汽車、工業(yè)、家電、消費(fèi)電子等不同行業(yè)均有廣泛的應(yīng)用。常用壓力傳感器從感測原理來區(qū)分,主要包括如下幾大類:
- 硅壓阻技術(shù)
- 陶瓷電阻技術(shù)
- 玻璃微熔技術(shù)
- 陶瓷電容技術(shù)
硅壓阻技術(shù)由半導(dǎo)體的壓阻特性來實(shí)現(xiàn),半導(dǎo)體材料的壓阻特性取決于材料種類、摻雜濃度和晶體的晶向等因素。該技術(shù)可以采用半導(dǎo)體工藝實(shí)現(xiàn),具有尺寸小,產(chǎn)量高、成本低、信號輸出靈敏度高等優(yōu)勢。不足之處主要體現(xiàn)在介質(zhì)耐受程度低,溫度特性差和長期穩(wěn)定性較差等方面。常見于中低壓量程范圍,如5kPa~700kPa。業(yè)界也有通過特殊封裝工藝提高硅壓阻技術(shù)的介質(zhì)耐受程度的方案,如充油、背壓等技術(shù),但也會帶來成本大幅增加等問題。
陶瓷電阻技術(shù)采用厚膜印刷工藝將惠斯通電橋印刷在陶瓷結(jié)構(gòu)的表面,利用壓敏電阻效應(yīng),實(shí)現(xiàn)將介質(zhì)的壓力信號轉(zhuǎn)換為電壓信號。陶瓷電阻技術(shù)具有成本適中,工藝簡單等優(yōu)勢,目前國內(nèi)有較多廠家提供陶瓷電阻壓力傳感器芯體。但該技術(shù)信號輸出靈敏度低,量程一般限定在500kPa~10MPa,且常規(guī)中空結(jié)構(gòu),僅靠膜片承壓,抗過載能力差,當(dāng)待測介質(zhì)壓力過載時,陶瓷電阻傳感器會存在膜片破裂,介質(zhì)泄露的風(fēng)險。
玻璃微熔技術(shù)采用高溫?zé)Y(jié)工藝,將硅應(yīng)變計(jì)與不銹鋼結(jié)構(gòu)結(jié)合。硅應(yīng)變計(jì)等效的四個電阻組成惠斯通電橋,當(dāng)不銹鋼膜片的另一側(cè)有介質(zhì)壓力時,不銹鋼膜片產(chǎn)生微小形變引起電橋變化,形成正比于壓力變化的電壓信號。玻璃微熔工藝實(shí)現(xiàn)難度較大,成本高。主要優(yōu)勢是介質(zhì)耐受性好,抗過載能力強(qiáng),一般適用于高壓和超高壓量程,如10MPa~200MPa,應(yīng)用較為受限。
陶瓷電容技術(shù)采用固定式陶瓷基座和可動陶瓷膜片結(jié)構(gòu),可動膜片通過玻璃漿料等方式與基座密封固定在一起。兩者之間內(nèi)側(cè)印刷電極圖形,從而形成一個可變電容,當(dāng)膜片上所承受的介質(zhì)壓力變化時兩者之間的電容量隨之發(fā)生變化,通過調(diào)理芯片將該信號進(jìn)行轉(zhuǎn)換調(diào)理后輸出給后級使用。陶瓷電容技術(shù)具有成本適中,量程范圍寬,溫度特性好、一致性、長期穩(wěn)定性好等優(yōu)勢。國際上來看廣泛應(yīng)用于汽車與工業(yè)過程控制等領(lǐng)域,分別以美國森薩塔和瑞士E+H為代表。由于電容信號不同于電阻信號,對信號處理電路要求較高,傳感器設(shè)計(jì)時需要將電容和信號調(diào)理芯片ASIC協(xié)同考慮,國內(nèi)目前僅蘇州納芯微電子股份有限公司能夠同時提供兩者整合的完整解決方案。
陶瓷電容作為壓力傳感器中一種主要技術(shù)路線,主要由瓷環(huán)、陶瓷膜片和陶瓷蓋板三部分組成,具有耐腐蝕、抗沖擊、介質(zhì)兼容性好的優(yōu)點(diǎn)。Metallux ME501/ME505傳感器工作原理是陶瓷電阻技術(shù),其由激光可調(diào)PTC電阻進(jìn)行熱補(bǔ)償,陶瓷的使用確保了整個測量范圍內(nèi)的高線性度,將遲滯效應(yīng)降到最低,傳感器結(jié)構(gòu)如下所示:
?傳感器技術(shù)特性如下表所示:
3、驅(qū)動原理
本項(xiàng)目中微控制器華大半導(dǎo)體HC32L136驅(qū)動NSA2862傳感器調(diào)理芯片基于I2C通信協(xié)議,I2C 是雙線雙向的同步串行總線,它利用一根時鐘線和一根數(shù)據(jù)線在連接總線的兩個器件之間進(jìn)行信息的傳遞,為設(shè)備之間數(shù)據(jù)交換提供了一種簡單高效的方法。每個連接到總線上的器件都有唯一的地址,任何器件既可以作為主機(jī)也可以作為從機(jī),但同一時刻只允許有一個主機(jī)。I2C 標(biāo)準(zhǔn)是一個具有沖突檢測機(jī)制和仲裁機(jī)制的真正意義上的多主機(jī)總線,它能在多個主機(jī)同時請求控制總線時利用仲裁機(jī)制避免數(shù)據(jù)沖突并保護(hù)數(shù)據(jù)。I2C 總線控制器,能滿足 I2C 總線的各種規(guī)格并支持所有與 I2C 總線通信的傳輸模式。
通常標(biāo)準(zhǔn) I2C 傳輸協(xié)議包含四個部分:起始(S)或重復(fù)起始信號(Sr),從機(jī)地址及讀寫位,傳輸數(shù)據(jù),停止信號(P)。I2C 傳輸協(xié)議圖如下所示:
當(dāng)總線處于空閑狀態(tài)下(SCL 和 SDA 線同時為高),SDA 線上出現(xiàn)由高到低的信號,表明總線上產(chǎn)生了起始信號。當(dāng)兩個起始信號之間沒有停止信號時,即產(chǎn)生了重復(fù)起始信號。主機(jī)采用這種方法與另一個從機(jī)或相同的從機(jī)以不同傳輸方向進(jìn)行通信(例如:從寫入設(shè)備到從設(shè)備讀出)而不釋放總線。當(dāng) SCL 線為高時,SDA 線上出現(xiàn)由低到高的信號,被定義為停止信號。主機(jī)向總線發(fā)出停止信號結(jié)束數(shù)據(jù)傳送。?START和STOP 條件圖如下所示:
當(dāng)起始信號產(chǎn)生后,主機(jī)立即傳輸數(shù)據(jù)的第一字節(jié):7 位從機(jī)地址 + 讀寫位,讀寫位控制從機(jī)的數(shù)據(jù)傳輸方向(0:寫;1:讀)。被主機(jī)尋址的從機(jī)會通過在第 9 個 SCL時鐘周期將 SDA 置為低電平作為應(yīng)答。
?數(shù)據(jù)傳輸過程中,一個 SCL 時鐘脈沖傳輸一個數(shù)據(jù)位,且 SDA 線只有在 SCL 為低時才可以改變。I2C 總線上位傳輸圖如下所示:
華大半導(dǎo)體I2C 組件可實(shí)現(xiàn) 8 位的雙向數(shù)據(jù)傳輸,傳輸速率在標(biāo)準(zhǔn)模式下可達(dá)到 100Kbps 而在高速模式下可達(dá) 400Kbps,在超高速模式下可達(dá) 1Mbps,并且可以在四種模式下工作:主機(jī)發(fā)送模式、主機(jī)接收模式、從機(jī)接收模式、從機(jī)發(fā)送模式。 還有一種特殊模式廣播呼叫模式,其操作方式與從機(jī)接收模式類似。
華大半導(dǎo)體HC32L136 I2C 控制器支持以下特性:
- 支持主機(jī)發(fā)送/接收,從機(jī)發(fā)送/接收四種工作模式
- 支持標(biāo)準(zhǔn)(100Kbps) / 快速(400Kbps) / 高速(1Mbps) 三種工作速率
- 支持 7 位尋址功能
- 支持噪聲過濾功能
- 支持廣播地址
- 支持中斷狀態(tài)查詢功能
I2C功能模塊如下圖所示:
本項(xiàng)目中采用主機(jī)模式實(shí)現(xiàn)數(shù)據(jù)收、發(fā)通信,主收、發(fā)送模式數(shù)據(jù)同步圖如下圖所示(更詳細(xì)說明可參見用戶手冊):
4、項(xiàng)目實(shí)現(xiàn)
第1步:明確從機(jī)地址(壓力傳感器地址),NSA2862 的 I2C 設(shè)備地址如下表所示:
第2步:配置HC32L136 I2C功能模塊,這里需要留意NSA2862 的 I2C通訊引腳的電性特性,如下表所示:
I2C GPIO配置代碼如下所示:?
///< IO端口配置
void App_PortCfg(void)
{stc_gpio_cfg_t stcGpioCfg;DDL_ZERO_STRUCT(stcGpioCfg);Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE); //開啟GPIO時鐘門控 stcGpioCfg.enDir = GpioDirOut; ///< 端口方向配置->輸出 stcGpioCfg.enOD = GpioOdEnable; ///< 開漏輸出stcGpioCfg.enPu = GpioPuEnable; ///< 端口上拉配置->使能stcGpioCfg.enPd = GpioPdDisable; ///< 端口下拉配置->禁止Gpio_Init(GpioPortB,GpioPin8,&stcGpioCfg); ///< 端口初始化Gpio_Init(GpioPortB,GpioPin9,&stcGpioCfg);Gpio_SetAfMode(GpioPortB,GpioPin8,GpioAf1); ///< 配置PB08為SCLGpio_SetAfMode(GpioPortB,GpioPin9,GpioAf1); ///< 配置PB09為SDA
}
I2C配置代碼如下所示:
///< I2C 模塊配置
void App_I2cCfg(void)
{stc_i2c_cfg_t stcI2cCfg;DDL_ZERO_STRUCT(stcI2cCfg); ///< 初始化結(jié)構(gòu)體變量的值為0Sysctrl_SetPeripheralGate(SysctrlPeripheralI2c0,TRUE); ///< 開啟I2C0時鐘門控stcI2cCfg.u32Pclk = Sysctrl_GetPClkFreq(); ///< 獲取PCLK時鐘stcI2cCfg.u32Baud = 100000; ///< 100KstcI2cCfg.enMode = I2cMasterMode; ///< 主機(jī)模式stcI2cCfg.bGc = FALSE; ///< 廣播地址應(yīng)答使能關(guān)閉I2C_Init(M0P_I2C0,&stcI2cCfg); ///< 模塊初始化
}
?第3步:編寫接收驅(qū)動函數(shù),主機(jī)接收狀態(tài)圖如下所示:
接收驅(qū)動代碼如下所示:?
/********************************************************************************** \brief 主機(jī)接收函數(shù)**** \param u8Addr從機(jī)內(nèi)存地址,pu8Data讀數(shù)據(jù)存放緩存,u32Len讀數(shù)據(jù)長度**** \retval 讀數(shù)據(jù)是否成功********************************************************************************/en_result_t I2C_MasterReadData(M0P_I2C_TypeDef* I2CX,uint8_t u8Addr,uint8_t *pu8Data,uint32_t u32Len)
{en_result_t enRet = Error;uint8_t u8i=0,u8State;I2C_SetFunc(I2CX,I2cStart_En);while(1){while(0 == I2C_GetIrq(I2CX)){}u8State = I2C_GetState(I2CX);switch(u8State){case 0x08: ///< 已發(fā)送起始條件,將發(fā)送SLA+WI2C_ClearFunc(I2CX,I2cStart_En);I2C_WriteByte(I2CX,I2C_SLAVEADDR);break;case 0x18: ///< 已發(fā)送SLA+W,并接收到ACKI2C_WriteByte(I2CX,u8Addr); ///< 發(fā)送從機(jī)內(nèi)存地址break;case 0x28: ///< 已發(fā)送數(shù)據(jù),接收到ACK, 此處是已發(fā)送從機(jī)內(nèi)存地址u8Addr并接收到ACKI2C_SetFunc(I2CX,I2cStart_En); ///< 發(fā)送重復(fù)起始條件break;case 0x10: ///< 已發(fā)送重復(fù)起始條件I2C_ClearFunc(I2CX,I2cStart_En);I2C_WriteByte(I2CX,I2C_SLAVEADDR|0x01);///< 發(fā)送SLA+R,開始從從機(jī)讀取數(shù)據(jù)break;case 0x40: ///< 已發(fā)送SLA+R,并接收到ACKif(u32Len>1){I2C_SetFunc(I2CX,I2cAck_En); ///< 使能主機(jī)應(yīng)答功能}break;case 0x50: ///< 已接收數(shù)據(jù)字節(jié),并已返回ACK信號pu8Data[u8i++] = I2C_ReadByte(I2CX);if(u8i==u32Len-1){I2C_ClearFunc(I2CX,I2cAck_En); ///< 已接收到倒數(shù)第二個字節(jié),關(guān)閉ACK應(yīng)答功能}break;case 0x58: ///< 已接收到最后一個數(shù)據(jù),NACK已返回pu8Data[u8i++] = I2C_ReadByte(I2CX);I2C_SetFunc(I2CX,I2cStop_En); ///< 發(fā)送停止條件break;case 0x38: ///< 在發(fā)送地址或數(shù)據(jù)時,仲裁丟失I2C_SetFunc(I2CX,I2cStart_En); ///< 當(dāng)總線空閑時發(fā)起起始條件break;case 0x48: ///< 發(fā)送SLA+R后,收到一個NACKI2C_SetFunc(I2CX,I2cStop_En); ///< 發(fā)送停止條件I2C_SetFunc(I2CX,I2cStart_En); ///< 發(fā)送起始條件break;default:I2C_SetFunc(I2CX,I2cStart_En); ///< 其他錯誤狀態(tài),重新發(fā)送起始條件break;}I2C_ClearIrq(I2CX); ///< 清除中斷狀態(tài)標(biāo)志位if(u8i==u32Len) ///< 數(shù)據(jù)全部讀取完成,跳出while循環(huán){break;}}enRet = Ok;return enRet;
}
?第4步:編寫發(fā)送驅(qū)動函數(shù),主機(jī)發(fā)送狀態(tài)圖如下所示:?
發(fā)送驅(qū)動代碼如下所示:??
/********************************************************************************** \brief 主機(jī)發(fā)送函數(shù)**** \param u8Addr從機(jī)內(nèi)存地址,pu8Data寫數(shù)據(jù),u32Len寫數(shù)據(jù)長度**** \retval 寫數(shù)據(jù)是否成功********************************************************************************/
en_result_t I2C_MasterWriteData(M0P_I2C_TypeDef* I2CX,uint8_t u8Addr,uint8_t *pu8Data,uint32_t u32Len)
{en_result_t enRet = Error;uint8_t u8i=0,u8State;I2C_SetFunc(I2CX,I2cStart_En);while(1){while(0 == I2C_GetIrq(I2CX)){;}u8State = I2C_GetState(I2CX);switch(u8State){case 0x08: ///< 已發(fā)送起始條件I2C_ClearFunc(I2CX,I2cStart_En);I2C_WriteByte(I2CX,I2C_SLAVEADDR); ///< 從設(shè)備地址發(fā)送break;case 0x18: ///< 已發(fā)送SLA+W,并接收到ACKI2C_WriteByte(I2CX,u8Addr); ///< 從設(shè)備內(nèi)存地址發(fā)送break;case 0x28: ///< 上一次發(fā)送數(shù)據(jù)后接收到ACKI2C_WriteByte(I2CX,pu8Data[u8i++]); ///< 繼續(xù)發(fā)送數(shù)據(jù)break;case 0x20: ///< 上一次發(fā)送SLA+W后,收到NACKcase 0x38: ///< 上一次在SLA+讀或?qū)憰r丟失仲裁I2C_SetFunc(I2CX,I2cStart_En); ///< 當(dāng)I2C總線空閑時發(fā)送起始條件break;case 0x30: ///< 已發(fā)送I2Cx_DATA中的數(shù)據(jù),收到NACK,將傳輸一個STOP條件I2C_SetFunc(I2CX,I2cStop_En); ///< 發(fā)送停止條件break;default:break;}if(u8i>u32Len){I2C_SetFunc(I2CX,I2cStop_En); ///< 此順序不能調(diào)換,出停止條件I2C_ClearIrq(I2CX);break;}I2C_ClearIrq(I2CX); ///< 清除中斷狀態(tài)標(biāo)志位}enRet = Ok;return enRet;
}
??第5步:為驗(yàn)證I2C通信是否成功,向NSA2862空閑寄存器0XCF中執(zhí)行讀數(shù)據(jù)0X55并讀取出來,空閑寄存器地址如下表所示:
驗(yàn)證示例代碼如下所示:??
uint8_t u8Senddata[2] = {0x00,0x55};
uint8_t u8Recdata[1]={0x00};///< 向I2C總線發(fā)起開始信號
I2C_SetFunc(M0P_I2C1,I2cStart_En);
///< 寫數(shù)據(jù)
I2C_MasterWriteData(M0P_I2C0,0x30,&u8Senddata[0],1);
I2C_MasterWriteData(M0P_I2C0,0xCF,&u8Senddata[1],1);
delay1ms(100);///< 讀數(shù)據(jù)
I2C_MasterReadData(M0P_I2C0,0xCF,u8Recdata,1); ///< 串口打印
for(int i=0;i<1;i++)
{Uart_SendDataIt(M0P_UART1,u8Recdata[i]); //啟動UART1發(fā)送數(shù)據(jù)delay1ms(3);
}
使用示波器查看效果,程序運(yùn)行時鐘信號波形如下所示:
程序運(yùn)行數(shù)據(jù)信號波形如下所示:?
串口輸出效果如下所示:?
說明可以實(shí)現(xiàn)正常的I2C數(shù)據(jù)讀寫。
第6步:讀取壓力傳感器數(shù)值,寄存器地址如下表所示:
讀取傳感器數(shù)值代碼如下所示:
uint8_t u8Senddata[2] = {0x00,0x40};
uint8_t u8Recdata[4]={0x00};///< 向I2C總線發(fā)起開始信號
I2C_SetFunc(M0P_I2C1,I2cStart_En);
///< 寫入寄存器啟動使RAW_P=0
I2C_MasterWriteData(M0P_I2C0,0x30,&u8Senddata[0],1);
I2C_MasterWriteData(M0P_I2C0,0xA5,&u8Senddata[1],1);
delay1ms(100);///< 讀取經(jīng)過校正的傳感器數(shù)據(jù)
I2C_MasterReadData(M0P_I2C0,0x06,u8Recdata,1);
I2C_MasterReadData(M0P_I2C0,0x07,u8Recdata+1,1);
I2C_MasterReadData(M0P_I2C0,0x08,u8Recdata+2,1); for(int i=0;i<3;i++)
{Uart_SendDataIt(M0P_UART1,u8Recdata[i]); //啟動UART1發(fā)送數(shù)據(jù)delay1ms(3);
}
使用示波器查看效果,程序運(yùn)行時鐘信號波形如下所示:
程序運(yùn)行數(shù)據(jù)信號波形如下所示:?
串口輸出效果如下所示:?
數(shù)據(jù)0X014ADD就是校準(zhǔn)后ME501壓力數(shù)值(2的補(bǔ)碼形式)。
總結(jié)
以上是生活随笔為你收集整理的全网仅此一篇:工业级压力传感器设计及实现(华大半导体HC32L136)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 4行Python代码生成图像验证码
- 下一篇: 力扣(LeetCode)刷题,简单题(第