This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/AFE4400:信号质量问题

Guru**** 2618245 points

Other Parts Discussed in Thread: MSP430F5529

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/sensors-group/sensors/f/sensors-forum/581972/ccs-afe4400-signal-quality-concerns

器件型号:AFE4400
主题中讨论的其他器件:MSP430F5529

工具/软件:Code Composer Studio

您好!

目前、我的高级设计团队正在利用 AFE 4400在用户手腕上进行心率测量;AFE 基于用户指南中的参考资料构建在 PCB 上。 使用用户指南中建议的设置对其进行编程后、OUT 信号显示无可用心率信息;此外、当器件磨损时、使用示波器手动探测光电二极管表明存在预期信号的一般包络。

我想知道、为了从器件中获取正确的数据、我们是否需要执行任何特定的编程序列或寄存器操作、  

我们使用 MSP430F5529来处理与 AFE 的通信。

下面是用于初始化 AFE 的代码:

void init_SPI (void)
{
P2OUT|= BIT7;
P2DIR|= BIT7;
P3SEL|= BIT0 + BIT1 + BIT2; // P3.0/1/2选项选择

UCB0CTL1 |= UCSWRST;//**将状态机复位**
UCB0CTL0 |= UCMST + UCSYNC + UCCKPH + UCMSB;// 3引脚8位 SPI 主器件
//时钟极性高,MSB
UCB0CTL1 |= UCSSEL_2;// SMCLK
UCB0BR0 = 24;///2
UCB0BR1 = 0; //
//// UCB0MCTL = 0; //无调制
UCB0CTL1 &=~UCSWRST; //**初始化 USCI 状态机**//
UCB0IE |= UCRXIE /*+ UCTXIE*/; //启用 USCI_B0 RX 中断

} 

int spi_writeRegister (unsigned char Reg、unsigned long int DAT)
{
unsigned char send3 =(DAT&0x0000)>16;
unsigned char send2 =(DAT&0x00FF00)>8;
unsigned char send1 =(DAT&0xFF);
P2OUT &=~(BIT7);
while (USCI_B_SPI_isBusy (SPI_Base)=USCI_B_SPI_BUSY);
while (!(UCB0IFG&UCTXIFG));
UCB0TXBUF = Reg;
while (USCI_B_SPI_isBusy (SPI_BIT_B_BUSCI_BUSCI_BUSY)= USCI_BUSCI_BUSCI_BUSCI_BUSCI_BUSCI_BUSCI_BUSCI_BUSCI_BUSCI_BUS
while (!(UCB0IFG&UCTXIFG));
UCB0TXBUF = send3;
while (USCI_B_SPI_isBusy (SPI_Base)= USCI_B_SPI_BUSY);
while (!(UCB0IFG&UCTXIFG));
UCB0TXBUF = send2;
while (USCI_B_SPI_isBusy (SPI_Base)== USCI_B_SPI_BUSY);
while (!(UCB0IFG&UCTXIFG));
UCB0TXBUF = send1;
while (USCI_B_SPI_isBusy (SPI_Base)=USCI_B_SPI_BUSY);while (USCI_B_BUSY)
P2OUT |=(BIT7);
返回0;
} 
void SPI_read (int Reg、Serial_Type *输出)
{
unsigned char first;
unsigned char Second;
unsigned char third;
out->Status =-1;
P2OUT &=~(BIT7);
while (!(UCB0IFG&UCTXIFG));
UCB0TXBUF = 0x00;
while (USCI_B_SPI_isBusy (SPI_Base)= USCI_B_SPI_BUSY);
while (!(UCB0IFG&UCTXIFG));
UCB0TXBUF = 0x00;
while (USCI_B_SPI_isBusy (SPI_Base)= USCI_B_SPI_BUSY);
while (!(UCB0IFG&UCTXIFG));
UCB0TXBUF = 0x00;
while (USCI_B_SPI_isBusy (USCI_B&UCTXIFG)= USCI_BUSCI_BUSCI_BUSCI_BUSCI_BUSY (SPI_BUSY);USCI_BUSCI_BUSCI_BUSCI_B
while (!(UCB0IFG&UCTXIFG));
UCB0TXBUF =0x01;
while (USCI_B_SPI_isBusy (SPI_Base)== USCI_B_SPI_BUSY);
while (USCI_B_SPI_isBusy (SPI_Base)=USCI_B_SPI_BUSY)
;while (USCI_B_SPI_C0IFG)(BUSY)(UCTX_USCI_USCI)(BUSY)))(while (+ CBIFG)(while)
UCB0TXBUF =寄存器;
while (USCI_B_SPI_isBusy (SPI_Base)=USCI_B_SPI_BUSY);
while (!(UCB0IFG&UCTXIFG));
UCB0TXBUF =0x00;
while (USCI_B_SPI_isBusy (SPI_BIT_B_BUSCI_BUSCI_BUSY)= USCI_BUSCI_BUSCI_BUSCI_BUSCI_BUSCI_BUSCI_BUSCI_BUSCI_BUSCI_BUS
while (((UCB0IFG&UCRXIFG)==0);
first = UCB0RXBUF;
while (!(UCB0IFG&UCTXIFG));
UCB0TXBUF = 0x00;
while (USCI_B_SPI_isBusy (SPI_Base)=USCI_B_SPI_BUSY)= USCI_BUSY;BUSY
while (((UCB0IFG&UCRXIFG)=0);
Second = UCB0RXBUF;
while (!(UCB0IFG&UCTXIFG));
UCB0TXBUF = 0x00;
while (USCI_B_SPI_isBusy (SPI_Base)= USCI_B_SPI_BUSY)= USCI_BUSY;while (USCI_B_B_SPI_BUSY)
while (((UCB0IFG&UCRXIFG)=0);
third = UCB0RXBUF;
while (USCI_B_SPI_isBusy (SPI_Base)== USCI_B_SPI_BUSY);
while (!(UCB0IFG&UCTXIFG));
UCB0TXBUF = 0x00;
while (USCI_B_SPI_isBusy (SPI_Base)== USCI_B_SPI_BUSY);
while (!(UCB0IFG&UCTXIFG));
UCB0TXBUF = 0x00;
while (USCI_B_SPI_isBusy (SPI_Base)=USCI_B_SIUCTXIFG);
while (USCI_B_B_CBIFG)(BUSY)(BUSY))(BUSY)(BUSY))(UCB0_UCTX_UCTX_UCT
UCB0TXBUF = 0x00;
while (USCI_B_SPI_isBusy (SPI_Base)= USCI_B_SPI_BUSY);
while (!(UCB0IFG&UCTXIFG));
UCB0TXBUF = 0x00;
while (USCI_B_SPI_isBusy (USCI_B&UCTXIFG)= USCI_BUSCI_BUSCI_BUSCI_BUSCI_BUSY (SPI_BUSY);USCI_BUSCI_BUSCI_BUSCI_B
P2OUT |=(BIT7);
out->received[out->i]=((first*65536)+(Second *256)+(third));
// if (out->received[out->i])
OUT->Status=0;
} 
void init_AFE (void)
{
SPI_writeRegister (0x00、8);
_delay_cycles (100);
SPI_writeRegister (0x01、6050);
SPI_writeRegister (0x02、998);
SPI_writeRegister (0x03、6000);
SPI_writeRegister (0x04、7999);
SPI_writeRegister (0x05、50);
SPI_writeRegister (0x06、1998);
SPI_writeRegister (0x07、2050);
SPI_writeRegister (0x08、3998);
SPI_writeRegister (0x09、2000);
SPI_writeRegister (0x0A、3999);
SPI_writeRegister (0x0B、4050);
SPI_writeRegister (0x0C、5998);
SPI_writeRegister (0x0D、4);
SPI_writeRegister (0x0E、1999);
SPI_writeRegister (0x0F、2004);
SPI_writeRegister (0x10、3999);
SPI_writeRegister (0x11、4004);
SPI_writeRegister (0x12、5999);
SPI_writeRegister (0x13、6004);
SPI_writeRegister (0x14、7999);
SPI_writeRegister (0x15、0);
SPI_writeRegister (0x16、3);
SPI_writeRegister (0x17、2000);
SPI_writeRegister (0x18、2003);
SPI_writeRegister (0x19、4000);
SPI_writeRegister (0x1A、4003);
SPI_writeRegister (0x1B、6000);
SPI_writeRegister (0x1C、6003);
SPI_writeRegister (0x1D、7999);
_delay_cycles (100);
SPI_writeRegister (0x22、0x01FFFF);
SPI_writeRegister (0x1E、0x000702);

} 
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 John:

    计时引擎(1h - 1Dh)的寄存器设置看起来不错、但似乎您设置为最大 LED 电流50mA (reg 22h)。 什么是 TIA 增益(reg 21h)?
    您能否提供 PPG 信号的波形图?
    当您用手指而非手腕测量 PPG 信号时、您是否注意到该信号?
    此外、您可能还需要减小 LED 电流并检查是否能够识别 PPG 信号。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    寄存器21h 设置为默认值、因此增益应为0dB。

    从手指尖进行的测量会产生振幅更高的信号、但整体信号质量与手腕上的信号质量一样差。

    以下是我们 AFE 4400在各种 LED 电流设置下通过 FingerTIP 获得的波形样本:

    强度- FF

    强度- 1A

    力量- 06

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 John:

    在查看数据时、您是否在查看 LED 阶段或 LED 环境阶段?
    您能否查看 LED 环境阶段数据(即寄存器0x2E 和0x2F)?
    我甚至建议尽量减少50/60Hz 拾取、并进行一些信号处理(即陷波滤波器)、以从原始数据中删除50/60Hz 信号。

    此致、
    Prabin
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    所有这些数据捕获都来自 LED 环境寄存器2Fh。 我以前曾尝试过通过低通滤波器运行数据、但我将创建一个陷波滤波器并通过该滤波器重新处理数据。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这是通过一系列滤波器运行一个数据集后的输出。

    60Hz 陷波滤波器:

    60、80、180、220Hz 陷波滤波器:

    10Hz 低通:

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 John:

    对于带 LPF 的图、您能否绘制从样本#750到3000的数据。

    此致、
    Prabin
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    下面是从750到3000的图:

    此外、在强制我的接收函数忽略响应中的两个最高有效位后、我偶尔会得到类似如下的样本:

    已过滤: