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