(本文均出于个人理解而写,仅用于学习和交流,某些过程可能不一定正确,希望各位提出意见进行交流,共同进步)

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通信。
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(默认的)
(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模式进行阻抗测量时,可按如下的步骤配置寄存器:
(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。

                                    

智能称体脂称实现(datasheet篇)的更多相关文章

  1. python案例——体脂率项目

    通过一个人的身高.体重.年龄.性别,判断这个人的体脂率,并且反馈是否正常? 首先接到项目后一定要一步步细分任务,直到每个细分的任务都可以用代码来实现. 写代码之前,先要确定python版本的问题 然后 ...

  2. Python 案例一(计算人体体脂率)

    #计算人体体脂率 #输入部分 #身高 personHeight = input("请输入你的身高(m):") personHeight = float(personHeight) ...

  3. python第一个程序:计算体脂率

    主要是为了提醒自己要——保重 height = input('请输入身高(m):') weight = input('请输入体重(KG):') age = input('请输入年龄:') sex = ...

  4. 智能家居系统 Home Assistant 系列 --介绍篇

    一. HomeAssistant 是什么? HomeAssistant是构建智慧空间的神器.是一个成熟完整的基于 Python 的智能家居系统,设备支持度高,支持自动化(Automation).群组化 ...

  5. Unity3D第三人称摄像机控制脚本

    好久没有敲Blog该.感谢您的留言.注意.私人信件和其他支持,但我似乎没有办法继续自己曾经写了一篇博客系列,因为我在网上找到有关unity3D太少的内容,U3D相关的文章!.. 第三人称视角 第三人称 ...

  6. 挖掘机力矩限制器/挖掘机称重系统/挖泥机称重/Excavators load protection/Load moment indicator

    挖掘机力矩限制器是臂架型起重机机械的安全保护装置,本产品采用32位高性能微处理器为硬件平台 ,软件算法采用国内最先进的液压取力算法,该算法吸收多年的现场经验,不断改进完善而成.本产品符合<GB1 ...

  7. Unity3D中的第三人称镜头的脚本控制

    原地址:http://blog.csdn.net/mobanchengshuang/article/details/27591271 好久没有敲Blog了,谢谢大家的留言.关注.私信等支持,但是我好像 ...

  8. 智能合约语言Solidity教程系列2 - 地址类型介绍

    智能合约语言Solidity教程系列第二篇 - Solidity地址类型介绍. 写在前面 Solidity是以太坊智能合约编程语言,阅读本文前,你应该对以太坊.智能合约有所了解,如果你还不了解,建议你 ...

  9. C++ 引用计数技术及智能指针的简单实现

    一直以来都对智能指针一知半解,看C++Primer中也讲的不够清晰明白(大概是我功力不够吧).最近花了点时间认真看了智能指针,特地来写这篇文章. 1.智能指针是什么 简单来说,智能指针是一个类,它对普 ...

随机推荐

  1. 一、华为模拟器eNSP下载与安装教程

    简单介绍一下 eNSP: eNSP是一款由华为提供的免费的图形化网络仿真工具平台,它将完美呈现真实设备实景(包括华为最新的ARG3路由器和X7系列的交换机),支持大型网络模拟,让你有机会在没有真实设备 ...

  2. 【Selenium07篇】python+selenium实现Web自动化:PO模型,PageObject模式!

    一.前言 最近问我自动化的人确实有点多,个人突发奇想:想从0开始讲解python+selenium实现Web自动化测试,请关注博客持续更新! 这是python+selenium实现Web自动化第七篇博 ...

  3. developerWorks 中文社区

    https://www.ibm.com/developerworks/community/groups/service/html/communityview?communityUuid=3302cc3 ...

  4. k8s~helm镜像版本永远不要用latest

    对于容器编排工具k8s来说,你可以使用它规定的yaml格式的脚本,使用客户端kubectl来与k8s进行通讯,将你定义好的yaml部署脚本应用到k8s集群上,而这对yaml脚本一般来说都是很像的,就是 ...

  5. ASE past project:interview & analysis

    采访往届ASE课程学员李潇,他所在的团队blog戳这里http://www.cnblogs.com/smart-code/ Q1:师兄你觉得在团队项目中,有哪些需要注意的事情? A1:团队合作吧.首先 ...

  6. 如何可视化深度学习网络中Attention层

    前言 在训练深度学习模型时,常想一窥网络结构中的attention层权重分布,观察序列输入的哪些词或者词组合是网络比较care的.在小论文中主要研究了关于词性POS对输入序列的注意力机制.同时对比实验 ...

  7. 详解 final 和 static

    在我们上一篇博文中提到了 fianl 这个关键字,对于这个关键字,本人在初学时也耗费了极大地心血,甚至和师兄进行了激烈的讨论,并且,在我们讨论.尝试 以及 翻阅各种资料,最终得出了合适.易懂的解释. ...

  8. [javascript] jquery的父子兄弟节点查找

    jQuery.parent(expr) 找父亲节点,可以传入expr进行过滤,比如$("span").parent()或者$("span").parent(&q ...

  9. 解决cvc-complex-type.2.4.a: Invalid content was found starting with element

    今天用myeclipse导入 一个项目出现后出现cvc-complex-type.2.4.a: Invalid content was found starting with element 'inf ...

  10. 利用 tee 命令调试shell脚本中的管道

    在编写shell脚本时,调试是个比较麻烦的事,特别是涉及到多层管道命令的时候,会产生多个中间结果,tee命令的作用是从标准输入中读取数据写入标准输出或文件中,利用它可以从管道中读取中间结果并写入本地临 ...