Charging circuit code
Dependencies: mbed
Fork of Serial_HelloWorld_Mbed by
main.cpp@2:091e7846d11a, 2016-04-29 (annotated)
- Committer:
- MoHussan
- Date:
- Fri Apr 29 11:38:06 2016 +0000
- Revision:
- 2:091e7846d11a
- Parent:
- 1:291cc733b64a
- Child:
- 3:283ca911b616
Updates
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
mbed_official | 0:879aa9d0247b | 1 | #include "mbed.h" |
samuelstradling | 1:291cc733b64a | 2 | |
samuelstradling | 1:291cc733b64a | 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 | 1:291cc733b64a | 10 | #define TEMP_LIMIT 25 |
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 | |
MoHussan | 2:091e7846d11a | 20 | #define RLOW 8.474 |
MoHussan | 2:091e7846d11a | 21 | #define RHIGH 10.170 |
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 | |
MoHussan | 2:091e7846d11a | 30 | #define RLOW 80.4 |
MoHussan | 2:091e7846d11a | 31 | #define RHIGH 99.3 |
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 |