基于澎湃微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型号和驱动方式
...
}