智能称体脂称实现(datasheet篇)
(本文均出于个人理解而写,仅用于学习和交流,某些过程可能不一定正确,希望各位提出意见进行交流,共同进步)
TI的参考方案是采用AFE4300芯片 同时进行生物阻抗身体成分测量和体重测量,以MSP430F5528 微控制器用于保留校准数据并计算重量、TBW、ECW 以及身体成分分析,采用 TI CC2541 的 BLE 模块连接。因为我们没有MSP430,所以我们没有直接套用他的方案,我们主处理器采用的是STM32(仅用来实验)。
AFE4300简介
AFE4300 是一款低成本模拟前端, 此模拟前端组装有两个独立的信号链: 一个信号链用于体重计 (WS) 测量, 而另外一个信号链用于体成分测量 (BCM) 分析。也就是说,我们使用此芯片,便不用自己去搭运放去测量人体阻抗了,TI帮我们把他集成为一个芯片,这样一来降低了我们开发的难度,另一方面,由于直接集成,外部干扰会更加小,性能一般会比自己搭的更好。
AFE4300的特性如下图(来源于datasheet)
AFE4300 datasheet
首先我觉得,一般生产芯片的公司肯定是希望他们公司的芯片让更多的工程师去使用,因此所设计的芯片肯定是非常注重易用性的,只有让工程师是好上手,易开发,他们的芯片才会比较有销量,如果一款芯片很多工程师都不会用,觉得很难开发,那么这款芯片销量应该不会很多。TI是芯片大商,不会神神秘秘隐藏一些东西不让别人知道,所以我们更应该有这个信心去开发这个芯片。
管脚分配
一般拿到一个芯片的datasheet时,我总是习惯于先看芯片的引脚说明,我觉得这样能够让我们对整个芯片有个整体的印象。AFE4300的datasheet第7面,芯片的管脚图如下:
一共有80个管脚,看似很多,第7面和第8面是管脚分配说明。从管脚分配说明那里我们可以得到管脚如下的一些信息。
关键引脚:
时钟引脚(79):要外接1M的时钟
RST(59):复位引脚
INM1到INM4(3,5,11,13):体重测量模式的4个通道的差分输入
INP1到INP4(2,4,10,12):体重测量模式的4个通道的差分输入(与INM各成一对)
OUTM_I_FILT(47),OUTP_I_FILT(48),OUTM_Q_FILT(49),OUTP_Q_FILT(50):分别连接I信道和Q信道解调器的低通滤波器,datasheet里是说接10uf电容,参考电路连的是4.7uf。
IOUT5到IOUT0(22,23,24,25,26,27):电流输出电极,用于人体成分测量,由寄存器设置正负
VSENSE5到VSENSE0(33,34,35,36,37,38):从电极输入到差分放大器,用于测量电压,由寄存器设置正负
STE(54),SCLK(54),SDIN(58),SDOUT(56):用于SPI通信。
STE(54),SCLK(54),SDIN(58),SDOUT(56):用于SPI通信。
VLDO(16):是电桥的正极。
VREF(17):参考电压(供测量)
INM_R(8),INP_R(7):连接放大器增益设置电阻
此外还有另外一些引脚用于连接校准电阻。
其硬件的电路图我们可以参考TI给的参考电路图设计。其中硬件上需要注意的是
(1)时钟引脚接的时钟信号要尽可能的好,这影响后面输出激励电流的波形。
(2)电路做出来后上电,稳压电源的电流示数为0,此时不用紧张,因为AFE4300是低功耗芯片,我做的时候开体重模式才有0.03A的电流,开人体阻抗测量的时候电流示数还是为0
SPI读写
电路如果做出来了,那么SPI这一步便很关键了,如果SPI调不成功,其他的就很难办了。AFE4300 SPI的时序图如下:
其中要注意的是串行同步时钟的空闲状态为低电平,这个在SPI的初始化中应当注意。
内部原理
了解了AFE4300内部的测量原理,才能对其寄存器的配置有整体的了解,便于程序的编写。AFE4300内部的整体框图如下:
其中各个信号的选择均由寄存器控制。
体重测量部分
体重部分还是比较简单的,涉及的寄存器不多。
其中VLDO是电桥的正极,由寄存器ADC_REF_SEL控制,该寄存器可以控制两个电压,VLDO用于体重测量,VREF用于人体阻抗测量
寄存器BRIDGE_SEL用于选择使用哪一路进行体重测量
寄存器WS_PGA_GAIN用于增益控制,增益由电阻Rg和电阻Rfb2决定
寄存器OFFSET_DAC_VALUE(WEIGHT_SCALE_CONTROL)用于设置ADC的偏置
使用体重测量模式时,按照如下步骤配置寄存器即可:
(1)寄存器DEVICE_CONTROL1 :第0位WS_PDB位置1,开启体重测量模式(此时,电流大志为0.03A)
(2)寄存器ADC_CONTROL_REGISTER2:ADCREF连接到VLDO作为电桥正极,即ADC_REF_SEL位置为00(默认的)
(2)寄存器ADC_CONTROL_REGISTER2:ADCREF连接到VLDO作为电桥正极,即ADC_REF_SEL位置为00(默认的)
(3)寄存器ADC_CONTROL_REGISTER2:将体重测量的结果连到ADC,即PERIPHERAL_SEL位置为0000(默认的)
(4)寄存器DEVICE_CONTROL2 :选择两个通道连接到电桥,由BRIDGE_SEL位设置。
其他一般不用设置或者采用默认值即可,设置好后,直接读取ADC的转换结果即可进行后续的数据处理,更多的设置详见datasheet。
人体阻抗测量部分
相对于体重部分的测量显得比较复杂一点。他首先需要产生正弦激励信号,所以里面有一个DDS,震荡的时钟是由时钟引脚外接的1M时钟分频而来的,因此前面说外接的时钟信号要尽可能好一点。由DDS产生的正弦信号通过IOUT加到人体上,然后通过VSENSE采集回来后进行处理,其中有两种模式,一种是全波整流模式,这种模式比较简单,另一种是IQ解调模式,稍微复杂一点,但是IQ模式的效果会比较好一点。
寄存器IQ_MODE_ENABLE用于模式选择,由第11位IQ_MODE_ENABLE决定
寄存器DEVICE_CONTROL2 中的IQ_DEMOD_CLK_DIV_FAC用于确定分频数由一条公式计算(IQ_DEMOD_CLK = fCLK / (IQ_DEMOD_CLK_DIV_FAC) = BCM_DAC_FREQ × 4)
寄存器BCM_DAC_FREQ用于设置产生激励电流的频率,当时钟是 1 MHz时,往DAC位填入不同的置可获得不同的频率,如:DAC
= 0x00FF → 255 kHz,DAC = 0x0001 → 1 kHz。但是如果是IQ模式的话,其频率收到分频数的影响,可由公式IQ_DEMOD_CLK = fCLK / (IQ_DEMOD_CLK_DIV_FAC) = BCM_DAC_FREQ × 4推算。
寄存器ADC_CONTROL_REGISTER2中的PERIPHERAL_SEL位可用于选择I通道或Q通道,使用时分别设置为I,Q通道并读取其ADC的值,后经过换算可得阻抗。
寄存器ISW_MUX和VSENSE_MUX分别用于设置哪个通道用于激励信号和电压采集。
以IQ模式为例,使用IQ模式进行阻抗测量时,可按如下的步骤配置寄存器:
以IQ模式为例,使用IQ模式进行阻抗测量时,可按如下的步骤配置寄存器:
(1)寄存器DEVICE_CONTROL1 第1位BCM_PDB置1,开启阻抗测量前端
(2)寄存器ADC_CONTROL_REGISTER2:ADC_REF_SEL位置为11,将ADCREF连到VREF,此时测量VREF引脚应该得到1.7V的电压
(3)寄存器IQ_MODE_ENABLE:第11位IQ_MODE_ENABLE置1,开启IQ模式
(4)决定产生激励的频率,结合公式设置寄存器DEVICE_CONTROL2和BCM_DAC_FREQ
(5)设置寄存器ISW_MUX和VSENSE_MUX选择所使用的通道
(6)寄存器ADC_CONTROL_REGISTER2的PERIPHERAL_SEL位:设为00011读取I通道,设为00101读取Q通道
可以通过寄存器ADC_CONTROL_REGISTER1适当设置ADC的模式及读取的速率。
寄存器读写
datasheet中第20到26面开始是寄存器的说明,了解了芯片内部大致的来龙去脉后,来配置寄存器是一件比较容易的事情。
第一个寄存器是ADC结果的读取,使用SPI直接读取地址0x00即可获得结果。
下面看一个寄存器当做例子,其他寄存器的配置与此类似。这是一个用于设置激励电流的寄存器,地址是0x0A,默认值0x0000,该寄存器是16位的,其中,10到15位表示将哪一路设置为输出激励的负极,0表示关,1表示开,7到2位是表示连接到正极,同样式1表示开,0表示关。9,8,1,0是用于校准的(参考电路中有电路连到这些引脚)。使用的时候设置一路IOUP和一路IOUN即可。
比如SPI的读写接口是
void spiWrite (unsigned char spiAddr, unsigned short spiData)
apiAddr是寄存器的地址,spiData是要写入的数据,加入我们要把IOUT0设为负极,IOUT1设为正极,则只需要把第3位和第10位置为1即可,所以执行语句 spiWrite(0x0A,0x0408);
即可完成配置,其他寄存器的配置与此类似,具体见datasheet。