Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp@13:0f663ca63342, 2019-11-13 (annotated)
- Committer:
- AhmadAlkaff
- Date:
- Wed Nov 13 11:10:03 2019 +0000
- Revision:
- 13:0f663ca63342
- Parent:
- 12:2ad10c36f820
Reorganize Code
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
AhmadAlkaff | 0:7b5d37ca532f | 1 | #include "mbed.h" |
AhmadAlkaff | 1:e4a32b4163f2 | 2 | #include "LIS2DH.h" |
AhmadAlkaff | 0:7b5d37ca532f | 3 | #include "MAX30001.h" |
AhmadAlkaff | 0:7b5d37ca532f | 4 | #include "System.h" |
AhmadAlkaff | 13:0f663ca63342 | 5 | #include "USBSerial.h" |
socrj | 7:188bf08cfb44 | 6 | |
AhmadAlkaff | 13:0f663ca63342 | 7 | /******************************************************************************/ |
AhmadAlkaff | 13:0f663ca63342 | 8 | #define LIS2DH_I2C_SLAVE_ADDR (0x32) |
AhmadAlkaff | 0:7b5d37ca532f | 9 | |
AhmadAlkaff | 0:7b5d37ca532f | 10 | // Settings for ECG Initialization |
AhmadAlkaff | 0:7b5d37ca532f | 11 | #define En_ecg 0x01 |
AhmadAlkaff | 0:7b5d37ca532f | 12 | #define Openp 0x00 |
AhmadAlkaff | 0:7b5d37ca532f | 13 | #define Openn 0x00 |
AhmadAlkaff | 0:7b5d37ca532f | 14 | #define Pol 0x00 |
AhmadAlkaff | 0:7b5d37ca532f | 15 | #define Calp_sel 0x00 |
AhmadAlkaff | 0:7b5d37ca532f | 16 | #define Caln_sel 0x00 |
AhmadAlkaff | 0:7b5d37ca532f | 17 | #define E_fit 0x0F |
socrj | 7:188bf08cfb44 | 18 | #define Rate 0x00 |
AhmadAlkaff | 0:7b5d37ca532f | 19 | #define Gain 0x00 |
AhmadAlkaff | 0:7b5d37ca532f | 20 | #define Dhpf 0x01 |
AhmadAlkaff | 0:7b5d37ca532f | 21 | #define Dlpf 0x01 |
AhmadAlkaff | 0:7b5d37ca532f | 22 | |
AhmadAlkaff | 0:7b5d37ca532f | 23 | // Settings for ECG RtoR |
AhmadAlkaff | 0:7b5d37ca532f | 24 | #define En_rtor 0x01 |
AhmadAlkaff | 0:7b5d37ca532f | 25 | #define Wndw 0x03 |
AhmadAlkaff | 0:7b5d37ca532f | 26 | #define Gain1 0x0f |
AhmadAlkaff | 0:7b5d37ca532f | 27 | #define Pavg 0x02 |
AhmadAlkaff | 0:7b5d37ca532f | 28 | #define Ptsf 0x03 |
AhmadAlkaff | 0:7b5d37ca532f | 29 | #define Hoff 0x20 |
AhmadAlkaff | 0:7b5d37ca532f | 30 | #define Ravg 0x02 |
AhmadAlkaff | 0:7b5d37ca532f | 31 | #define Rhsf 0x04 |
AhmadAlkaff | 0:7b5d37ca532f | 32 | #define Clr_rrint 0x01 |
AhmadAlkaff | 0:7b5d37ca532f | 33 | |
AhmadAlkaff | 13:0f663ca63342 | 34 | // Define with Maxim VID and a Maxim assigned PID, set to version 0x0001 and |
AhmadAlkaff | 13:0f663ca63342 | 35 | // non-blocking |
AhmadAlkaff | 0:7b5d37ca532f | 36 | USBSerial usbSerial(0x0b6a, 0x0100, 0x0001, false); |
AhmadAlkaff | 0:7b5d37ca532f | 37 | |
AhmadAlkaff | 13:0f663ca63342 | 38 | // LIS2DH I2C Master |
AhmadAlkaff | 13:0f663ca63342 | 39 | I2C i2c2(I2C2_SDA, I2C2_SCL); |
AhmadAlkaff | 0:7b5d37ca532f | 40 | |
AhmadAlkaff | 0:7b5d37ca532f | 41 | // SPI Master 0 with SPI0_SS for use with MAX30001 |
AhmadAlkaff | 0:7b5d37ca532f | 42 | SPI spi(SPI0_MOSI, SPI0_MISO, SPI0_SCK, SPI0_SS); |
AhmadAlkaff | 0:7b5d37ca532f | 43 | |
AhmadAlkaff | 0:7b5d37ca532f | 44 | // Accelerometer |
AhmadAlkaff | 2:17d5a74fc2c4 | 45 | LIS2DH lis2dh(&i2c2, LIS2DH_I2C_SLAVE_ADDR); |
AhmadAlkaff | 2:17d5a74fc2c4 | 46 | InterruptIn lis2dh_Interrupt(P4_7); |
AhmadAlkaff | 0:7b5d37ca532f | 47 | |
AhmadAlkaff | 0:7b5d37ca532f | 48 | // ECG device |
AhmadAlkaff | 0:7b5d37ca532f | 49 | MAX30001 max30001(&spi); |
AhmadAlkaff | 0:7b5d37ca532f | 50 | InterruptIn max30001_InterruptB(P3_6); |
AhmadAlkaff | 0:7b5d37ca532f | 51 | InterruptIn max30001_Interrupt2B(P4_5); |
socrj | 7:188bf08cfb44 | 52 | |
AhmadAlkaff | 0:7b5d37ca532f | 53 | // PWM used as fclk for the MAX30001 |
AhmadAlkaff | 0:7b5d37ca532f | 54 | PwmOut pwmout(P1_7); |
AhmadAlkaff | 0:7b5d37ca532f | 55 | |
AhmadAlkaff | 0:7b5d37ca532f | 56 | DigitalOut led(LED1); |
AhmadAlkaff | 0:7b5d37ca532f | 57 | |
AhmadAlkaff | 0:7b5d37ca532f | 58 | // Data of sensors |
AhmadAlkaff | 13:0f663ca63342 | 59 | int16_t Acc[3]; |
AhmadAlkaff | 13:0f663ca63342 | 60 | int32_t ECG_Raw, ECG_cumul; |
AhmadAlkaff | 0:7b5d37ca532f | 61 | double ECG_converted = 0; |
AhmadAlkaff | 0:7b5d37ca532f | 62 | uint32_t index = 0; |
AhmadAlkaff | 0:7b5d37ca532f | 63 | |
AhmadAlkaff | 13:0f663ca63342 | 64 | //@brief Creates a packet that will be streamed via USB Serial, the packet |
AhmadAlkaff | 13:0f663ca63342 | 65 | // created will be inserted into a fifo to be streamed at a later time |
AhmadAlkaff | 13:0f663ca63342 | 66 | //@param id Streaming ID |
AhmadAlkaff | 13:0f663ca63342 | 67 | //@param buffer Pointer to a uint32 array that contains the data to include in |
AhmadAlkaff | 13:0f663ca63342 | 68 | // the packet |
AhmadAlkaff | 0:7b5d37ca532f | 69 | //@param number Number of elements in the buffer |
AhmadAlkaff | 0:7b5d37ca532f | 70 | void StreamPacketUint32_ex(uint32_t id, uint32_t *buffer, uint32_t number) { |
AhmadAlkaff | 0:7b5d37ca532f | 71 | int k; |
AhmadAlkaff | 0:7b5d37ca532f | 72 | |
AhmadAlkaff | 0:7b5d37ca532f | 73 | if(id == MAX30001_DATA_ECG) { |
AhmadAlkaff | 13:0f663ca63342 | 74 | for (k = 0; k < number; k++) { |
AhmadAlkaff | 0:7b5d37ca532f | 75 | ECG_Raw = (int32_t)(buffer[k] << 8); |
AhmadAlkaff | 0:7b5d37ca532f | 76 | ECG_Raw = ECG_Raw >> 14; |
socrj | 7:188bf08cfb44 | 77 | usbSerial.printf("ECG\r\n"); |
socrj | 7:188bf08cfb44 | 78 | usbSerial.printf("%d\r\n", ECG_Raw); |
AhmadAlkaff | 0:7b5d37ca532f | 79 | index++; |
AhmadAlkaff | 0:7b5d37ca532f | 80 | } |
AhmadAlkaff | 0:7b5d37ca532f | 81 | } |
AhmadAlkaff | 0:7b5d37ca532f | 82 | } |
AhmadAlkaff | 0:7b5d37ca532f | 83 | |
AhmadAlkaff | 0:7b5d37ca532f | 84 | int main() { |
AhmadAlkaff | 13:0f663ca63342 | 85 | // Hold results for returning functions |
AhmadAlkaff | 0:7b5d37ca532f | 86 | int result; |
AhmadAlkaff | 0:7b5d37ca532f | 87 | |
AhmadAlkaff | 0:7b5d37ca532f | 88 | // Interrupt priority |
AhmadAlkaff | 0:7b5d37ca532f | 89 | NVIC_SetPriority(GPIO_P0_IRQn, 5); |
AhmadAlkaff | 0:7b5d37ca532f | 90 | NVIC_SetPriority(GPIO_P1_IRQn, 5); |
AhmadAlkaff | 0:7b5d37ca532f | 91 | NVIC_SetPriority(GPIO_P2_IRQn, 5); |
AhmadAlkaff | 0:7b5d37ca532f | 92 | NVIC_SetPriority(GPIO_P3_IRQn, 5); |
AhmadAlkaff | 0:7b5d37ca532f | 93 | NVIC_SetPriority(GPIO_P4_IRQn, 5); |
AhmadAlkaff | 0:7b5d37ca532f | 94 | NVIC_SetPriority(GPIO_P5_IRQn, 5); |
AhmadAlkaff | 0:7b5d37ca532f | 95 | NVIC_SetPriority(GPIO_P6_IRQn, 5); |
AhmadAlkaff | 0:7b5d37ca532f | 96 | // Used by the MAX30001 |
AhmadAlkaff | 0:7b5d37ca532f | 97 | NVIC_SetPriority(SPI1_IRQn, 0); |
AhmadAlkaff | 0:7b5d37ca532f | 98 | |
AhmadAlkaff | 0:7b5d37ca532f | 99 | /* ECG Initialize */ |
AhmadAlkaff | 0:7b5d37ca532f | 100 | max30001_InterruptB.disable_irq(); |
AhmadAlkaff | 0:7b5d37ca532f | 101 | max30001_Interrupt2B.disable_irq(); |
AhmadAlkaff | 0:7b5d37ca532f | 102 | max30001_InterruptB.mode(PullUp); |
AhmadAlkaff | 0:7b5d37ca532f | 103 | max30001_InterruptB.fall(&MAX30001Mid_IntB_Handler); |
AhmadAlkaff | 0:7b5d37ca532f | 104 | max30001_Interrupt2B.mode(PullUp); |
AhmadAlkaff | 0:7b5d37ca532f | 105 | max30001_Interrupt2B.fall(&MAX30001Mid_Int2B_Handler); |
AhmadAlkaff | 0:7b5d37ca532f | 106 | max30001_InterruptB.enable_irq(); |
AhmadAlkaff | 0:7b5d37ca532f | 107 | max30001_Interrupt2B.enable_irq(); |
AhmadAlkaff | 0:7b5d37ca532f | 108 | MAX30001_AllowInterrupts(1); |
AhmadAlkaff | 0:7b5d37ca532f | 109 | // Configuring the FCLK for the ECG, set to 32.768KHZ |
AhmadAlkaff | 0:7b5d37ca532f | 110 | pwmout.period_us(31); |
AhmadAlkaff | 0:7b5d37ca532f | 111 | pwmout.write(0.5); // 0-1 is 0-100%, 0.5 = 50% duty cycle. |
AhmadAlkaff | 0:7b5d37ca532f | 112 | max30001.max30001_sw_rst(); // Do a software reset of the MAX30001 |
AhmadAlkaff | 0:7b5d37ca532f | 113 | max30001.max30001_INT_assignment( |
AhmadAlkaff | 0:7b5d37ca532f | 114 | MAX30001::MAX30001_INT_B, // en_enint_loc |
AhmadAlkaff | 0:7b5d37ca532f | 115 | MAX30001::MAX30001_NO_INT, // en_eovf_loc |
AhmadAlkaff | 0:7b5d37ca532f | 116 | MAX30001::MAX30001_NO_INT, // en_fstint_loc |
AhmadAlkaff | 0:7b5d37ca532f | 117 | |
AhmadAlkaff | 0:7b5d37ca532f | 118 | MAX30001::MAX30001_INT_2B, // en_dcloffint_loc |
AhmadAlkaff | 0:7b5d37ca532f | 119 | MAX30001::MAX30001_INT_B, // en_bint_loc |
AhmadAlkaff | 0:7b5d37ca532f | 120 | MAX30001::MAX30001_NO_INT, // en_bovf_loc |
AhmadAlkaff | 0:7b5d37ca532f | 121 | |
AhmadAlkaff | 0:7b5d37ca532f | 122 | MAX30001::MAX30001_INT_2B, // en_bover_loc |
AhmadAlkaff | 0:7b5d37ca532f | 123 | MAX30001::MAX30001_INT_2B, // en_bundr_loc |
AhmadAlkaff | 0:7b5d37ca532f | 124 | MAX30001::MAX30001_NO_INT, // en_bcgmon_loc |
AhmadAlkaff | 0:7b5d37ca532f | 125 | |
AhmadAlkaff | 0:7b5d37ca532f | 126 | MAX30001::MAX30001_INT_B, // en_pint_loc |
AhmadAlkaff | 0:7b5d37ca532f | 127 | MAX30001::MAX30001_NO_INT, // en_povf_loc, |
AhmadAlkaff | 0:7b5d37ca532f | 128 | MAX30001::MAX30001_NO_INT, // en_pedge_loc |
AhmadAlkaff | 0:7b5d37ca532f | 129 | |
AhmadAlkaff | 0:7b5d37ca532f | 130 | MAX30001::MAX30001_INT_2B, // en_lonint_loc |
AhmadAlkaff | 0:7b5d37ca532f | 131 | MAX30001::MAX30001_INT_B, // en_rrint_loc |
AhmadAlkaff | 0:7b5d37ca532f | 132 | MAX30001::MAX30001_NO_INT, // en_samp_loc |
AhmadAlkaff | 0:7b5d37ca532f | 133 | |
AhmadAlkaff | 0:7b5d37ca532f | 134 | MAX30001::MAX30001_INT_ODNR, // intb_Type |
AhmadAlkaff | 0:7b5d37ca532f | 135 | MAX30001::MAX30001_INT_ODNR); // int2b_Type |
socrj | 7:188bf08cfb44 | 136 | |
socrj | 7:188bf08cfb44 | 137 | lis2dh.initStart(LIS2DH_DATARATE_50HZ, LIS2DH_FIFO_SIZE); |
AhmadAlkaff | 13:0f663ca63342 | 138 | max30001.max30001_ECG_InitStart(En_ecg, Openp, Openn, Pol, Calp_sel, |
AhmadAlkaff | 13:0f663ca63342 | 139 | Caln_sel, E_fit, Rate, Gain, Dhpf, Dlpf); |
AhmadAlkaff | 0:7b5d37ca532f | 140 | max30001.max30001_synch(); |
AhmadAlkaff | 0:7b5d37ca532f | 141 | max30001.onDataAvailable(&StreamPacketUint32_ex); |
socrj | 7:188bf08cfb44 | 142 | |
socrj | 7:188bf08cfb44 | 143 | while (1){ |
socrj | 7:188bf08cfb44 | 144 | int a; |
AhmadAlkaff | 13:0f663ca63342 | 145 | lis2dh.get_motion_fifo(&Acc[0], &Acc[1], &Acc[2]); |
socrj | 7:188bf08cfb44 | 146 | usbSerial.printf("ACC\r\n"); |
AhmadAlkaff | 13:0f663ca63342 | 147 | usbSerial.printf("X %d\r\nY %d\r\nZ %d\r\n", Acc[0], Acc[1], Acc[2]); |
socrj | 7:188bf08cfb44 | 148 | } |
AhmadAlkaff | 0:7b5d37ca532f | 149 | } |