This is one of the demo programs for the MAX30003WING. The program outputs the raw data serially to graphically reproduce the QRS complex. A serial plotter is needed to graph the data.

Dependencies:   MAX30003 max32630fthr

Fork of MAX30003_Demo_Plot by John Greene

Files at this revision

API Documentation at this revision

Comitter:
coreyharris
Date:
Wed Aug 16 22:59:59 2017 +0000
Child:
1:86843c27cc81
Commit message:
Stable demo for MAX30003, need to add ETAG monitoring if possible

Changed in this revision

MAX30003.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
max32630fthr.lib Show annotated file Show diff for this revision Revisions of this file
mbed-os.lib Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MAX30003.lib	Wed Aug 16 22:59:59 2017 +0000
@@ -0,0 +1,1 @@
+http://developer.mbed.org/teams/MaximIntegrated/code/MAX30003/#313e09ea1738
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Wed Aug 16 22:59:59 2017 +0000
@@ -0,0 +1,135 @@
+#include "mbed.h"
+#include "max32630fthr.h"
+#include "MAX30003.h"
+
+MAX32630FTHR pegasus(MAX32630FTHR::VIO_3V3);
+
+void ecg_config(MAX30003 &ecgAFE);
+
+/* ECG FIFO nearly full callback */
+volatile bool ecgFIFOIntFlag = 0; 
+void ecgFIFO_callback()  {
+    
+    ecgFIFOIntFlag = 1;
+
+}  
+
+int main()
+{
+    DigitalOut rLed(LED1, LED_OFF);
+    DigitalOut gLed(LED2, LED_OFF);
+    DigitalOut bLed(LED3, LED_OFF);
+    
+    Serial pc(USBTX, USBRX);
+    pc.baud(115200);
+    
+    pc.printf("Running.... \r\n\r\n");
+    wait(0.5);
+    
+    SPI spiBus(SPI2_MOSI, SPI2_MISO, SPI2_SCK);
+    
+    MAX30003 *ecgAFE;
+    ecgAFE = new MAX30003(spiBus, P5_3);
+    ecg_config(*ecgAFE);
+    
+    /* Peripehral configuration */
+    InterruptIn ecgFIFO_int(P5_4);          // Config P5_4 as int. in for the ecg FIFO almost full interrupt
+    ecgFIFO_int.fall(&ecgFIFO_callback);    //
+    
+    pc.printf("Config. complete.... \r\n\r\n");
+    wait(0.5);
+    
+    uint32_t ecgFIFO[32];
+    int16_t ecgSample, ETAG;
+    while(1) 
+    {
+        /* Read back ECG samples from the FIFO */
+        if( ecgFIFOIntFlag ) {
+                
+            for( int i = 0; i < 16; i++  ){
+                ecgFIFO[i] = ecgAFE->readRegister( MAX30003::ECG_FIFO );
+                ecgSample = ecgFIFO[i] >> 8;
+                ETAG = ( ecgFIFO[i] >> 3 ) && 0x07;
+                
+                pc.printf("Sample : %5d, \t ETAG : 0x%x \r\n", ecgSample, ETAG);
+            }
+                
+            bLed = !bLed;
+            ecgFIFOIntFlag = 0;     
+                                
+        }
+    }
+}
+
+
+
+
+void ecg_config(MAX30003& ecgAFE) { 
+
+        // Reset ECG to clear registers
+        ecgAFE.writeRegister( MAX30003::SW_RST , 0);
+        
+    
+    
+        // General config register setting
+        MAX30003::GeneralConfiguration_u CNFG_GEN_r;
+        CNFG_GEN_r.bits.en_ecg = 1;
+        CNFG_GEN_r.bits.rbiasn = 1;
+        CNFG_GEN_r.bits.rbiasp = 1;
+        CNFG_GEN_r.bits.en_rbias = 1;
+        CNFG_GEN_r.bits.imag = 2;
+        CNFG_GEN_r.bits.en_dcloff = 1;    
+        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;
+        CNFG_ECG_r.bits.dhpf = 1;
+        CNFG_ECG_r.bits.gain = 3; 
+        CNFG_ECG_r.bits.rate = 3;  
+        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 = 1;    
+        ecgAFE.writeRegister( MAX30003::CNFG_RTOR1 , CNFG_RTOR_r.all);
+    
+    
+        
+        // Manage interrupts register setting
+        MAX30003::ManageInterrupts_u MNG_INT_r;
+        MNG_INT_r.bits.efit = 0b01111;    
+        ecgAFE.writeRegister( MAX30003::MNGR_INT , MNG_INT_r.all);
+    
+
+    
+        // Enable interrupts register setting
+        MAX30003::EnableInterrupts_u EN_INT_r;
+        EN_INT_r.all = 0;
+        EN_INT_r.bits.en_eint = 1;
+        EN_INT_r.bits.intb_type = 0b11;
+        ecgAFE.writeRegister( MAX30003::EN_INT , EN_INT_r.all);
+    
+    
+    
+        // Dyanmic modes config
+        MAX30003::ManageDynamicModes_u MNG_DYN_r;
+        MNG_DYN_r.bits.fast = 0;    
+        ecgAFE.writeRegister( MAX30003::MNGR_DYN , MNG_DYN_r.all);
+    
+    
+    
+        // MUX Config
+        MAX30003::MuxConfiguration_u CNFG_MUX_r;
+        CNFG_MUX_r.bits.pol = 0;    
+        ecgAFE.writeRegister( MAX30003::CNFG_EMUX , CNFG_MUX_r.all);
+
+    
+        ecgAFE.writeRegister( MAX30003::SYNCH , 0);
+    
+}  
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/max32630fthr.lib	Wed Aug 16 22:59:59 2017 +0000
@@ -0,0 +1,1 @@
+http://developer.mbed.org/teams/MaximIntegrated/code/max32630fthr/#02d6b69121e5
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed-os.lib	Wed Aug 16 22:59:59 2017 +0000
@@ -0,0 +1,1 @@
+https://github.com/ARMmbed/mbed-os/#269f58d75b752a4e67a6a2d8c5c698635ffd6752