历史上的今天
今天是:2024年12月21日(星期六)
2020年12月21日 | 基于MSP430F435单片机的血糖仪系统设计
2020-12-21 来源:elecfans
目前市场上的血糖仪种类繁多,结构外形各异,价格和精度也大相径庭;且价格和精度难以兼得。原因在于没有找到一款合适的微处理器。另外,出于屏幕尺寸的限制,界面普遍采用英文字符显示,这给中国病人带来一定的困惑。
随着电子技术的发展,微处理器功能日益增强,价格日趋降低。有必要选出一款功能强大而价格便宜的微处理器来重新设计血糖仪。本系统选用的MSP430系列微处理器使上述设想成为可能。
原理
血糖仪是根据电生物化学原理——施加一定电压于经酶反应后的血液产生的电流会随着血液中的血糖浓度的增加而增加——设计的。通过精确测量出这些微弱电流,并根据电流值和血糖浓度的关系,反算出相应的浓度。所以,确定这个关系是问题的核心。但其关系复杂,受多方面因素影响。电压强度、所使用的试条以及检测的血液量都会对其产生影响。理论上需要在所有浓度点上大量实验才能确定最终的关系。在实际操作中,只需在选择若干重要浓度点做大量实验,并确定其与电流值之间的关系。而相邻浓度点之间用简单的线性关系取代。图1是本设计总结出一定量电压下的关系曲线。
系统硬件设计
根据血糖仪功能的实际需求,结合MSP430系列单片机特点,采用型号为MSP430F435的单片机作为控制核心,其它模块还有电流检测、按键输入和电源、显示、扬声器及串口通信等。如图1所示。

图1 系统组成
MSP430F435单片机
本系统选用的单片机MSP430F435具有16Kb Flash存储器、512B RAM、多达160段LCD驱动器、8通道/12位ADC及大量的I/O端口等,完全满足本血糖仪的各项功能需求。

图2 微处理器的端口设置
主要端口设置如图2所示。其中COM0~COM3、S16~S39、R03~R33用于实现LCD显示; Port74和Port75用于串行通信;Port79~Port81为按键的输入端;Port76和Port77分别为运算放大器和RS-232芯片提供供电电压。Port78连接蜂鸣器;Port2和Port3为ADC输入;Port7参考电压输出;XOUT和XIN连接32KHz的晶振,这是系统的时钟源。
LCD显示
MSP430F435具有液晶驱动功能,最大能支持160段LCD,并且具有功耗低等特点。本系统采用中文界面的LCD显示,这也是本款血糖仪的一大特点。此LCD有96码段,内容丰富、功能强大。极大地方便了国内病人的使用。
血糖检测
从原理中已经知道,测量血糖时需要在相应的电极上施加一定的电压,而电压的稳定性将直接影响测量结果,因此,考虑从相对稳定的参考电压得到,而不是直接从供电电源中得到。
MSP430单片机A/D采样的是电压值,而被检测的是微量的电流值;因而也需要将电流值放大并转换成相应的电压值。采用如图3所示的电路就能实现这一要求。其中,电阻R用于放大。此外,过少的血液量也将造成结果偏差;所以有必要设计一个用于检测血液是否足量的简单电路。而此电路完全可以用与图3相同的电路来代替。因此采用两个这样的电路就可以实现血糖测量。

图3 放大电路
其它模块
本系统的供电电压为3V,采用两块电池。其中一块是主供电源;另一块为备用,以便设备在换电池时仍能正常工作。
按键采用三个,分别是左键、右键和OK键;OK键主要用于开、关机和确认等,左键用于数字减或选项左移等,而右键则与左键相反。
由于血糖仪中存有大量的测量结果,因此有必要增加串口通信功能,将这些结果上传到PC作进一步处理。而单片机本身就具有串行通信接口,只需将TTL电平转化为RS-232电平即可;这里采用SP3232芯片来实现这一功能。SP3232芯片所需的供电电压低,适合便携式设备应用。其外围电路的连接简单,仅需几个0.1uF的电容即可。
系统软件设计
系统软件采用C语言编写。其主程序框架如图4所示。

图4 主程序框图
对于便携式设备,电池寿命至关重要;设计时应尽量降低功耗,使系统尽可能长时间停留在低功耗状态。因此,考虑设备在适当的时候自动关机。这里采用了一个定时器。当定时器大于0时,系统处于开机状态;当定时器倒数到0时,系统自动关机。这个定时器是由单片机中的BasIC TImer实现的。通过软件对Basic TImer控制寄存器进行设置,将信号源设为辅助时钟,大小为32KHz,并进行256分频,再对中断定时间隔控制位进行设置,使得中断每秒进行一次,并且每次到来时都对定时器减1,这样就实现了定时器每秒减1的功能。具体操作是这样:开机时,对定时器初始化一个大于0的值,比如30,并且在每按一次有效键时,系统重新初始化这个值。因此,当没有按任何有效键时,30秒后就会自动关机,从而实现省电目的。
系统也具有实时时钟功能,它的实现方式与上述的定时器类似。只是将“每秒减1”改为“每秒加1”;具体操作:每次中断时都对秒变量进行加1,当秒变量的值变为60时,就对分钟变量加1,而秒变量又重新从0开始计数;同样,当分钟变量累加到60时,就对小时变量加一,而自身又从0开始计数。依次类推,就可以实现实时时钟和日期功能。
为满足个性化需要,还增加了时钟和单位设置、平均值和温度显示等功能。这里就不再赘述了。下面主要介绍一下测量模块。首先,初始化各个端口以及ADC寄存器;然后等待滴血。当检测到足量血时,断电并等待若干秒,使之与试条上的酶充分反应。随后加电并在一秒后迅速读取。图5是与本血糖仪配套使用的试条在不同浓度的血糖与酶反应若干秒后再加电产生的电流的变化曲线。由图不难看出,加电后一秒曲线就较为平稳,这也是本设计采用“加电一秒”后即可读取的原因。
计算公式
这部分无疑是本设计的关键。表1是使用本设计的样机测得的部分数据。由表中的数据不难看出,血糖仪和血糖试条的测量重复性较好——CV《3%,远远高于国家标准《7.5%的要求。
通过对数据进行三次曲线拟合,就可以得到血糖值和电流值之间的关系曲线图。图6是原始数据分段曲线和拟合曲线的对比图。容易看出两条曲线很吻合;因此在实际操作中可以用一个公式代替分段函数。这里的曲线公式为:
其中,X是电流值,单位uA,Y是对应的血糖值,单位为mg/dl。在实际验证过程中,上述公式具有良好的精度。

图5 数据分段曲线和拟合曲线的对比图
结语
此款血糖仪采用MSP430F435作为其核心控制单元,它具有12位A/D转换;采样精度达到1/4096。除了基本功能外,系统还增加了闹铃提示和串口通信功能,使用户不仅可以定时测量,而且还可以通过串口将测量结果保存到PC,再通过相应的软件,对数据作进一步处理。本文总结的公式经临床证明具有良好的精度。此外,中文字符界面也极大地方便了用户使用。
史海拾趣
|
本帖最后由 paulhyde 于 2014-9-15 03:33 编辑 来源:http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=3648721&bbs_page_no=1&bbs_id=9999 暑假学校里做机器人比赛,就是做出一个人型机器人来互相对打,要求无线控制的。 我因为去年做过这个 ...… 查看全部问答> |
|
应用场合不同,选择交流或直流取决于线圈,直流接触器的线圈只能通直流,交流接触器的线圈只能通交流工作。一般来说,在交流回路当中,主回路用的交流,辅助助回路一般都是从主回路上取电做控制回路,那么控制回路显然也是交流的,那么就要用交流接 ...… 查看全部问答> |
|
小弟刚上手驱动开发不久,现在用PB5.0做驱动。 现在是想按扇区读写全部的flash rom,我知道PB中有FMD_WriteSector等函数可以读写扇区,但不知道如何调用? 另外我还想问一下,用PB FOR CE5.0写的驱动能在windows mobile 上面用吗? 谢谢各位高手… 查看全部问答> |
|
#include <STM8S105C_S.h> #define uchar unsigned char #define uint unsigned int #define data_out PB_DDR|=0X04; #define data_in PB_DDR&=~0X04; #define scl_H PB_ODR|=0X02; #define scl_L PB_ODR&=~0X02; #define sda_ ...… 查看全部问答> |
|
用f123做了个电路板,用的是前2年的片子,烧写调试成功,偶然间不小心烧了片子,换了新的(刚买的),然后就提示60错误,找不到设备,请教斑竹为什么?头都大了,电路没问题的,用的是同样的电路板(同一批做的),元件也一样,是什么问题啊? 1。 ...… 查看全部问答> |
|
lowlevel_init.S的system_clock_init函数放到C语言下面实现——更好处理 在uboot原来的代码里,有系统时钟的初始化函数,在board/samsung/smdkv210/lowlevel_init.S的system_clock_init函数,我大概看了一下,寄存器不一样,而且是汇编写的,所以我就改成用c语言来实现,在BL1阶段初始化一下,BL2阶段就不用重新初始化了 ...… 查看全部问答> |




