基于澎湃微PT32x033系列的NTC應(yīng)用:血糖儀環(huán)境溫度監(jiān)測(cè)設(shè)計(jì)方案
一、引言
血糖儀作為現(xiàn)代醫(yī)療診斷的重要工具,其準(zhǔn)確性和穩(wěn)定性對(duì)病患的健康管理至關(guān)重要。血糖儀的工作原理是通過電化學(xué)原理,測(cè)試血糖試紙反應(yīng)區(qū)內(nèi)的生化酶與血液中的葡萄糖產(chǎn)生的微電流,再轉(zhuǎn)化成葡萄糖濃度讀數(shù)。這一過程對(duì)于測(cè)試環(huán)境的溫度有著較高的要求,適宜血糖儀運(yùn)作的溫度一般來說在10℃~40℃之間,太冷或者太熱的環(huán)境均會(huì)影響其測(cè)試準(zhǔn)確性。因此,設(shè)計(jì)一個(gè)有效的環(huán)境溫度監(jiān)測(cè)系統(tǒng),對(duì)血糖儀的測(cè)試精度和可靠性具有重大意義。
本文基于澎湃微PT32x033系列MCU,提出了一種基于NTC電阻(負(fù)溫度系數(shù)熱敏電阻)的血糖儀環(huán)境溫度監(jiān)測(cè)設(shè)計(jì)方案。通過詳細(xì)闡述主控芯片的型號(hào)、功能及其在設(shè)計(jì)中的具體作用,旨在為血糖儀的環(huán)境溫度監(jiān)測(cè)提供一種高效、可靠的解決方案。
二、主控芯片型號(hào)及功能
2.1 主控芯片型號(hào)
本方案采用的主控芯片為澎湃微PT32x033系列MCU。該系列MCU以其低功耗和豐富的外設(shè)模塊著稱,特別適用于血糖儀等便攜式醫(yī)療設(shè)備。
具體來說,PT32x033系列MCU包括多個(gè)型號(hào),如PT32L033等。這些型號(hào)在功能和外設(shè)上略有差異,但均具備強(qiáng)大的數(shù)據(jù)處理能力和低功耗特性,能夠滿足血糖儀環(huán)境監(jiān)測(cè)的需求。
2.2 主控芯片功能
PT32x033系列MCU的主要功能包括:
低功耗設(shè)計(jì):
提供正常工作模式和低功耗模式,其中低功耗模式又分為普通休眠低功耗模式和深度休眠低功耗模式。
一顆紐扣電池至少能保障儀器正常工作3年。
可以通過失能未被使用的時(shí)鐘源、外設(shè),以及配置GPIO為輸入同時(shí)做下拉處理等方式進(jìn)一步降低功耗。
高性能外設(shè):
內(nèi)嵌LCD驅(qū)動(dòng)器,支持多種復(fù)用技術(shù),可用于驅(qū)動(dòng)液晶顯示屏。
集成兩路高性能的OPA(運(yùn)算放大器),用于小信號(hào)放大。
集成一路12位的ADC(模數(shù)轉(zhuǎn)換器)和一路12位的DAC(數(shù)模轉(zhuǎn)換器),用于信號(hào)的采集和轉(zhuǎn)換。
實(shí)時(shí)時(shí)鐘(RTC):
提供高精度的實(shí)時(shí)時(shí)鐘功能,可用于記錄血糖測(cè)試的時(shí)間。
靈活的電源管理:
提供多種電源管理策略,包括電源調(diào)整器部分(Power Regulator),用于產(chǎn)生LCD驅(qū)動(dòng)所需的最高直流電平。
豐富的接口:
提供多種通信接口,如UART、SPI、I2C等,便于與其他外設(shè)或上位機(jī)進(jìn)行通信。
三、NTC電阻在血糖儀中的應(yīng)用
3.1 NTC電阻概述
NTC電阻,即負(fù)溫度系數(shù)熱敏電阻,指的是阻值隨溫度上升而呈指數(shù)關(guān)系減小的現(xiàn)象和材料。NTC熱敏電阻一般以錳、鈷、鎳和銅等金屬氧化物為主要材料,采用陶瓷工藝制造而成。這些金屬氧化物在導(dǎo)電方式上完全類似鍺、硅等半導(dǎo)體材料:溫度越低,這些氧化物材料的載流子(電子和空穴)數(shù)目減少,其電阻增大;溫度越高,氧化物材料的載流子數(shù)目增多,其電阻減小。NTC電阻以其成本低、精度高的特性,被越來越廣泛地應(yīng)用在各種場(chǎng)合。
3.2 NTC電阻在血糖儀中的應(yīng)用
血糖儀采用電化學(xué)原理,測(cè)試血糖試紙反應(yīng)區(qū)內(nèi)的生化酶與血液中的葡萄糖產(chǎn)生的微電流,再轉(zhuǎn)化成葡萄糖濃度讀數(shù)。這一過程對(duì)于測(cè)試環(huán)境的溫度有著較高的要求。使用NTC電阻檢測(cè)溫度并對(duì)結(jié)果進(jìn)行溫度補(bǔ)償,可以避免測(cè)試結(jié)果因外界溫度產(chǎn)生偏差,耽誤病患的治療。
四、基于PT32x033的NTC應(yīng)用方案
4.1 NTC電路設(shè)計(jì)
NTC常規(guī)的應(yīng)用是將熱敏電阻和普通電阻器串聯(lián)連接,并施加以恒定電壓VIN,再將端點(diǎn)電壓VNTC接入到ADC中采樣。使用這種電路,熱敏電阻此時(shí)的阻值可以通過相應(yīng)的公式計(jì)算得出。
在血糖儀應(yīng)用中,PT32x033提供了幾種配置策略來提供恒定的電壓源VIN,如通過AVREF+引腳或間接通過DVREF+引腳接入BG2v0作為恒壓源。
4.2 ADC配置與采樣
PT32x033內(nèi)部集成了一個(gè)12bit分辨率的高精度ADC,提供了多個(gè)可選的參考源,如VDDA、BG2V0、AVREF+等。在血糖儀應(yīng)用中,選擇BG2v0以提供成本和精度間的最佳平衡。
ADC的采樣率可支持到500KSPS,能夠滿足血糖儀對(duì)環(huán)境溫度實(shí)時(shí)監(jiān)測(cè)的需求。通過ADC采樣得到的VNTC電壓值,可以進(jìn)一步通過計(jì)算得出NTC電阻的阻值。
4.3 溫度算法實(shí)現(xiàn)
NTC的溫度算法常見的有三種:B值法、查表法和線性擬合法。其中,B值法需要占用較大的計(jì)算資源,但其得出的數(shù)據(jù)準(zhǔn)確度較高。血糖儀Demo板上使用的就是這種方法。
B值法根據(jù)一條公式,僅需要代入NTC電阻值和B值這兩個(gè)變量,即可獲取溫度值。公式中的TN為常量,表示25℃的開爾文溫度單位(298.15K),B為變量,指NTC電阻的B值。血糖儀Demo板上使用的NTC電阻B值為3380。
通過PT32x033的MCU內(nèi)部處理器,可以實(shí)時(shí)計(jì)算并得出環(huán)境溫度值,從而實(shí)現(xiàn)對(duì)血糖儀測(cè)試環(huán)境的實(shí)時(shí)監(jiān)測(cè)和補(bǔ)償。
五、低功耗設(shè)計(jì)與實(shí)現(xiàn)
5.1 低功耗模式配置
PT32x033提供兩種低功耗模式:普通休眠低功耗模式和深度休眠低功耗模式。在正常工作模式下,可以通過失能未被使用的時(shí)鐘源、外設(shè),以及配置GPIO為輸入同時(shí)做下拉處理等方式進(jìn)一步降低功耗。
使用ARM Cortex-M0的Wait for Interrupt (WFI)和wait for Event (WFE)兩條指令可以使芯片進(jìn)入休眠模式或深度睡眠模式。當(dāng)執(zhí)行WFI或WFE指令后,芯片進(jìn)入哪種低功耗模式,由系統(tǒng)控制寄存器(SCR)的SLP位決定。
5.2 超低功耗設(shè)計(jì)注意事項(xiàng)
在超低功耗模式下,需要注意以下幾點(diǎn):
PB9管腳由于作為Crystal_OUT管腳內(nèi)部存在下拉反饋電阻,因此休眠過程不能存在外部或者內(nèi)部上拉電阻導(dǎo)致漏電。
超低功耗模式下,不相關(guān)的模擬外設(shè)軟件需要主動(dòng)關(guān)閉,比如內(nèi)部2V參考以及OPA。
超低功耗模式下,不相關(guān)的引腳復(fù)用功能全部清除并且軟件做下拉處理。
WFE為事件喚醒方式,那么只需要配置NVIC以及中斷類型(無需響應(yīng)中斷)即可產(chǎn)生喚醒;如配置為WFI中斷喚醒方式,那么需要使能中斷(需要響應(yīng)中斷)才可產(chǎn)生喚醒。
六、軟件設(shè)計(jì)與實(shí)現(xiàn)
6.1 軟件架構(gòu)
軟件設(shè)計(jì)采用模塊化架構(gòu),主要包括以下幾個(gè)模塊:
初始化模塊:負(fù)責(zé)系統(tǒng)初始化、時(shí)鐘配置、外設(shè)初始化等。
ADC采樣模塊:負(fù)責(zé)NTC電阻電壓的采樣和轉(zhuǎn)換。
溫度計(jì)算模塊:根據(jù)采樣得到的電壓值,通過B值法計(jì)算得出環(huán)境溫度值。
LCD顯示模塊:將環(huán)境溫度值顯示在液晶顯示屏上。
低功耗管理模塊:負(fù)責(zé)低功耗模式的配置和切換。
6.2 關(guān)鍵代碼實(shí)現(xiàn)
以下是部分關(guān)鍵代碼的實(shí)現(xiàn)示例:
// ADC初始化配置 void ADC_Init(void) { // 配置ADC控制寄存器 ADC_CR = ...; // 配置ADC狀態(tài)寄存器 ADC_STAU = ...; // 配置ADC數(shù)據(jù)寄存器 ADC_DATA = ...; // 配置ADC采樣時(shí)間寄存器 ADC_SAMPLE = ...; // 啟動(dòng)ADC ADC_CR |= ADC_CR_EN; }
// 溫度計(jì)算函數(shù) float CalculateTemperature(uint16_t adcValue) { // 根據(jù)NTC電阻的阻值和B值計(jì)算溫度 // 公式:TN = (B * T * ln(R/R0)) / (B + T * ln(R/R0)) + T0 // 其中,TN為溫度(K),T為常數(shù)(298.15K),R為NTC電阻阻值,R0為NTC電阻在25℃時(shí)的阻值,B為NTC電阻的B值 // adcValue為ADC采樣得到的電壓值,需要通過公式轉(zhuǎn)換為NTC電阻的阻值 float R = ...; // 根據(jù)adcValue計(jì)算得到的NTC電阻阻值 float TN = (B * 298.15 * log(R / R0)) / (B + 298.15 * log(R / R0)) + 298.15; return TN - 273.15; // 將開爾文溫度轉(zhuǎn)換為攝氏度 }
// LCD顯示函數(shù) void LCD_DisplayTemperature(float temperature) { // 將溫度值顯示在LCD上 // 具體實(shí)現(xiàn)依賴于LCD驅(qū)動(dòng)器的配置和顯示邏輯 ... }
// 低功耗管理函數(shù) void LowPowerMode_Enter(void) { // 配置系統(tǒng)控制寄存器,準(zhǔn)備進(jìn)入低功耗模式 SCR = ...; // 執(zhí)行WFI或WFE指令,
進(jìn)入低功耗模式。
// 對(duì)于WFI指令,芯片會(huì)等待中斷喚醒; // 對(duì)于WFE指令,芯片會(huì)等待特定事件喚醒。 __WFI(); // 或者使用 __WFE() 根據(jù)具體需求選擇。
// 注意:在實(shí)際應(yīng)用中,需要根據(jù)具體的低功耗需求和喚醒條件, // 配置相應(yīng)的中斷和事件,以確保在低功耗模式下能夠正確喚醒。
}
// 主函數(shù)
int main(void)
{
// 系統(tǒng)初始化
System_Init();
// ADC初始化 ADC_Init();
// 無限循環(huán),實(shí)時(shí)監(jiān)測(cè)環(huán)境溫度 while (1) { // 采集NTC電阻的電壓值 uint16_t adcValue = ADC_Sample();
// 計(jì)算環(huán)境溫度 float temperature = CalculateTemperature(adcValue);
// 顯示環(huán)境溫度 LCD_DisplayTemperature(temperature);
// 如果沒有其他任務(wù)需要處理,進(jìn)入低功耗模式 LowPowerMode_Enter(); }
// 注意:在實(shí)際應(yīng)用中,通常不會(huì)直接在這里進(jìn)入低功耗模式, // 因?yàn)闀?huì)有其他任務(wù)(如按鍵掃描、通信處理等)需要處理。 // 這里只是為了演示低功耗模式的進(jìn)入方式。
return 0; // 雖然對(duì)于嵌入式系統(tǒng)來說,main函數(shù)通常不會(huì)返回。
}
// ADC采樣函數(shù)(示例)
uint16_t ADC_Sample(void)
{
// 啟動(dòng)ADC采樣
ADC_CR |= ADC_CR_START;
// 等待采樣完成(可以通過查詢狀態(tài)寄存器或中斷方式實(shí)現(xiàn)) // 這里為了簡(jiǎn)化示例,使用簡(jiǎn)單的延時(shí)等待(不推薦在實(shí)際應(yīng)用中使用) for (volatile int i = 0; i < 1000000; i++);
// 讀取ADC數(shù)據(jù) uint16_t adcValue = ADC_DATA;
// 停止ADC采樣(如果需要) ADC_CR &= ~ADC_CR_START;
return adcValue;
}
// 系統(tǒng)初始化函數(shù)(示例)
void System_Init(void)
{
// 配置系統(tǒng)時(shí)鐘
SystemClock_Config();
// 初始化GPIO GPIO_Init();
// 初始化LCD LCD_Init();
// 其他初始化操作...
}
// 系統(tǒng)時(shí)鐘配置函數(shù)(示例)
void SystemClock_Config(void)
{
// 根據(jù)具體需求配置系統(tǒng)時(shí)鐘
// 這里只是一個(gè)示例,具體實(shí)現(xiàn)依賴于具體的MCU型號(hào)和時(shí)鐘源
...
}
// GPIO初始化函數(shù)(示例)
void GPIO_Init(void)
{
// 根據(jù)具體需求配置GPIO
// 這里只是一個(gè)示例,具體實(shí)現(xiàn)依賴于具體的MCU型號(hào)和GPIO配置需求
...
}
// LCD初始化函數(shù)(示例)
void LCD_Init(void)
{
// 根據(jù)具體需求初始化LCD
// 這里只是一個(gè)示例,具體實(shí)現(xiàn)依賴于具體的LCD型號(hào)和驅(qū)動(dòng)方式
...
}