Quantcast
Channel: Forums - Recent Threads
Viewing all articles
Browse latest Browse all 262198

AFE4404: Getting troubles with calculating heart rate

$
0
0

Part Number:AFE4404

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
}


Viewing all articles
Browse latest Browse all 262198

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>