João Sousa / Mbed 2 deprecated dc_load

Dependencies:   Buffer INA2xx PID mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 #include "ina2xx.h"
00003 #include "MyBuffer.h"
00004 #include "string.h"
00005 #include "mcp4725.h"
00006 #include "PID.h"
00007 
00008 #define BUFFER_SIZE     50
00009 typedef enum {
00010     DC_LOAD_MANUAL = 0,
00011     DC_LOAD_AUTO_CURRENT,
00012     DC_LOAD_AUTO_POWER
00013 } DCLoadMode;
00014 
00015 Ticker ticker_v, ticker_a, ticker_w, ticker_t;
00016 
00017 Serial serial(PTB1,PTB2);
00018 I2C i2c(PTB4, PTB3);
00019 MyBuffer <char>buffer;
00020 
00021 float voltage = 0.0, current = 0.0, power = 0.0;
00022 float volts_streaming = 0.0, amps_streaming = 0.0, watts_streaming = 0.0;
00023 float minvolts = 0.0;
00024 bool values_ok;
00025 DCLoadMode mode = DC_LOAD_MANUAL;
00026 uint8_t parse_buffer[BUFFER_SIZE+2];
00027 uint8_t i_ptr = 0;
00028 uint32_t timestamp = 0;
00029 bool timestamp_mode = false;
00030 
00031 void ticker_v_func();
00032 void ticker_a_func();
00033 void ticker_w_func();
00034 void ticker_time();
00035 
00036 void serialInt(void)
00037 {
00038     while(serial.readable()) {
00039         buffer.put(serial.getc());
00040     }
00041 }
00042 
00043 void getVoltageCurrentPower()
00044 {
00045     bool ret, ret2;
00046     voltage = ina226GetVoltage(&i2c, &ret);
00047     current = ina226GetCurrent(&i2c, &ret2);
00048     values_ok = ret * ret2;
00049     power = voltage * current;
00050 }
00051 
00052 void parseCmd()
00053 {
00054     while(buffer.available() && i_ptr < BUFFER_SIZE) {
00055         parse_buffer[i_ptr] = buffer.get();
00056         serial.putc(parse_buffer[i_ptr++]);
00057         parse_buffer[i_ptr] = 0;
00058         char * endstr = NULL;
00059         endstr = strstr((char *)parse_buffer, "\r\n");
00060         if(endstr != NULL) {
00061             i_ptr = 0;
00062             char *pch = strstr((char *)parse_buffer,"=");
00063             char *pch2 = strstr((char *)parse_buffer,"?");
00064             int value = 0;
00065             if(pch != NULL) {
00066                 if(!strncmp((char *)parse_buffer, "SV", 2)) {
00067                     value = atoi(pch+1);    // voltage
00068                     if(value <= 50) {
00069                         volts_streaming = 0.0;
00070                         ticker_v.detach();
00071                     } else {
00072 
00073                         ticker_v.detach();
00074                         volts_streaming = (float)value/1000.0;
00075                         ticker_v.attach(&ticker_v_func, volts_streaming);
00076                     }
00077                 } else if(!strncmp((char *)parse_buffer, "SC", 2)) {
00078                     value = atoi(pch+1);    // amps
00079                     if(value <= 50) {
00080                         amps_streaming = 0.0;
00081                         ticker_a.detach();
00082                     } else {
00083 
00084                         ticker_a.detach();
00085                         amps_streaming = (float)value/1000.0;
00086                         ticker_a.attach(&ticker_a_func, amps_streaming);
00087                     }
00088                 } else if(!strncmp((char *)parse_buffer, "SP", 2)) {
00089                     value = atoi(pch+1);    // watts_streaming
00090                     if(value <= 50) {
00091                         watts_streaming = 0.0;
00092                         ticker_w.detach();
00093                     } else {
00094 
00095                         ticker_w.detach();
00096                         watts_streaming = (float)value/1000.0;
00097                         ticker_w.attach(&ticker_w_func, watts_streaming);
00098                     }
00099                 } else if(!strncmp((char *)parse_buffer, "A", 1)) {
00100                     value = atoi(pch+1);    // set current
00101                     float value_real = value;
00102                     value_real *= 0.1866;
00103                     mcp4725_setVoltage(&i2c, (int)value_real, false);
00104                 } else if(!strncmp((char *)parse_buffer, "Tm", 2)) {
00105                     timestamp_mode = atoi(pch+1)?true:false;    // time
00106                 } else if(!strncmp((char *)parse_buffer, "T", 1)) {
00107                     timestamp = atoi(pch+1);    // time
00108                 } else if(!strncmp((char *)parse_buffer, "mV", 2)) {
00109                     minvolts = (float)(atoi(pch+1))/1000.0;    // time
00110                 }
00111             } else if(pch2 != NULL) {
00112                 if(!strncmp((char *)parse_buffer, "A?", 2)) {
00113                     printf("C=%d\r\n", (int)(current * 1000.0));
00114                 } else if(!strncmp((char *)parse_buffer, "V?", 2)) {
00115                     printf("V=%d\r\n", (int)(voltage * 1000.0));
00116                 } else if(!strncmp((char *)parse_buffer, "P?", 2)) {
00117                     printf("P=%d\r\n", (int)(power * 1000.0));
00118                 } else if(!strncmp((char *)parse_buffer, "T?", 2)) {
00119                     printf("T=%d\r\n", timestamp);
00120                 }
00121             } else {
00122                 if(!strncmp((char *)parse_buffer, "help", 4)) {
00123                     serial.puts("Available commands:\r\nSV=<ms>\\r\\n - Set streaming voltage\r\n");
00124                     serial.puts("SC=<ms>\\r\\n - Set streaming current\r\n");
00125                     serial.puts("SP=<ms>\\r\\n - Set streaming power\r\n");
00126                     serial.puts("A=<mA>\\r\\n - Set discharge current\r\n");
00127                     serial.puts("T=<ms>\\r\\n - Set timestamp\r\n");
00128                     serial.puts("Tm=<ms>\\r\\n - Set timestamp mode (0: timestamp off, 1: timestamp on)\r\n");
00129                     serial.puts("mV=<mV>\\r\\n - Set minimum discharge voltage\r\n");
00130                     serial.puts("V?\\r\\n - Get voltage\r\n");
00131                     serial.puts("A?\\r\\n - Get discharge current\r\n");
00132                     serial.puts("P?\\r\\n - Get discharge power\r\n");
00133                     serial.puts("T?\\r\\n - Get timestamp\r\n");
00134                     serial.puts("help\\r\\n - help menu\r\n");
00135                     serial.puts("report\\r\\n - Get sensors report\r\n");
00136                 } else if(!strncmp((char *)parse_buffer, "report", 6)) {
00137                     serial.puts("DC-LOAD report\r\n");
00138 
00139                 } else {
00140                     serial.puts("Invalid command...\nSend <help\\r\\n> to see available commands\n");
00141                 }
00142             }
00143         }
00144     }
00145 }
00146 
00147 int main()
00148 {
00149     ticker_t.attach(&ticker_time, 0.01);
00150     serial.baud(115200);
00151     serial.puts("DC-LOAD starting...\nSend <help\\r\\n> to see available commands\n");
00152     serial.attach(serialInt);
00153     i2c.frequency(100000);
00154     i_ptr = 0;
00155     uint16_t conf = 0;
00156     mcp4725_setVoltage(&i2c, 0, false);
00157     ina226_set(&i2c, 0x00, 0x4927);
00158     ina226_get(&i2c, 0x00, &conf);
00159     if(conf != 0x4927) return 1;
00160     ina226_set(&i2c,0x05, 1000);
00161     ina226_get(&i2c, 0x05, &conf);
00162     if(conf != 1000) return 2;
00163     values_ok = false;
00164     mode = DC_LOAD_MANUAL;
00165 
00166     while(1) {
00167         getVoltageCurrentPower();
00168 
00169         parseCmd();
00170 
00171         if( minvolts > 1.0 && voltage < minvolts) {
00172             printf("Min. Voltage detected\r\n");
00173             mcp4725_setVoltage(&i2c, 0x0000, false);
00174         }
00175         wait(0.1);
00176     }
00177 }
00178 
00179 void ticker_v_func(void)
00180 {
00181     if(timestamp_mode) {
00182         printf("%d:V=%d\r\n", timestamp, (int)(voltage * 1000.0));
00183     } else {
00184         printf("V=%d\r\n", (int)(voltage * 1000.0));
00185     }
00186 }
00187 
00188 void ticker_a_func(void)
00189 {
00190     if(timestamp_mode) {
00191         printf("%d:C=%d\r\n", timestamp, (int)(current * 1000.0));
00192     } else {
00193         printf("C=%d\r\n", (int)(current * 1000.0));
00194     }
00195 }
00196 
00197 void ticker_w_func(void)
00198 {
00199     if(timestamp_mode) {
00200         printf("%d:P=%d\r\n", timestamp, (int)(power * 1000.0));
00201     } else {
00202         printf("P=%d\r\n", (int)(power * 1000.0));
00203     }
00204 }
00205 
00206 void ticker_time(void)
00207 {
00208     timestamp+=10;
00209 }