Charging circuit code

Dependencies:   mbed

Fork of Serial_HelloWorld_Mbed by mbed official

Committer:
samuelstradling
Date:
Thu May 05 08:44:55 2016 +0000
Revision:
4:299f7c4ecd0c
Parent:
3:283ca911b616
Resistor value updates

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 0:879aa9d0247b 1 #include "mbed.h"
samuelstradling 1:291cc733b64a 2
samuelstradling 4:299f7c4ecd0c 3 #define mBED2
samuelstradling 1:291cc733b64a 4
samuelstradling 1:291cc733b64a 5 #define VCC 3.3
samuelstradling 1:291cc733b64a 6 #define B 3984
samuelstradling 1:291cc733b64a 7 #define K 273
samuelstradling 1:291cc733b64a 8 #define T0 (K+25)
samuelstradling 1:291cc733b64a 9 #define R0 10000
samuelstradling 4:299f7c4ecd0c 10 #define TEMP_LIMIT 35
samuelstradling 1:291cc733b64a 11
samuelstradling 1:291cc733b64a 12 #ifdef mBED1
samuelstradling 1:291cc733b64a 13 #define R1A 10037
samuelstradling 1:291cc733b64a 14 #define R1B 10056
samuelstradling 1:291cc733b64a 15 #define R2A 10047
samuelstradling 1:291cc733b64a 16 #define R2B 10012
samuelstradling 1:291cc733b64a 17 #define R3A 10041
samuelstradling 1:291cc733b64a 18 #define R3B 10048
MoHussan 2:091e7846d11a 19
samuelstradling 3:283ca911b616 20 #define RLOW 80.4
samuelstradling 3:283ca911b616 21 #define RHIGH 99.3
samuelstradling 1:291cc733b64a 22 #else
samuelstradling 1:291cc733b64a 23 #define R1A 10033
samuelstradling 1:291cc733b64a 24 #define R1B 10023
MoHussan 2:091e7846d11a 25 #define R2A 9988
samuelstradling 1:291cc733b64a 26 #define R2B 10036
samuelstradling 1:291cc733b64a 27 #define R3A 10070
samuelstradling 1:291cc733b64a 28 #define R3B 10067
MoHussan 2:091e7846d11a 29
samuelstradling 4:299f7c4ecd0c 30 #define RLOW 9.8
samuelstradling 4:299f7c4ecd0c 31 #define RHIGH 80.4
samuelstradling 1:291cc733b64a 32 #endif
mbed_official 0:879aa9d0247b 33
mbed_official 0:879aa9d0247b 34 Serial pc(USBTX, USBRX); // tx, rx
samuelstradling 1:291cc733b64a 35 DigitalOut buzzer(p22);
samuelstradling 1:291cc733b64a 36 LocalFileSystem local("local");
samuelstradling 1:291cc733b64a 37
MoHussan 2:091e7846d11a 38 BusIn chipStatus(p27, p29, p30, p28);
MoHussan 2:091e7846d11a 39 //(p27, p29, p30, p28)
MoHussan 2:091e7846d11a 40 //(p28, p30, p29, p27)
MoHussan 2:091e7846d11a 41
samuelstradling 1:291cc733b64a 42 float res_to_temp(float res);
samuelstradling 1:291cc733b64a 43 float volt_to_temp(int batteryA, float volt);
samuelstradling 1:291cc733b64a 44 float volt_to_res(int batteryA, float volt);
mbed_official 0:879aa9d0247b 45
mbed_official 0:879aa9d0247b 46 int main() {
samuelstradling 1:291cc733b64a 47
samuelstradling 1:291cc733b64a 48 char myname[64];
samuelstradling 1:291cc733b64a 49 float voltageA = .0, voltageB = .0;
samuelstradling 1:291cc733b64a 50 float tempA = .0, tempB = .0;
MoHussan 2:091e7846d11a 51 int i, bus;
MoHussan 2:091e7846d11a 52 char status[60];
MoHussan 2:091e7846d11a 53 char p;
samuelstradling 1:291cc733b64a 54 FILE *fp;
MoHussan 2:091e7846d11a 55 double bat_volt = .0;
MoHussan 2:091e7846d11a 56
samuelstradling 1:291cc733b64a 57 #ifdef mBED1
samuelstradling 1:291cc733b64a 58 int mBed = 1;
samuelstradling 1:291cc733b64a 59 #else
samuelstradling 1:291cc733b64a 60 int mBed = 2;
samuelstradling 1:291cc733b64a 61 #endif
samuelstradling 1:291cc733b64a 62
samuelstradling 1:291cc733b64a 63 buzzer = 0;
samuelstradling 1:291cc733b64a 64
MoHussan 2:091e7846d11a 65 pc.printf("\n\n\n");
MoHussan 2:091e7846d11a 66
samuelstradling 1:291cc733b64a 67 for (i = 0; i < 1000; i++) {
samuelstradling 1:291cc733b64a 68 sprintf(myname, "/local/log%04d.csv", i);
MoHussan 2:091e7846d11a 69 //pc.printf("Try file: <%s>\n", myname);
samuelstradling 1:291cc733b64a 70 if ((fp = fopen(myname, "r")) == 0) {
MoHussan 2:091e7846d11a 71 //pc.printf("File not found: <%s>\n", myname);
samuelstradling 1:291cc733b64a 72 break;
samuelstradling 1:291cc733b64a 73 } else {
MoHussan 2:091e7846d11a 74 //pc.printf("File exists: <%s>\n", myname);
samuelstradling 1:291cc733b64a 75 fclose(fp);
samuelstradling 1:291cc733b64a 76 }
mbed_official 0:879aa9d0247b 77 }
samuelstradling 1:291cc733b64a 78
samuelstradling 1:291cc733b64a 79 pc.printf("Creating File: <%s>\n", myname);
MoHussan 2:091e7846d11a 80 fp = fopen(myname, "w");
samuelstradling 1:291cc733b64a 81
MoHussan 2:091e7846d11a 82 pc.printf("Please enter a file name: \n");
MoHussan 2:091e7846d11a 83 p = pc.getc();
MoHussan 2:091e7846d11a 84 while(p != '\n'){
MoHussan 2:091e7846d11a 85 fprintf(fp, "%c", p);
MoHussan 2:091e7846d11a 86 pc.printf("%c", p);
MoHussan 2:091e7846d11a 87 p = pc.getc();
MoHussan 2:091e7846d11a 88 }
MoHussan 2:091e7846d11a 89 fprintf(fp, "\n");
MoHussan 2:091e7846d11a 90 pc.printf("\n");
MoHussan 2:091e7846d11a 91
MoHussan 2:091e7846d11a 92 fprintf(fp, "mBed, tempA, tempB, Battery, Status, bus\n");
MoHussan 2:091e7846d11a 93
MoHussan 2:091e7846d11a 94 AnalogIn battery_voltage(p16);
samuelstradling 1:291cc733b64a 95 AnalogIn va1(p17);
samuelstradling 1:291cc733b64a 96 AnalogIn va2(p18);
samuelstradling 1:291cc733b64a 97 AnalogIn vb1(p19);
samuelstradling 1:291cc733b64a 98 AnalogIn vb2(p20);
samuelstradling 1:291cc733b64a 99
MoHussan 2:091e7846d11a 100 DigitalIn charge(p30);
MoHussan 2:091e7846d11a 101 DigitalIn fault(p29);
MoHussan 2:091e7846d11a 102 DigitalIn TOC (p28);
MoHussan 2:091e7846d11a 103 DigitalIn ready(p27);
MoHussan 2:091e7846d11a 104
samuelstradling 1:291cc733b64a 105 DigitalIn run(p21);
samuelstradling 1:291cc733b64a 106
samuelstradling 1:291cc733b64a 107 while(run) {
samuelstradling 1:291cc733b64a 108 voltageA = (va1.read() - va2.read())*3.3;
samuelstradling 1:291cc733b64a 109 voltageB = (vb1.read() - vb2.read())*3.3;
MoHussan 2:091e7846d11a 110 //resA = volt_to_res(1, voltageA);
MoHussan 2:091e7846d11a 111 //resB = volt_to_res(0, voltageB);
samuelstradling 1:291cc733b64a 112 tempA = volt_to_temp(1, voltageA);
samuelstradling 1:291cc733b64a 113 tempB = volt_to_temp(0, voltageB);
MoHussan 2:091e7846d11a 114 bus = chipStatus.read();
MoHussan 2:091e7846d11a 115
MoHussan 2:091e7846d11a 116
MoHussan 2:091e7846d11a 117 switch(bus) {
MoHussan 2:091e7846d11a 118 case 0: sprintf(status,"Off"); break;
MoHussan 2:091e7846d11a 119 case 8: sprintf(status,"Ready to Charge"); break;
MoHussan 2:091e7846d11a 120 case 10: sprintf(status,"Precharge or Fast Charge"); break;
MoHussan 2:091e7846d11a 121 case 11: sprintf(status,"NiMH Top-Off Charge"); break;
MoHussan 2:091e7846d11a 122 case 12: sprintf(status," Temperature Limits"); break;
MoHussan 2:091e7846d11a 123 case 13: sprintf(status," Temperature Limits"); break;
MoHussan 2:091e7846d11a 124 case 14: sprintf(status," Temperature Limits"); break;
MoHussan 2:091e7846d11a 125 case 15: sprintf(status," Temperature Limits"); break;
MoHussan 2:091e7846d11a 126 case 4: sprintf(status,"Fault State (Latched)"); break;
MoHussan 2:091e7846d11a 127 default: sprintf(status,"Unknown: %d", bus); break;
MoHussan 2:091e7846d11a 128 }
MoHussan 2:091e7846d11a 129
MoHussan 2:091e7846d11a 130 bat_volt = VCC * (battery_voltage.read_u16() / 65536.0) / (RLOW / (RHIGH + RLOW));
MoHussan 2:091e7846d11a 131
MoHussan 2:091e7846d11a 132 pc.printf("mBed%i: tempA: %f, tempB: %f, Battery: %f (%f), Status: %s, BusIn %d\n", mBed, tempA-K, tempB-K, bat_volt, battery_voltage.read(), status, bus);
MoHussan 2:091e7846d11a 133 fprintf(fp, "%i, %f, %f, %f, %s, %d\n", mBed, tempA-K, tempB-K, bat_volt, status, bus);
samuelstradling 1:291cc733b64a 134
samuelstradling 1:291cc733b64a 135 if(((tempA-K) > TEMP_LIMIT) || ((tempB-K) > TEMP_LIMIT)){
samuelstradling 1:291cc733b64a 136 buzzer = 1;
MoHussan 2:091e7846d11a 137 }
MoHussan 2:091e7846d11a 138
MoHussan 2:091e7846d11a 139 wait_ms(5000);
samuelstradling 1:291cc733b64a 140 }
samuelstradling 1:291cc733b64a 141
samuelstradling 1:291cc733b64a 142 fclose(fp);
samuelstradling 1:291cc733b64a 143
samuelstradling 1:291cc733b64a 144 }
samuelstradling 1:291cc733b64a 145
samuelstradling 1:291cc733b64a 146 float volt_to_temp(int batteryA, float volt){
samuelstradling 1:291cc733b64a 147 float res = volt_to_res(batteryA, volt);
samuelstradling 1:291cc733b64a 148 return res_to_temp(res);
samuelstradling 1:291cc733b64a 149 }
samuelstradling 1:291cc733b64a 150
samuelstradling 1:291cc733b64a 151 float volt_to_res(int batteryA, float volt){
samuelstradling 1:291cc733b64a 152 if(batteryA){
samuelstradling 1:291cc733b64a 153 return R3A * ((VCC * R2A - volt * (R1A + R2A)) / (VCC * R1A + volt * (R1A + R2A)));
samuelstradling 1:291cc733b64a 154 }else{
samuelstradling 1:291cc733b64a 155 return R3B * ((VCC * R2B - volt * (R1B + R2B)) / (VCC * R1B + volt * (R1B + R2B)));
samuelstradling 1:291cc733b64a 156 }
samuelstradling 1:291cc733b64a 157 }
samuelstradling 1:291cc733b64a 158
samuelstradling 1:291cc733b64a 159 float res_to_temp(float Rt){
samuelstradling 1:291cc733b64a 160
samuelstradling 1:291cc733b64a 161 return (B * T0) / (B + (T0 * log(Rt / R0)));
samuelstradling 1:291cc733b64a 162
samuelstradling 1:291cc733b64a 163 }
samuelstradling 1:291cc733b64a 164