MAX34417 Demo

Dependencies:   max32625pico maxim-dev USBDevice

Committer:
MadhuraT
Date:
Thu Feb 21 19:55:58 2019 +0000
Revision:
2:39d6246ca2cb
Parent:
1:f7e85b6d0117
rEV0

Who changed what in which revision?

UserRevisionLine numberNew 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