3 channel_MUX

Dependencies:   BufferedSerial MAX30003 max32630fthr1 DS1307

Committer:
parthsagar2010
Date:
Tue May 25 18:49:41 2021 +0000
Revision:
12:2f1730e0e638
Parent:
11:1d4ecbca034e
Child:
13:3a49fb19b94b
Ahmed_mux

Who changed what in which revision?

UserRevisionLine numberNew contents of line
coreyharris 0:38c49bc37c7c 1 #include "mbed.h"
coreyharris 0:38c49bc37c7c 2 #include "max32630fthr.h"
parthsagar2010 10:3709e8f3d089 3 #include "MAX30003.h"
parthsagar2010 10:3709e8f3d089 4
coreyharris 0:38c49bc37c7c 5 MAX32630FTHR pegasus(MAX32630FTHR::VIO_3V3);
parthsagar2010 10:3709e8f3d089 6
coreyharris 0:38c49bc37c7c 7 void ecg_config(MAX30003 &ecgAFE);
parthsagar2010 12:2f1730e0e638 8 DigitalOut led1(P2_0,LED_ON);
parthsagar2010 12:2f1730e0e638 9
parthsagar2010 12:2f1730e0e638 10
parthsagar2010 12:2f1730e0e638 11
parthsagar2010 10:3709e8f3d089 12 /* ECG FIFO nearly full callback */
coreyharris 0:38c49bc37c7c 13 volatile bool ecgFIFOIntFlag = 0;
parthsagar2010 10:3709e8f3d089 14 void ecgFIFO_callback() {
coreyharris 0:38c49bc37c7c 15
coreyharris 0:38c49bc37c7c 16 ecgFIFOIntFlag = 1;
parthsagar2010 10:3709e8f3d089 17
coreyharris 0:38c49bc37c7c 18 }
parthsagar2010 12:2f1730e0e638 19 Timer timer1;
parthsagar2010 12:2f1730e0e638 20 //void MUX()
parthsagar2010 12:2f1730e0e638 21 //{
parthsagar2010 12:2f1730e0e638 22 DigitalOut EN(P1_7);
parthsagar2010 12:2f1730e0e638 23 DigitalOut A0(P1_4);
parthsagar2010 12:2f1730e0e638 24 DigitalOut A1(P7_2);
parthsagar2010 12:2f1730e0e638 25 //}
parthsagar2010 12:2f1730e0e638 26 bool mux1= false ;
parthsagar2010 12:2f1730e0e638 27 bool mux2= false ;
parthsagar2010 12:2f1730e0e638 28 bool mux3= false ;
parthsagar2010 12:2f1730e0e638 29
parthsagar2010 10:3709e8f3d089 30
coreyharris 0:38c49bc37c7c 31 int main()
coreyharris 3:420d5efbd967 32 {
parthsagar2010 12:2f1730e0e638 33
coreyharris 6:86ac850c718d 34 // Constants
coreyharris 4:06e258ff0b97 35 const int EINT_STATUS_MASK = 1 << 23;
coreyharris 6:86ac850c718d 36 const int FIFO_OVF_MASK = 0x7;
coreyharris 6:86ac850c718d 37 const int FIFO_VALID_SAMPLE_MASK = 0x0;
coreyharris 6:86ac850c718d 38 const int FIFO_FAST_SAMPLE_MASK = 0x1;
coreyharris 6:86ac850c718d 39 const int ETAG_BITS_MASK = 0x7;
coreyharris 3:420d5efbd967 40
parthsagar2010 12:2f1730e0e638 41
parthsagar2010 12:2f1730e0e638 42
parthsagar2010 12:2f1730e0e638 43 // EN=0;
parthsagar2010 12:2f1730e0e638 44 // EN=1;
parthsagar2010 12:2f1730e0e638 45 // A0=0;
parthsagar2010 12:2f1730e0e638 46 // A1=0;
parthsagar2010 12:2f1730e0e638 47
parthsagar2010 10:3709e8f3d089 48 // Ports and serial connections
parthsagar2010 12:2f1730e0e638 49 Serial pc(P0_0,P0_1); // Use USB debug probe for serial link
parthsagar2010 10:3709e8f3d089 50 pc.baud(230400); // Baud rate = 115200
parthsagar2010 12:2f1730e0e638 51 DigitalOut bLed(LED3, LED_ON);
parthsagar2010 12:2f1730e0e638 52 DigitalOut gLed(LED2, LED_ON);
parthsagar2010 12:2f1730e0e638 53 DigitalOut rLed(LED1, LED_ON);
parthsagar2010 12:2f1730e0e638 54 // Debug LEDs
coreyharris 1:86843c27cc81 55
coreyharris 1:86843c27cc81 56 InterruptIn ecgFIFO_int(P5_4); // Config P5_4 as int. in for the
parthsagar2010 10:3709e8f3d089 57 ecgFIFO_int.fall(&ecgFIFO_callback); // ecg FIFO almost full interrupt
coreyharris 0:38c49bc37c7c 58
parthsagar2010 11:1d4ecbca034e 59 //SPI spiBus(SPI2_MOSI, SPI2_MISO, SPI2_SCK); // SPI bus, P5_1 = MOSI,
coreyharris 1:86843c27cc81 60 // P5_2 = MISO, P5_0 = SCK
coreyharris 0:38c49bc37c7c 61
parthsagar2010 11:1d4ecbca034e 62
parthsagar2010 11:1d4ecbca034e 63 SPI spiBus(P5_1, P5_2, P5_0);
parthsagar2010 11:1d4ecbca034e 64
coreyharris 4:06e258ff0b97 65 MAX30003 ecgAFE(spiBus, P5_3); // New MAX30003 on spiBus, CS = P5_3
coreyharris 4:06e258ff0b97 66 ecg_config(ecgAFE); // Config ECG
coreyharris 1:86843c27cc81 67
coreyharris 0:38c49bc37c7c 68
coreyharris 4:06e258ff0b97 69 ecgAFE.writeRegister( MAX30003::SYNCH , 0);
coreyharris 0:38c49bc37c7c 70
coreyharris 4:06e258ff0b97 71 uint32_t ecgFIFO, readECGSamples, idx, ETAG[32], status;
coreyharris 1:86843c27cc81 72 int16_t ecgSample[32];
parthsagar2010 12:2f1730e0e638 73 int x=0;
parthsagar2010 10:3709e8f3d089 74 while(1) {
parthsagar2010 11:1d4ecbca034e 75
parthsagar2010 12:2f1730e0e638 76 while (x<100 && mux1==false)
parthsagar2010 12:2f1730e0e638 77 {
parthsagar2010 12:2f1730e0e638 78 // if (0<x<=1000 && mux1==false)
parthsagar2010 12:2f1730e0e638 79 // {
parthsagar2010 12:2f1730e0e638 80
parthsagar2010 12:2f1730e0e638 81 EN = 0;
parthsagar2010 12:2f1730e0e638 82 EN = 1;
parthsagar2010 12:2f1730e0e638 83 A0 = 0;
parthsagar2010 12:2f1730e0e638 84 A1 = 0;
parthsagar2010 12:2f1730e0e638 85 mux1= true ;
parthsagar2010 12:2f1730e0e638 86 }
parthsagar2010 12:2f1730e0e638 87 while (101<x<=200 && mux2==false)
parthsagar2010 12:2f1730e0e638 88 {
parthsagar2010 12:2f1730e0e638 89 gLed = 1 ;
parthsagar2010 12:2f1730e0e638 90 EN = 0;
parthsagar2010 12:2f1730e0e638 91 EN = 1;
parthsagar2010 12:2f1730e0e638 92 A0 = 1;
parthsagar2010 12:2f1730e0e638 93 A1 = 0;
parthsagar2010 12:2f1730e0e638 94 mux2=true ;
parthsagar2010 12:2f1730e0e638 95 }
parthsagar2010 12:2f1730e0e638 96
parthsagar2010 12:2f1730e0e638 97 while (201<x<=300 && mux3==false)
parthsagar2010 12:2f1730e0e638 98 {
parthsagar2010 12:2f1730e0e638 99 rLed = 1 ;
parthsagar2010 12:2f1730e0e638 100 EN = 0 ;
parthsagar2010 12:2f1730e0e638 101 EN = 1;
parthsagar2010 12:2f1730e0e638 102 A0 = 0;
parthsagar2010 12:2f1730e0e638 103 A1 = 1;
parthsagar2010 12:2f1730e0e638 104 mux3=true;
parthsagar2010 12:2f1730e0e638 105 }
parthsagar2010 12:2f1730e0e638 106
parthsagar2010 12:2f1730e0e638 107
coreyharris 4:06e258ff0b97 108 // Read back ECG samples from the FIFO
parthsagar2010 10:3709e8f3d089 109 if( ecgFIFOIntFlag ) {
parthsagar2010 12:2f1730e0e638 110 timer1.start();
coreyharris 2:812d40f1853d 111
coreyharris 5:f8d1f651bef5 112 ecgFIFOIntFlag = 0;
coreyharris 4:06e258ff0b97 113 status = ecgAFE.readRegister( MAX30003::STATUS ); // Read the STATUS register
coreyharris 2:812d40f1853d 114
coreyharris 3:420d5efbd967 115 // Check if EINT interrupt asserted
parthsagar2010 10:3709e8f3d089 116 if ( ( status & EINT_STATUS_MASK ) == EINT_STATUS_MASK ) {
coreyharris 3:420d5efbd967 117
coreyharris 4:06e258ff0b97 118 readECGSamples = 0; // Reset sample counter
coreyharris 3:420d5efbd967 119
coreyharris 2:812d40f1853d 120 do {
coreyharris 6:86ac850c718d 121 ecgFIFO = ecgAFE.readRegister( MAX30003::ECG_FIFO ); // Read FIFO
coreyharris 4:06e258ff0b97 122 ecgSample[readECGSamples] = ecgFIFO >> 8; // Isolate voltage data
coreyharris 6:86ac850c718d 123 ETAG[readECGSamples] = ( ecgFIFO >> 3 ) & ETAG_BITS_MASK; // Isolate ETAG
coreyharris 4:06e258ff0b97 124 readECGSamples++; // Increment sample counter
coreyharris 3:420d5efbd967 125
coreyharris 3:420d5efbd967 126 // Check that sample is not last sample in FIFO
coreyharris 6:86ac850c718d 127 } while ( ETAG[readECGSamples-1] == FIFO_VALID_SAMPLE_MASK ||
coreyharris 6:86ac850c718d 128 ETAG[readECGSamples-1] == FIFO_FAST_SAMPLE_MASK );
coreyharris 2:812d40f1853d 129
coreyharris 3:420d5efbd967 130 // Check if FIFO has overflowed
parthsagar2010 10:3709e8f3d089 131 if( ETAG[readECGSamples - 1] == FIFO_OVF_MASK ){
coreyharris 3:420d5efbd967 132 ecgAFE.writeRegister( MAX30003::FIFO_RST , 0); // Reset FIFO
parthsagar2010 10:3709e8f3d089 133 bLed = 1;//notifies the user that an over flow occured
coreyharris 3:420d5efbd967 134 }
coreyharris 3:420d5efbd967 135
coreyharris 4:06e258ff0b97 136 // Print results
parthsagar2010 10:3709e8f3d089 137 for( idx = 0; idx < readECGSamples; idx++ ) {
parthsagar2010 10:3709e8f3d089 138 pc.printf("%6d\r\n", ecgSample[idx]);
parthsagar2010 11:1d4ecbca034e 139 // pc.printf("Hello\n");
coreyharris 6:86ac850c718d 140 }
parthsagar2010 12:2f1730e0e638 141 // bLed = ! bLed;
parthsagar2010 12:2f1730e0e638 142 // gLed = ! gLed;
parthsagar2010 12:2f1730e0e638 143 // rLed = ! rLed;
parthsagar2010 12:2f1730e0e638 144
parthsagar2010 12:2f1730e0e638 145
parthsagar2010 12:2f1730e0e638 146 x++;
parthsagar2010 12:2f1730e0e638 147 if (x>300)
parthsagar2010 12:2f1730e0e638 148
parthsagar2010 12:2f1730e0e638 149 {x=0;}
parthsagar2010 12:2f1730e0e638 150 }
coreyharris 0:38c49bc37c7c 151 }
parthsagar2010 12:2f1730e0e638 152
parthsagar2010 12:2f1730e0e638 153
parthsagar2010 12:2f1730e0e638 154 }
coreyharris 0:38c49bc37c7c 155 }
parthsagar2010 10:3709e8f3d089 156
parthsagar2010 10:3709e8f3d089 157
parthsagar2010 10:3709e8f3d089 158
parthsagar2010 10:3709e8f3d089 159
coreyharris 0:38c49bc37c7c 160 void ecg_config(MAX30003& ecgAFE) {
parthsagar2010 10:3709e8f3d089 161
coreyharris 1:86843c27cc81 162 // Reset ECG to clear registers
coreyharris 1:86843c27cc81 163 ecgAFE.writeRegister( MAX30003::SW_RST , 0);
coreyharris 0:38c49bc37c7c 164
coreyharris 1:86843c27cc81 165 // General config register setting
coreyharris 1:86843c27cc81 166 MAX30003::GeneralConfiguration_u CNFG_GEN_r;
coreyharris 3:420d5efbd967 167 CNFG_GEN_r.bits.en_ecg = 1; // Enable ECG channel
coreyharris 3:420d5efbd967 168 CNFG_GEN_r.bits.rbiasn = 1; // Enable resistive bias on negative input
coreyharris 3:420d5efbd967 169 CNFG_GEN_r.bits.rbiasp = 1; // Enable resistive bias on positive input
coreyharris 3:420d5efbd967 170 CNFG_GEN_r.bits.en_rbias = 1; // Enable resistive bias
coreyharris 3:420d5efbd967 171 CNFG_GEN_r.bits.imag = 2; // Current magnitude = 10nA
coreyharris 3:420d5efbd967 172 CNFG_GEN_r.bits.en_dcloff = 1; // Enable DC lead-off detection
coreyharris 1:86843c27cc81 173 ecgAFE.writeRegister( MAX30003::CNFG_GEN , CNFG_GEN_r.all);
coreyharris 1:86843c27cc81 174
coreyharris 1:86843c27cc81 175
coreyharris 1:86843c27cc81 176 // ECG Config register setting
coreyharris 1:86843c27cc81 177 MAX30003::ECGConfiguration_u CNFG_ECG_r;
coreyharris 3:420d5efbd967 178 CNFG_ECG_r.bits.dlpf = 1; // Digital LPF cutoff = 40Hz
coreyharris 3:420d5efbd967 179 CNFG_ECG_r.bits.dhpf = 1; // Digital HPF cutoff = 0.5Hz
coreyharris 3:420d5efbd967 180 CNFG_ECG_r.bits.gain = 3; // ECG gain = 160V/V
coreyharris 3:420d5efbd967 181 CNFG_ECG_r.bits.rate = 2; // Sample rate = 128 sps
coreyharris 1:86843c27cc81 182 ecgAFE.writeRegister( MAX30003::CNFG_ECG , CNFG_ECG_r.all);
coreyharris 1:86843c27cc81 183
coreyharris 1:86843c27cc81 184
coreyharris 1:86843c27cc81 185 //R-to-R configuration
coreyharris 1:86843c27cc81 186 MAX30003::RtoR1Configuration_u CNFG_RTOR_r;
coreyharris 3:420d5efbd967 187 CNFG_RTOR_r.bits.en_rtor = 1; // Enable R-to-R detection
coreyharris 1:86843c27cc81 188 ecgAFE.writeRegister( MAX30003::CNFG_RTOR1 , CNFG_RTOR_r.all);
coreyharris 1:86843c27cc81 189
coreyharris 1:86843c27cc81 190
coreyharris 1:86843c27cc81 191 //Manage interrupts register setting
coreyharris 1:86843c27cc81 192 MAX30003::ManageInterrupts_u MNG_INT_r;
coreyharris 3:420d5efbd967 193 MNG_INT_r.bits.efit = 0b00011; // Assert EINT w/ 4 unread samples
coreyharris 3:420d5efbd967 194 MNG_INT_r.bits.clr_rrint = 0b01; // Clear R-to-R on RTOR reg. read back
coreyharris 1:86843c27cc81 195 ecgAFE.writeRegister( MAX30003::MNGR_INT , MNG_INT_r.all);
coreyharris 0:38c49bc37c7c 196
coreyharris 0:38c49bc37c7c 197
coreyharris 1:86843c27cc81 198 //Enable interrupts register setting
coreyharris 1:86843c27cc81 199 MAX30003::EnableInterrupts_u EN_INT_r;
coreyharris 5:f8d1f651bef5 200 EN_INT_r.all = 0;
coreyharris 3:420d5efbd967 201 EN_INT_r.bits.en_eint = 1; // Enable EINT interrupt
coreyharris 4:06e258ff0b97 202 EN_INT_r.bits.en_rrint = 0; // Disable R-to-R interrupt
coreyharris 3:420d5efbd967 203 EN_INT_r.bits.intb_type = 3; // Open-drain NMOS with internal pullup
coreyharris 1:86843c27cc81 204 ecgAFE.writeRegister( MAX30003::EN_INT , EN_INT_r.all);
coreyharris 1:86843c27cc81 205
coreyharris 1:86843c27cc81 206
coreyharris 1:86843c27cc81 207 //Dyanmic modes config
coreyharris 1:86843c27cc81 208 MAX30003::ManageDynamicModes_u MNG_DYN_r;
coreyharris 3:420d5efbd967 209 MNG_DYN_r.bits.fast = 0; // Fast recovery mode disabled
coreyharris 1:86843c27cc81 210 ecgAFE.writeRegister( MAX30003::MNGR_DYN , MNG_DYN_r.all);
coreyharris 5:f8d1f651bef5 211
coreyharris 5:f8d1f651bef5 212 // MUX Config
coreyharris 5:f8d1f651bef5 213 MAX30003::MuxConfiguration_u CNFG_MUX_r;
coreyharris 5:f8d1f651bef5 214 CNFG_MUX_r.bits.openn = 0; // Connect ECGN to AFE channel
coreyharris 5:f8d1f651bef5 215 CNFG_MUX_r.bits.openp = 0; // Connect ECGP to AFE channel
coreyharris 5:f8d1f651bef5 216 ecgAFE.writeRegister( MAX30003::CNFG_EMUX , CNFG_MUX_r.all);
coreyharris 1:86843c27cc81 217
coreyharris 1:86843c27cc81 218 return;
parthsagar2010 10:3709e8f3d089 219 }