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

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. MySQL学习之路6-数据表连接方式

    内连接 关键字: inner join  on 语句:select * from <a_table> inner join <b_table> on a.id = b.id ; ...

  2. lr自带协议工具

    Lr自带的协议分析的工具: 录制脚本之前,选对协议很关键,否则错误的协议会导致Virtual User Generator 录制不到脚本,或录制的脚本不完整,有些应用可能需要选择多个协议才能完整的记录 ...

  3. VirtualBox的四种网络连接方式【转】

    VirtualBox中有4中网络连接方式: NAT Bridged Adapter Internal Host-only Adapter VMWare中有三种,其实他跟VMWare 的网络连接方式都是 ...

  4. EndNote自动修改导入文献标题

    今天使用EndNote导入文献,插入到word中时发现是标题的名字,导入的文献格式不标准,在百度后终于找到了解决办法,EndNote的强大可见一斑. 这个是我要导入的PDF文件的名字 导入后的名字 设 ...

  5. Pie 杭电1969 二分

    My birthday is coming up and traditionally I'm serving pie. Not just one pie, no, I have a number N ...

  6. 通达OA任意用户登录 漏洞复现

    0x00 漏洞简介 通达OA国内常用的办公系统,使用群体,大小公司都可以,其此次安全更新修复的高危漏洞为任意用户登录漏洞.攻击者在远程且未经授权的情况下,通过利用此漏洞,可以直接以任意用户身份登录到系 ...

  7. python3-邮件发送-不同格式

    0x00 邮件格式 要发邮件,总要先了解邮件格式吧,这里指的是邮件的各个部分与python中SMTP所对应的一些必须的格式 0x01 简单发送邮件格式如下: import smtplib from e ...

  8. jmeter 聚合报告参数解释

    label:每个请求的名称 样本:发送给服务器的请求数量 平均值:平均响应时间,默认情况下是单个 Request 的平均响应时间,当使用了 Transaction Controller 时,也可以以T ...

  9. 关于对vue-router的优化(详尽版)

    这两天总结了关于vue-router优化的几点技法,做个笔记 在基于vue的移动端app中,通过vue-router可以便捷的进入某一路由或回退到上一路由,但是若不对vue-router做相关优化处理 ...

  10. react: typescript custom hooks useAsyncTable

    define basic data: const SET_QUERY = "SET_QUERY"; const TOGGLE_LOADING = "TOGGLE_LOAD ...