Important changes to forums and questions
All forums and questions are now archived. To start a new conversation or read the latest updates go to forums.mbed.com.
6 years, 5 months ago.
MAX30003 ECG Recording
Hi,
I'm trying to read raw ECG data from the MAX30003.
After writing to the appropriate configuration registers I write to the SYNCH register, expecting the ECG FIFO to start filling with data. Upon reading the FIFO I am receiving ETAG 110 (FIFO Empty) for every sample. It appears as if the ECG is never triggered but I am not sure why.
Here is my configuration:
ECG configuration settings
ecgAFE.writeRegister( MAX30003::SW_RST , 0); // General config register setting MAX30003::GeneralConfiguration_u CNFG_GEN_r; CNFG_GEN_r.bits.fmstr = 0b00; // Set FMSTR to 32768 Hz CNFG_GEN_r.bits.en_ecg = 0b1; // Enable ECG channel CNFG_GEN_r.bits.rbiasn = 0b0; // Enable resistive bias on negative input CNFG_GEN_r.bits.rbiasp = 0b0; // Enable resistive bias on positive input CNFG_GEN_r.bits.en_rbias = 0b00; // Enable resistive bias CNFG_GEN_r.bits.imag = 0b000; // Current magnitude = 10nA CNFG_GEN_r.bits.en_dcloff = 0b00; // Enable DC lead-off detection ecgAFE.writeRegister( MAX30003::CNFG_GEN , CNFG_GEN_r.all); // ECG Config register setting MAX30003::ECGConfiguration_u CNFG_ECG_r; CNFG_ECG_r.bits.dlpf = 0b00; // Digital LPF cutoff = 40Hz CNFG_ECG_r.bits.dhpf = 0b0; // Digital HPF cutoff = 0.5Hz CNFG_ECG_r.bits.gain = 0b00; // ECG gain = 160V/V CNFG_ECG_r.bits.rate = 0b10; // Sample rate = 128 sps ecgAFE.writeRegister( MAX30003::CNFG_ECG , CNFG_ECG_r.all); //R-to-R configuration MAX30003::RtoR1Configuration_u CNFG_RTOR_r; CNFG_RTOR_r.bits.en_rtor = 0b0; // Enable R-to-R detection ecgAFE.writeRegister( MAX30003::CNFG_RTOR1 , CNFG_RTOR_r.all); //Manage interrupts register setting MAX30003::ManageInterrupts_u MNG_INT_r; MNG_INT_r.bits.efit = 0b00011; // Assert EINT w/ 4 unread samples MNG_INT_r.bits.clr_rrint = 0b01; // Clear R-to-R on RTOR reg. read back ecgAFE.writeRegister( MAX30003::MNGR_INT , MNG_INT_r.all); //Enable interrupts register setting MAX30003::EnableInterrupts_u EN_INT_r; EN_INT_r.all = 0b0; EN_INT_r.bits.en_eint = 0b1; // Enable EINT interrupt EN_INT_r.bits.en_rrint = 0b0; // Disable R-to-R interrupt EN_INT_r.bits.intb_type = 0b11; // Open-drain NMOS with internal pullup ecgAFE.writeRegister( MAX30003::EN_INT , EN_INT_r.all); //Dynamic modes config MAX30003::ManageDynamicModes_u MNG_DYN_r; MNG_DYN_r.bits.fast = 0b0; // Fast recovery mode disabled ecgAFE.writeRegister( MAX30003::MNGR_DYN , MNG_DYN_r.all); // MUX Config MAX30003::MuxConfiguration_u CNFG_MUX_r; CNFG_MUX_r.bits.openn = 0b0; // Connect ECGN to AFE channel CNFG_MUX_r.bits.openp = 0b0; // Connect ECGP to AFE channel ecgAFE.writeRegister( MAX30003::CNFG_EMUX , CNFG_MUX_r.all);
As soon as this is complete, as previously mentioned, I write to the SYNCH register and then begin reading samples every 7.8125ms. Also, it should be noted, that the unread records interrupt never triggers, also leading me to believe that ECG has not started recording.
Any help would be appreciated, thanks. Adam
Question relating to:
1 Answer
6 years, 5 months ago.
Hello Adam,
Some of your comments don't seem to match your configurations. Have you taken a look at these programs?
https://os.mbed.com/teams/Maxim-Integrated/code/MAX30003WING_Demo_Debug/
https://os.mbed.com/teams/Maxim-Integrated/code/MAX30003WING_Demo_QRS/
Their main.cpp files have a configuration function that have comments throughout that you can check to see if your own configuration is what you intended. Hope this helps!
-Karen, team Mbed
PS: To make your program easily visible, you can sandwich the block of code between <<code>> and <</code>>
. Otherwise it might get messed up due to formatting!
If this solved your question, please make sure to click the "Thanks" link below!
Hi Karen,
Thanks for taking the time to answer. I've excluded some code, such as the writing to SYNCH. Which lines do you think specifically do not match up?
Regardless of this, I actually managed to get the data to stream using an external FCLK which is suitable for my purposes at this point in time.
Thanks! Adam
posted by 26 Jun 2018Hi Adam,
I'm glad it's working out alright! Looking at a snippet of code from the MAX30003WING_Demo_Debug:
// General config register setting MAX30003::GeneralConfiguration_u CNFG_GEN_r; CNFG_GEN_r.bits.en_ecg = 1; // Enable ECG channel CNFG_GEN_r.bits.rbiasn = 1; // Enable resistive bias on negative input CNFG_GEN_r.bits.rbiasp = 1; // Enable resistive bias on positive input CNFG_GEN_r.bits.en_rbias = 1; // Enable resistive bias CNFG_GEN_r.bits.imag = 2; // Current magnitude = 10nA CNFG_GEN_r.bits.en_dcloff = 1; // Enable DC lead-off detection ecgAFE.writeRegister( MAX30003::CNFG_GEN , CNFG_GEN_r.all); // ECG Config register setting MAX30003::ECGConfiguration_u CNFG_ECG_r; CNFG_ECG_r.bits.dlpf = 1; // Digital LPF cutoff = 40Hz CNFG_ECG_r.bits.dhpf = 1; // Digital HPF cutoff = 0.5Hz CNFG_ECG_r.bits.gain = 3; // ECG gain = 160V/V CNFG_ECG_r.bits.rate = 2; // Sample rate = 128 sps ecgAFE.writeRegister( MAX30003::CNFG_ECG , CNFG_ECG_r.all);
The code comments seem to match your comments, but they have differing code. I myself have not used this board before, so I wasn't sure if that is what you intended.
-Karen, team Mbed
posted by 26 Jun 2018