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