Hello!
I connected the AFE4404 sensor to the microcontroller, set the registers in accordance with the standard settings (see below). My task is to calculate the heart rate, for this I activate the green LED1 and at 100Hz I get ADC data from register 0x2C for 10 seconds (1024 values).
But after converting ADC data, I get only noises (the sensor is leaning against my hand).
What could be the problem?
#define FIELD_SIZE 32U #define ADC_DATA_SIZE 24U #define ADC_SIGN_FIELD_SIZE 3U #define ADC_PAYLOAD_FIELD_SIZE ADC_DATA_SIZE-ADC_SIGN_FIELD_SIZE //21 #define ADC_SIGN_FIELD_MASK 0x00E00000U #define ADC_PAYLOAD_FIELD_MASK 0x001FFFFFU #define SCALE_DIVISION 1.2/pow(2,21) #define MAX_ADC_SCALE_RANGE 1.2 #define MIN_ADC_SCALE_RANGE (-1.2) #define POL 0x0<<ADC_PAYLOAD_FIELD_SIZE ///Positive and lower than positive full-scale (within full-scale range) 000 #define POL_MASK 0x00000000U #define POH 0x1<<ADC_PAYLOAD_FIELD_SIZE ///Positive and higher than positive full-scale (outside full-scale range) 001 #define POH_MASK 0x00200000U #define NEL 0x6<<ADC_PAYLOAD_FIELD_SIZE ///Negative and lower than negative full-scale (outside full-scale range) 110 #define NEL_MASK 0x00C00000U #define NEH 0x7<<ADC_PAYLOAD_FIELD_SIZE ///Negative and higher than negative full-scale (within full-scale range) 111 #define NEH_MASK 0x00E00000U float adc_to_float(int32_t field32_t) { field32_t&=~OPTION_BIT_MASK; if((field32_t&ADC_SIGN_FIELD_MASK)==POL) { field32_t&=ADC_PAYLOAD_FIELD_MASK; return field32_t*(SCALE_DIVISION); } else if((field32_t&ADC_SIGN_FIELD_MASK)==POH) ///outside the scale return MAX_ADC_SCALE_RANGE; else if((field32_t&ADC_SIGN_FIELD_MASK)==NEL) ///outside the scale return MIN_ADC_SCALE_RANGE; else if((field32_t&ADC_SIGN_FIELD_MASK)==NEH) { field32_t&=ADC_PAYLOAD_FIELD_MASK; return field32_t*(-SCALE_DIVISION); } return 0; }
void AFE4404_Reg_Init(void) { AFE4404_Reg_Write(0, 0); // Write enable /* RECEIVE-TRANCEIVE TIMING CONFIGURATIONS */ ///transeive | REG_NAME | OPTIM_VALUE | AFE4404_Reg_Write(9, 0); //AFE_LED2LEDSTC ..0 AFE4404_Reg_Write(10, 399); //AFE_LED2LEDENDC ..398 ///receive led AFE4404_Reg_Write(1, 100); //AFE_LED2STC ..100 AFE4404_Reg_Write(2, 399); //AFE_LED2ENDC ..398 ///receive ambient AFE4404_Reg_Write(5, 501); //AFE_ALED2STC ..500 AFE4404_Reg_Write(6, 800); //AFE_ALED2ENDC ..798 ///so on AFE4404_Reg_Write(3, 802); //AFE_LED1LEDSTC ..800 AFE4404_Reg_Write(4, 1201); //AFE_LED1LEDENDC ..1198 AFE4404_Reg_Write(7, 902); //AFE_LED1STC ..900 AFE4404_Reg_Write(8, 1201); //AFE_LED1ENDC ..1198 AFE4404_Reg_Write(11, 1303); //AFE_ALED1STC ..1300 AFE4404_Reg_Write(12, 1602); //AFE_ALED1ENDC ..1598 AFE4404_Reg_Write(54, 401); //AFE_LED3LEDSTC ..400 AFE4404_Reg_Write(55, 800); //AFE_LED3LEDENDC ..798 /* CONVERSION TIMING CONFIG */ AFE4404_Reg_Write(13, 409); //AFE_LED2CONVST ..5608 AFE4404_Reg_Write(14, 1468); //AFE_LED2CONVEND ..6067 AFE4404_Reg_Write(15, 1478); //AFE_ALED2CONVST ..6077 AFE4404_Reg_Write(16, 2537); //AFE_ALED2CONVEND ..6536 AFE4404_Reg_Write(17, 2547); //AFE_LED1CONVST ..6546 AFE4404_Reg_Write(18, 3606); //AFE_LED1CONVEND ..7006 AFE4404_Reg_Write(19, 3616); //AFE_ALED1CONVST ..7016 AFE4404_Reg_Write(20, 4675); //AFE_ALED1CONVEND ..7475 /* START CONVERSION TIMING CONFIG */ AFE4404_Reg_Write(21, 401); //AFE_ADCRSTSTCT0 ..5600 AFE4404_Reg_Write(22, 407); //AFE_ADCRSTENDCT0 ..5606 AFE4404_Reg_Write(23, 1470); //AFE_ADCRSTSTCT1 ..6069 AFE4404_Reg_Write(24, 1476); //AFE_ADCRSTENDCT1 ..6075 AFE4404_Reg_Write(25, 2539); //AFE_ADCRSTSTCT2 ..6538 AFE4404_Reg_Write(26, 2545); //AFE_ADCRSTENDCT2 ..6544 AFE4404_Reg_Write(27, 3608); //AFE_ADCRSTSTCT3 ..7008 AFE4404_Reg_Write(28, 3614); //AFE_ADCRSTENDCT3 ..7014 /* PULSE RATE FREQUENCY SCANNING PERIOD */ AFE4404_Reg_Write(29, 39999); //AFE_PRPCOUNT ..39999 AFE4404_Reg_Write(57, 0); //CLKDIV_PRF 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, 0x000103); //AFE_TIA_GAIN (LED1) LED1/LED1AMB gain = 50K ADC_RDY_MANUAL_DURATION_SET_EN AFE4404_Reg_Write(58, 0x000000); //AFE_DAC_SETTING_REG AFE4404_Reg_Write(34, 0x0030CF); //LED3 - 3.125mA; LED2 - 3.125mA; LED1 - 12.5mA <=//default 0x0030CF AFE4404_Reg_Write(35, 0x104018); //DYN1, LEDCurr, DYN2, Ext CLK, DYN3, DYN4 //0x000200); - 0x200 Osc mode //AFE_CONTROL2 AFE4404_Reg_Write(49, 0x000020); //ENABLE_INPUT_SHORT /* POWER DOWN PERIOD CONFIG */ AFE4404_Reg_Write(50, 5475); //AFE_DPD1STC //PDNCYCLESTC ..7675 AFE4404_Reg_Write(51, 39199); //AFE_DPD1ENDC //PDNCYCLEENDC ..39199 /* ADC_RDY_DURATION */ AFE4404_Reg_Write(52, 4700); //PROG_TG_STC AFE4404_Reg_Write(53, 5200); //PROG_TG_ENDC //AFE4404_Reg_Write(61, DEC_FACTOR_4); //decimation enable with corresponding factor AFE4404_Reg_Write(0, 1); // Read enable }