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.

Mysterious, intermittent 15-20 Hz noise using ADS1291

Other Parts Discussed in Thread: ADS1291

We're using the ADS1291 for ECG capture and we sometimes see noise on the signal.  We're operating on a coin cell, so we have a theory that it's due to low battery, but it's not consistent nor easily repeatable.  Rather than assuming that we're correct, I'd like to know what possible causes there are.  I've attached a schematic as well as images of the noise, as reported by our app via Bluetooth.

Thanks,

Scott

ADS1291 ckt.pdf

  • Hi Scott,

    Can you provide some details on the time scale (X axis)? What register settings are you using with the ADS1291?
  • The app guy is telling me that those plots show 1 second of time.  As for the register settings, I'm still trying to find out those.

    Scott

  • The init code is below, I'm told.

    /*
    * @brief Set chest strap, power-up config or initialization
    * - Do system reset, wait at least 18*1/512e-3 >= 36us.
    * - Send SDATC command, this will stop RDATC default
    * - Update resp-1 to 0x02, based on pg 48. for ADS1291
    * - Update resp-2 with |=0x04; based on pg 49. for ADS1291
    * - Channel 1, PGA gain=6 (default), Power on, Noraml input
    * - Channel 2, make sure it is turned off, input short
    * - Configure-1, Continuos mode, ODR to 250Hz
    * - Configure-2, Internal ref On --> 0xA0
    * - \todo Lead off detection DC, need to check power advantage
    * @param[in] 0,called after power ON, 1, called after reset
    * @return NRF_SUCCESS on success, else error code
    */
    uint32_t ecg_config_ecg_init(uint8_t init_condition, uint8_t gain){
    uint32_t status;
    uint8_t tem;

    if (init_condition == 0){

    ECG_CONFIG_SET_PWRDWN_PIN;
    /* wait minimum of 32ms after POR */
    ecg_config_delay_ms(1000); /* 1000ms is plenty*/
    /* Reset pulse*/
    #ifdef ECG_CONFIG_SW_RESET
    //System reset command
    status = ti_ecg_sys_data_command(ECG_SDATAC);
    if (status != NRF_SUCCESS){ return(status); }
    status = ti_ecg_sys_data_command(ECG_RESET);
    if (status != NRF_SUCCESS){ return(status); }
    #else
    //System reset HW pin
    ecg_config_reset_hw();
    #endif
    }
    ecg_config_delay_ms(1); /* needs 18 tck or 36us, putting 1ms*/
    status = ti_ecg_sys_data_command(ECG_SDATAC);/* could be a repeat*/
    if (status != NRF_SUCCESS){ return(status); }
    status = ecg_config_stop();
    if (status != NRF_SUCCESS){ return(status); }

    /* Update resp1 reg to recommended 0x02*/
    status = ti_ecg_write_reg(ECG_REG_RESP1, 0x02);
    if (status != NRF_SUCCESS){ return(status); }
    /* Update resp2, BIT3=1 recommended*/
    status = ti_ecg_read_reg(ECG_REG_RESP2, &tem);
    if (status != NRF_SUCCESS){ return(status); }
    tem = 0x07;
    status = ti_ecg_write_reg(ECG_REG_RESP2, tem);
    if (status != NRF_SUCCESS){ return(status); }
    /* Uppdate channel-1*/
    status = ecg_config_set_pga(gain);
    if (status != NRF_SUCCESS){ return(status); }
    status = ecg_config_channel_on(1);
    if (status != NRF_SUCCESS){ return(status); }
    status = ecg_config_set_mode(STANDARD_MODE);
    if (status != NRF_SUCCESS){ return(status); }
    /* update channel-2*/
    status = ecg_config_channel_off(2);
    if (status != NRF_SUCCESS){ return(status); }
    /* Update config-1*/
    status = ecg_config_set_data_mode(CONTINUOUS);
    if (status != NRF_SUCCESS){ return(status); }
    status = ecg_config_set_odr(250);
    if (status != NRF_SUCCESS){ return(status); }

    // Comparator threshold at 95% and 5%, current source or sink resistor
    #ifdef ENABLE_LEAD_ON
    status = ti_ecg_write_reg(ECG_REG_LOFF, 0x10);
    if (status != NRF_SUCCESS){ return(status); }

    status = ti_ecg_read_reg(ECG_REG_LOFF, &tem);
    if (status != NRF_SUCCESS || tem != 0x10){ return(status); }
    #endif
    /*
    status = ecg_config_set_data_mode(CONTINUOUS);
    if (status != NRF_SUCCESS){ return(status); }
    */
    /* Update config-2*/
    status = ecg_config_config2_register();

    #ifdef ENABLE_LEAD_ON
    // Turn on both P- and N-side of channel 1 for lead-off sensing
    status = ti_ecg_write_reg(ECG_REG_LOFF_SENS, 0x13);
    if (status != NRF_SUCCESS){ return(status); }

    status = ti_ecg_read_reg(ECG_REG_LOFF_SENS, &tem);
    if (status != NRF_SUCCESS || tem != 0x13){ return(status); }
    #endif

    ecg_config_delay_ms(1);
    return(status);
    }