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.

[参考译文] AFE4404:AFE4404 PPG 波形不正确

Guru**** 2510095 points
Other Parts Discussed in Thread: AFE4404

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/876596/afe4404-afe4404-incorrect-ppg-wave-form

器件型号:AFE4404

您好!

我正在构建基于 AFE4404的应用。 为了实现概念验证、我们将 AFE4404与 Arduino Mega 相连。 我们能够初始化 AFE4404并与之通信、但我们读取的 ADC 数据似乎是随机的、并且没有可见的 PPG 波形。 我想知道、在绘制原始 ADC 数据之前、是否需要对其进行任何其他处理。  

下面是我们使用的 afe4404库、它是带有 Arduino HAL 修改的正式 afe4404库的直接副本。

//AFE4404.c



#include "AFE4404.h"

void AFE4404_Reg_Init (void)
{
AFE4404_Disable_Read ();
AFE4404_Reg_Write (1、100);//AFE_LED2STC
AFE4404_Reg_Write (2、399); //AFE_LED2ENDC
AFE4404_Reg_Write (3、802);//AFE_LED1LEDSTC
AFE4404_Reg_Write (4、1201);//AFE_LED1LEDENDC
AFE4404_Reg_Write (5、 501);//AFE_ALED2STC
AFE4404_Reg_Write (6、800);//AFE_ALED2ENDC
AFE4404_Reg_Write (7、902); //AFE_LED1STC
AFE4404_Reg_Write (8、1201);//AFE_LED1ENDC
AFE4404_Reg_Write (9、0); //AFE_LED2LEDSTC
AFE4404_Reg_Write (10、399);//AFE_LED2LEDENDC
AFE4404_Reg_Write (11、1303);//AFE_ALED1STC
AFE4404_Reg_Write (12、 1602);//AFE_ALED1ENDC
AFE4404_Reg_Write (13、409);//AFE_LED2CONVST
AFE4404_Reg_Write (14、1468); ///AFE_LED2CONVEND
AFE4404_Reg_Write (15、1478);//AFE_ALED2CONVST
AFE4404_Reg_Write (16、2537);//AFE_ALED2CONVEND
AFE4404_Reg_Write (17、 2547);//AFE_LED1CONVST
AFE4404_Reg_Write (18、3606);//AFE_LED1CONVEND
AFE4404_Reg_Write (19、3616); //AFE_ALED1CONVST
AFE4404_Reg_Write (20、4675);//AFE_ALED1CONVEND
AFE4404_Reg_Write (21、401);//AFE_ADCRSTCT0
AFE4404_Reg_Write (22、 407);//AFE_ADCRSTENDCT0
AFE4404_Reg_Write (23、1470);//AFE_ADCRSTCT1
AFE4404_Reg_Write (24、1476); //AFE_ADCRSTENDCT1
AFE4404_Reg_Write (25、2539);//AFE_ADCRSTCT2
AFE4404_Reg_Write (26、2545);//AFE_ADCRSTENDCT2
AFE4404_Reg_Write (27、 3608);//AFE_ADCRSTCT3
AFE4404_Reg_Write (28、3614);//AFE_ADCRSTENDCT3
AFE4404_Reg_Write (54、401); //AFE_LED3LEDSTC
AFE4404_Reg_Write (55、800);//AFE_LED3LEDENDC
AFE4404_Reg_Write (29、39999);//AFE_PRPCOUNT
AFE4404_Reg_Write (30、 0x000103);//AFE_CONTROL1 TimerEN = 1;NUMAV = 3
AFE4404_Reg_Write (32、0x008003);//AFE_TIA_SEP_GAIN (LED2) ENSEPGAIN = 1;LED2/LED3 GAIN = 50K
AFE4404_REG_Write (33、0x4000X248_LED1)
;/AFE4404 (LECF_LECF_LECF_LECF_REGIN);0x4004 (0x4004_LECF_LECF_LECF_LECF_LECF_1004、0x4004)
LED2 - 3.125mA;LED1 - 12.5mA
//AFE4404_Reg_Write (34、0x00379E);
AFE4404_Reg_Write (35、0x124218);//DYN1、 LEDCURR、DYN2、外部 CLK、DYN3、DYN4 /0x000200); -0x200 OSC 模式//AFE_CONTROL2
AFE4404_Reg_Write (49、0x000020);//ENABLE_INPUT_SHORT
AFE4404_Reg_Write (57、0);//CLKDIV_PRF
AFE4404_Reg_Write (50、5475);//AFE_DPD1STC
AFE4404_Reg_Write (51、39199);//AFE_DPD1ENDC
AFE4404_Enable_Read ();
}

/ //*
AFE4404_Init*/
********* /
void AFE4404_Init (void)
{
Wire.begin();
AFE4404_RESETZ_Init ();
//AFE4404_Enable_HWPDN ();
//AFE4404_Disable_HWPDN ();
AFE4404_Trigger_HWReset ();
AFE4404_ADCRDY_Interrupt_Init();
AFE4404_Reg_Init();
}/

//*
AFE4404_RESETZ_Init*/
********* /
void AFE4404_RESETZ_Init (void)
{
pinMode (reset_PIN、output);
digitalWrite (reset_PIN、high);
}


/********** //*
AFE4404_Enable_HWPDN*/
********* /
void AFE4404_Enable_HWPDN (void)
{
digitalWrite (reset_PIN、low);
delay (10); // 16MHz 时钟下~10ms 延迟
}

/********* //*
AFE4404_Disable_HWPDN*/
********* /
void AFE4404_Disable_HWPDN (void)
{
digitalWrite (reset_PIN、HIGH);
delay (10); // 16MHz 时钟下~10ms 延迟
}

/********* //*
AFE4404_Trigger_HWReset*/
********* /
void AFE4404_Trigger_HWReset (void)
{
digitalWrite (reset_PIN、low);
delayMicroseconds (30);
digitalWrite (reset_PIN、high);
延迟(10);
}


/ //*
AFE4404_Diagnostics_Check*/
********* /*unsigned
char AFE4404_Diagnostics_Check (void)
{
AFE4404_Disable_read ();
AFE4404_Reg_Write (0x23、0x000200); //启用内部振荡器
AFE4404_Reg_Write (0x1E、0x000100); // TIMER_EN
AFE4404_Reg_Write (0、4); // DIAG_EN
__DELAY_CYCLES (160000); //~10ms 延迟
AFE4404_Enable_read ();
return (unsigned char) AFE4404_Reg_Read (48);//DIAG status
}*/

************* /*
AFE4404_Reg_Write*/
********* /void
AFE4404_Reg_Write (unsigned char reg_address、unsigned long data)
{
unsigned char configData[3];
configData[0]=(unsigned char)(data >>>>16);
configData[1]=(unsigned char)(((data & 0x00FFFF)>8));
configData[2]=(unsigned
i2C_writeI2C (unsigned at_address)
;CONFIG4 (unsigned I2C_writeI2C)(unsigned at_address](unsigned I2C_writeI2C))(默认值)

/ //*
AFE4404_Reg_Read*/
********* /
带符号长整型 AFE4404_Reg_Read (无符号字符 Reg_address)
{
无符号字符 configData[3];
带符号长整型返回值;
I2C_Read (AFE4404_I2C_DEFAULT_ADDRESS、ReG_ADDRESS、CONFIGData、 3);
RetVal = CONFIGData[0];
RetVal =(RetVal << 8)| CONFIGData[1];
RetVal =(RetVal << 8)| CONFIGData[2];
if (Reg_address >= 0x2A && Rereg_address <= 0x2F)
{
if (RetVal & 0x00200000)//检查 ADC 值是否为负
值
;//将其转换为22位值
//RetVal =(~RetVal)+1;
return (RetVal^0xFFC00000);
}
retRetVal
;
}

/********* //*
AFE4404_Enable_Read*/
********* /
void AFE4404_Enable_Read (void)
{
unsigned char configData[3];
configData[0]= 0x00;
configData[1]=0x00;
configData[2]=0x01;
I2C_WRITE (AFE4404_I2C_DEFAULT_ADDRESS、 control0、configData、3);
}

/********* //*
AFE4404_Disable_read*/
********* /
void AFE4404_Disable_read (void)
{
unsigned char configData[3];
configData[0]= 0x00;
configData[1]=0x00;
configData[2]=0x00;
I2C_WRITE (AFE4404_I2C_DEFAULT_ADDRESS、 control0、configData、3);
}

/********* /*
AFE4404_ADCRDY_Interrupt_Init*/
********* /
void AFE4404_ADCRDY_Interrupt_Init (void)
{
pinMode (AFE_INTERRUPT_PIN、input);
}

/ /*
AFE4404_ADCRDY_Interrupt_Enable*/
********* /
void AFE4404_ADCRDY_Interrupt_Enable (void)
{
//clear_INT_FLAG_ON_ADC_RDY_PIN (); //P2IFG &=~AFE_ADC_DRDY;//清除 P2.3 IFG
// enable_INT_ON_ADC_RDY_PIN (); //P2IE |= AFE_ADC_DRDY;// P2.3中断已启用
}

/************* /*
AFE4404_ADCRDY_Interrupt_Disable*/
********* /
void AFE4404_ADCRDY_Interrupt_Disable (void)
{
//clear_INT_FLAG_ON_ADC_RDY_PIN (); //P2IFG &=~AFE_ADC_DRDY;//清除 P2.3 IFG
// disable_INT_ON_ADC_RDY_PIN (); //P2IE &=~AFE_ADC_DRDY;// P2.3中断被禁用
}

void I2C_WRITE (int slave_address、int reg_address、byte configData[]、int byteCount)
{
signed long RetVal;

Wire.beginTransmission(slave_address);
Wire.write (reg_address);
// Serial.print (configData[0]);
// Serial.print ("、");
// Serial.print (configData[1]);
// Serial.print ("、");
// Serial.println (configData[2]);
configRetVal = configData[0];
RetVal =(RetVal << 8)| configData[1];
configVal =(RetVal << 8)| configData[2];
// Serial.println (Retaln);
// Serial.printn (Retaln
);// Retal.Wire (Retreg.Wire);
Wire.endTransmission ();
}

内联 void I2C_read (int slave_address、int reg_address、byte * Read_Data、int byteCount)
{
Wire.beginTransmission(slave_address);
Wire.write (reg_address);
Wire.endTransmission ();
Wire.Frorequestm (slave_address、3);
while (Wire.Available ()&&(byteCount!= 0)
){
*Read_Data++= Wire.Read();
字节计数-;
}
//

文件结束 

一个特别的担心是 AFE4404_Reg_Read 函数、该函数似乎不会将 led 的二进制补码值转换回十进制:

signed long AFE4404_Reg_Read (unsigned char Reg_address)
{
unsigned char configData[3];
signed long RetVal;
I2C_Read (AFE4404_I2C_default_address、ReG_address、configData、 3);
RetVal = CONFIGData[0];
RetVal =(RetVal << 8)| CONFIGData[1];
RetVal =(RetVal << 8)| CONFIGData[2];
if (Reg_address >= 0x2A && Rereg_address <= 0x2F)
{
if (RetVal & 0x00200000)//检查 ADC 值是否为负
值
;//将其转换为22位值
返回值(RetVal^0xFFC00000);
}
}
返回 RetVal;
} 

此转换是否在 GUI 应用程序中完成?

此外、该链接 https://e2e.ti.com/support/data-converters/f/73/t/369445 建议 通过除以二进制补码值将 ADC 代码转换为电压。

     15.  如何将 ADC 结果代码转换为电压?

     ADC 电压到代码转换公式为:

     ADC 数据(伏特)=(二进制补码格式的 ADC 代码* Vref)/2^21

     其中 Vref = 1.2V

您能否解释一下为什么 ADC 代码未先转换为十进制数?

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

    您好、Uche、

    欢迎来到 TI e2e 论坛!

    假设 AFE 配置正确且信号链未饱和、您应该能够简单地绘制 ADC 代码并查看 PPG 波形。

    大多数情况下、由于信号链已饱和、PPG 数据看起来不正常。 您可以直接监控 LED 输出代码(稳压器2A 或2ch)、并确保 ADC 代码不是满量程。  在这种情况下、您可以减小 LED 电流或 TIA 增益。

    关于转换、它只是数据表示问题。 您可以直接查看 ADC 代码。 提供了转换公式、以便您可以将 ADC 代码视为 ADC 的输入电压。 事实上、您还可以将数据转换为 TIA 所见的 PD 电流。

    有关 ADC 代码的 ADC 输入电压、请参阅 AFE4404数据表第8.3.4节;有关饱和的应用部分(第9节)、请参阅。