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.
Dependencies: Buffer INA2xx PID mbed
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 }
Generated on Tue Oct 11 2022 21:11:11 by
