MAX34417 Demo
Dependencies: max32625pico maxim-dev USBDevice
main.cpp@1:f7e85b6d0117, 2019-02-19 (annotated)
- Committer:
- MadhuraT
- Date:
- Tue Feb 19 22:27:27 2019 +0000
- Revision:
- 1:f7e85b6d0117
- Parent:
- 0:bc0f96339b73
- Child:
- 2:39d6246ca2cb
demo code for MAX34417
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
MI | 0:bc0f96339b73 | 1 | #include "mbed.h" |
MI | 0:bc0f96339b73 | 2 | #include "USBSerial.h" |
MI | 0:bc0f96339b73 | 3 | #include "max32625pico.h" |
MI | 0:bc0f96339b73 | 4 | |
MI | 0:bc0f96339b73 | 5 | USBSerial pc; |
MI | 0:bc0f96339b73 | 6 | |
MadhuraT | 1:f7e85b6d0117 | 7 | double readPwrMonitor(I2C &i2cbus, int channel_no); |
MadhuraT | 1:f7e85b6d0117 | 8 | void configPwrMonitor(I2C &i2cbus); |
MI | 0:bc0f96339b73 | 9 | |
MadhuraT | 1:f7e85b6d0117 | 10 | #define I2C_SLAVE_ADDRESS 0X10 |
MadhuraT | 1:f7e85b6d0117 | 11 | #define REG_UPDATE 0x00 |
MadhuraT | 1:f7e85b6d0117 | 12 | #define REG_CONTROL 0x01 |
MadhuraT | 1:f7e85b6d0117 | 13 | #define REG_ACC_COUNT 0x02 |
MadhuraT | 1:f7e85b6d0117 | 14 | #define REG_PWR_ACC1 0x03 |
MadhuraT | 1:f7e85b6d0117 | 15 | #define REG_PWR_ACC2 0x04 |
MadhuraT | 1:f7e85b6d0117 | 16 | #define REG_PWR_ACC3 0x05 |
MadhuraT | 1:f7e85b6d0117 | 17 | #define REG_PWR_ACC4 0x06 |
MadhuraT | 1:f7e85b6d0117 | 18 | #define REG_V_CH1 0x07 |
MadhuraT | 1:f7e85b6d0117 | 19 | #define REG_V_CH2 0x08 |
MadhuraT | 1:f7e85b6d0117 | 20 | #define REG_V_CH3 0x09 |
MadhuraT | 1:f7e85b6d0117 | 21 | #define REG_V_CH4 0x0A |
MadhuraT | 1:f7e85b6d0117 | 22 | #define REG_DID 0x10 |
MadhuraT | 1:f7e85b6d0117 | 23 | #define REG_BULK_UPDATE 0x11 |
MadhuraT | 1:f7e85b6d0117 | 24 | #define REG_BULK_POWER_READOUT 0x06 |
MadhuraT | 1:f7e85b6d0117 | 25 | #define REG_BULK_VOLTAGE_READOUT 0x07 |
MadhuraT | 1:f7e85b6d0117 | 26 | |
MadhuraT | 1:f7e85b6d0117 | 27 | |
MI | 0:bc0f96339b73 | 28 | |
MI | 0:bc0f96339b73 | 29 | int main() |
MI | 0:bc0f96339b73 | 30 | { |
MadhuraT | 1:f7e85b6d0117 | 31 | int channel_no; |
MadhuraT | 1:f7e85b6d0117 | 32 | int device_id; |
MadhuraT | 1:f7e85b6d0117 | 33 | char *dev_id; |
MadhuraT | 1:f7e85b6d0117 | 34 | char data_val[2]= {0x0F,0}; |
MI | 0:bc0f96339b73 | 35 | //initialize the MAX32625PICO board for +3.3V logic levels |
MI | 0:bc0f96339b73 | 36 | MAX32625PICO pico(MAX32625PICO::IOH_3V3, MAX32625PICO::VIO_IOH, MAX32625PICO::VIO_IOH); |
MI | 0:bc0f96339b73 | 37 | |
MI | 0:bc0f96339b73 | 38 | //initialize RGB LED channels and turn them off |
MI | 0:bc0f96339b73 | 39 | DigitalOut rLED(LED1, LED_OFF); |
MI | 0:bc0f96339b73 | 40 | DigitalOut gLED(LED2, LED_OFF); |
MI | 0:bc0f96339b73 | 41 | DigitalOut bLED(LED3, LED_OFF); |
MI | 0:bc0f96339b73 | 42 | |
MadhuraT | 1:f7e85b6d0117 | 43 | |
MI | 0:bc0f96339b73 | 44 | //initialize the I2C master interface |
MI | 0:bc0f96339b73 | 45 | I2C i2c(P1_6, P1_7); //SDA, SCL |
MadhuraT | 1:f7e85b6d0117 | 46 | |
MI | 0:bc0f96339b73 | 47 | |
MadhuraT | 1:f7e85b6d0117 | 48 | //delcare variables to store the raw power readings and the converted power readings |
MadhuraT | 1:f7e85b6d0117 | 49 | int power_raw; |
MadhuraT | 1:f7e85b6d0117 | 50 | double power_W; |
MadhuraT | 1:f7e85b6d0117 | 51 | double step1results, step2results, step3results, senseresistor1; |
MI | 0:bc0f96339b73 | 52 | |
MadhuraT | 1:f7e85b6d0117 | 53 | i2c.write(I2C_SLAVE_ADDRESS,data_val, 1, false); |
MadhuraT | 1:f7e85b6d0117 | 54 | i2c.read(I2C_SLAVE_ADDRESS,dev_id, 1, false); |
MadhuraT | 1:f7e85b6d0117 | 55 | if(*dev_id == 0x07) |
MadhuraT | 1:f7e85b6d0117 | 56 | { |
MadhuraT | 1:f7e85b6d0117 | 57 | pc.printf ("Device Found \n"); |
MadhuraT | 1:f7e85b6d0117 | 58 | } |
MadhuraT | 1:f7e85b6d0117 | 59 | else |
MadhuraT | 1:f7e85b6d0117 | 60 | { |
MadhuraT | 1:f7e85b6d0117 | 61 | pc.printf ("Device not found \n"); |
MadhuraT | 1:f7e85b6d0117 | 62 | } |
MI | 0:bc0f96339b73 | 63 | //write the configuration register |
MadhuraT | 1:f7e85b6d0117 | 64 | configPwrMonitor(i2c); |
MI | 0:bc0f96339b73 | 65 | |
MadhuraT | 1:f7e85b6d0117 | 66 | //the while loop will read the power raw reading, convert to actual power data, and then |
MI | 0:bc0f96339b73 | 67 | //print the result to a serial terminal. It will then toggle each on-board LED |
MadhuraT | 1:f7e85b6d0117 | 68 | //for 11ms for a total of 33ms. A new power value is available every 12.5ms. |
MI | 0:bc0f96339b73 | 69 | while (true) { |
MadhuraT | 1:f7e85b6d0117 | 70 | //the readPwrMonitor() function returns a raw 24-bit power accumulator reading |
MI | 0:bc0f96339b73 | 71 | //if successful and a zero if unsuccessful |
MadhuraT | 1:f7e85b6d0117 | 72 | for (channel_no=0; channel_no <4 ; channel_no ++) |
MadhuraT | 1:f7e85b6d0117 | 73 | { |
MadhuraT | 1:f7e85b6d0117 | 74 | power_raw = readPwrMonitor(i2c,channel_no); |
MI | 0:bc0f96339b73 | 75 | |
MadhuraT | 1:f7e85b6d0117 | 76 | //print poweronly if valid data is received. |
MadhuraT | 1:f7e85b6d0117 | 77 | if(power_raw != 0) |
MI | 0:bc0f96339b73 | 78 | { |
MadhuraT | 1:f7e85b6d0117 | 79 | step1results=power_raw; |
MadhuraT | 1:f7e85b6d0117 | 80 | step2results = (double)step1results / (double)(1073741824); |
MadhuraT | 1:f7e85b6d0117 | 81 | senseresistor1 = 0.001 *senseresistor1; |
MadhuraT | 1:f7e85b6d0117 | 82 | step3results = step2results * ((.1 / senseresistor1) * 24); |
MadhuraT | 1:f7e85b6d0117 | 83 | power_W = step3results; |
MI | 0:bc0f96339b73 | 84 | |
MI | 0:bc0f96339b73 | 85 | //print a floating point value with 4 decimal places |
MadhuraT | 1:f7e85b6d0117 | 86 | pc.printf("\r\n%.4f C",power_W); |
MI | 0:bc0f96339b73 | 87 | } |
MI | 0:bc0f96339b73 | 88 | else { |
MadhuraT | 1:f7e85b6d0117 | 89 | pc.printf("\r\nPowerMonitor Read Error"); |
MadhuraT | 1:f7e85b6d0117 | 90 | } |
MI | 0:bc0f96339b73 | 91 | } |
MI | 0:bc0f96339b73 | 92 | |
MI | 0:bc0f96339b73 | 93 | //toggle LEDs one at a time for a total of 33ms |
MI | 0:bc0f96339b73 | 94 | bLED = LED_OFF; |
MI | 0:bc0f96339b73 | 95 | rLED = LED_ON; |
MI | 0:bc0f96339b73 | 96 | wait(0.11); |
MI | 0:bc0f96339b73 | 97 | rLED = LED_OFF; |
MI | 0:bc0f96339b73 | 98 | gLED = LED_ON; |
MI | 0:bc0f96339b73 | 99 | wait(0.11); |
MI | 0:bc0f96339b73 | 100 | gLED = LED_OFF; |
MI | 0:bc0f96339b73 | 101 | bLED = LED_ON; |
MI | 0:bc0f96339b73 | 102 | wait(0.11); |
MI | 0:bc0f96339b73 | 103 | } |
MI | 0:bc0f96339b73 | 104 | } |
MI | 0:bc0f96339b73 | 105 | |
MadhuraT | 1:f7e85b6d0117 | 106 | void configPwrMonitor(I2C &i2cbus) |
MI | 0:bc0f96339b73 | 107 | { |
MI | 0:bc0f96339b73 | 108 | //creates an array to store the values to be written to the configuration register |
MadhuraT | 1:f7e85b6d0117 | 109 | |
MadhuraT | 1:f7e85b6d0117 | 110 | char data[2] = {REG_CONTROL, 0xA0}; |
MI | 0:bc0f96339b73 | 111 | |
MadhuraT | 1:f7e85b6d0117 | 112 | //this built-in I2C write function from mbed sends the configuration data to the MAX34417 |
MadhuraT | 1:f7e85b6d0117 | 113 | i2cbus.write(I2C_SLAVE_ADDRESS, data, 2, false); |
MI | 0:bc0f96339b73 | 114 | } |
MI | 0:bc0f96339b73 | 115 | |
MadhuraT | 1:f7e85b6d0117 | 116 | double readPwrMonitor(I2C &i2cbus, int channel) |
MI | 0:bc0f96339b73 | 117 | { |
MadhuraT | 1:f7e85b6d0117 | 118 | int pwr_raw = 0; |
MadhuraT | 1:f7e85b6d0117 | 119 | char data[2]= {0, 0}; |
MI | 0:bc0f96339b73 | 120 | |
MadhuraT | 1:f7e85b6d0117 | 121 | data[0] = REG_UPDATE; |
MadhuraT | 1:f7e85b6d0117 | 122 | data[1] =0; |
MadhuraT | 1:f7e85b6d0117 | 123 | |
MadhuraT | 1:f7e85b6d0117 | 124 | |
MI | 0:bc0f96339b73 | 125 | //it returns a zero on success or non-zero if unsuccessful |
MadhuraT | 1:f7e85b6d0117 | 126 | int rtn_val = i2cbus.write(I2C_SLAVE_ADDRESS, data, 1, true); |
MI | 0:bc0f96339b73 | 127 | |
MadhuraT | 1:f7e85b6d0117 | 128 | //proceeds to read power only if previous command was successful |
MI | 0:bc0f96339b73 | 129 | if(rtn_val == 0) |
MI | 0:bc0f96339b73 | 130 | { |
MadhuraT | 1:f7e85b6d0117 | 131 | |
MadhuraT | 1:f7e85b6d0117 | 132 | { |
MadhuraT | 1:f7e85b6d0117 | 133 | //this I2C command reads the power and stores it in the 'data' array. |
MI | 0:bc0f96339b73 | 134 | //it returns a zero on success or non-zero if unsuccessful |
MadhuraT | 1:f7e85b6d0117 | 135 | if(channel == 0 ) |
MadhuraT | 1:f7e85b6d0117 | 136 | { |
MadhuraT | 1:f7e85b6d0117 | 137 | data[0] = REG_PWR_ACC1; |
MadhuraT | 1:f7e85b6d0117 | 138 | data[1] =0; |
MadhuraT | 1:f7e85b6d0117 | 139 | } |
MadhuraT | 1:f7e85b6d0117 | 140 | else if (channel == 1) |
MadhuraT | 1:f7e85b6d0117 | 141 | { |
MadhuraT | 1:f7e85b6d0117 | 142 | data[0] = REG_PWR_ACC2; |
MadhuraT | 1:f7e85b6d0117 | 143 | data[1] =0; |
MadhuraT | 1:f7e85b6d0117 | 144 | } |
MadhuraT | 1:f7e85b6d0117 | 145 | else if (channel == 2) |
MadhuraT | 1:f7e85b6d0117 | 146 | { |
MadhuraT | 1:f7e85b6d0117 | 147 | data[0] = REG_PWR_ACC3; |
MadhuraT | 1:f7e85b6d0117 | 148 | data[1] =0; |
MadhuraT | 1:f7e85b6d0117 | 149 | } |
MadhuraT | 1:f7e85b6d0117 | 150 | else if (channel == 3) |
MadhuraT | 1:f7e85b6d0117 | 151 | { |
MadhuraT | 1:f7e85b6d0117 | 152 | data[0] = REG_PWR_ACC4; |
MadhuraT | 1:f7e85b6d0117 | 153 | data[1] =0; |
MadhuraT | 1:f7e85b6d0117 | 154 | } |
MadhuraT | 1:f7e85b6d0117 | 155 | rtn_val = i2cbus.read(I2C_SLAVE_ADDRESS, data, 1, false); |
MI | 0:bc0f96339b73 | 156 | |
MI | 0:bc0f96339b73 | 157 | //proceeds to format raw temperature data only if previous command was successful |
MI | 0:bc0f96339b73 | 158 | if(rtn_val == 0) |
MI | 0:bc0f96339b73 | 159 | { |
MadhuraT | 1:f7e85b6d0117 | 160 | |
MadhuraT | 1:f7e85b6d0117 | 161 | pc.printf("Successful"); |
MadhuraT | 1:f7e85b6d0117 | 162 | } |
MadhuraT | 1:f7e85b6d0117 | 163 | |
MI | 0:bc0f96339b73 | 164 | } |
MI | 0:bc0f96339b73 | 165 | } |
MadhuraT | 1:f7e85b6d0117 | 166 | pwr_raw=data[0]; |
MadhuraT | 1:f7e85b6d0117 | 167 | //returns the power reading |
MadhuraT | 1:f7e85b6d0117 | 168 | return pwr_raw; |
MI | 0:bc0f96339b73 | 169 | } |
MI | 0:bc0f96339b73 | 170 |