您好!
我正在构建基于 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 代码未先转换为十进制数?