Joe Capper
/
Charger_Controller_v3
Charger Controller
ChargerController.cpp@0:a086e9699b2b, 2018-05-20 (annotated)
- Committer:
- JC2112
- Date:
- Sun May 20 11:47:23 2018 +0000
- Revision:
- 0:a086e9699b2b
Charger Controller
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
JC2112 | 0:a086e9699b2b | 1 | #include "mbed.h" |
JC2112 | 0:a086e9699b2b | 2 | |
JC2112 | 0:a086e9699b2b | 3 | Ticker ticker; |
JC2112 | 0:a086e9699b2b | 4 | DigitalOut led1(LED1); |
JC2112 | 0:a086e9699b2b | 5 | DigitalOut led2(LED2); |
JC2112 | 0:a086e9699b2b | 6 | DigitalOut led3(LED3); |
JC2112 | 0:a086e9699b2b | 7 | DigitalOut led4(LED4); |
JC2112 | 0:a086e9699b2b | 8 | DigitalOut Charger1(p21); |
JC2112 | 0:a086e9699b2b | 9 | DigitalOut Charger2(p22); |
JC2112 | 0:a086e9699b2b | 10 | DigitalOut Shutdown(p25); |
JC2112 | 0:a086e9699b2b | 11 | DigitalIn Speed(p6); |
JC2112 | 0:a086e9699b2b | 12 | DigitalIn Reset(p5); |
JC2112 | 0:a086e9699b2b | 13 | CAN can1(p9, p10); |
JC2112 | 0:a086e9699b2b | 14 | CANMessage ControlMsg; |
JC2112 | 0:a086e9699b2b | 15 | CANMessage msg1; |
JC2112 | 0:a086e9699b2b | 16 | int Voltage = 300; |
JC2112 | 0:a086e9699b2b | 17 | int Current = 12; |
JC2112 | 0:a086e9699b2b | 18 | int ChargerVoltage; |
JC2112 | 0:a086e9699b2b | 19 | int ChargerCurrent; |
JC2112 | 0:a086e9699b2b | 20 | int SoC; |
JC2112 | 0:a086e9699b2b | 21 | int Temp; |
JC2112 | 0:a086e9699b2b | 22 | |
JC2112 | 0:a086e9699b2b | 23 | |
JC2112 | 0:a086e9699b2b | 24 | void send2Charger() { |
JC2112 | 0:a086e9699b2b | 25 | |
JC2112 | 0:a086e9699b2b | 26 | if (Speed){ |
JC2112 | 0:a086e9699b2b | 27 | Current = 16; |
JC2112 | 0:a086e9699b2b | 28 | } |
JC2112 | 0:a086e9699b2b | 29 | else{ |
JC2112 | 0:a086e9699b2b | 30 | Current = 12; |
JC2112 | 0:a086e9699b2b | 31 | } |
JC2112 | 0:a086e9699b2b | 32 | |
JC2112 | 0:a086e9699b2b | 33 | int DecV = Voltage * 10; |
JC2112 | 0:a086e9699b2b | 34 | int DecC = Current * 10; |
JC2112 | 0:a086e9699b2b | 35 | int Top8V = DecV >> 8; |
JC2112 | 0:a086e9699b2b | 36 | int Top8C = DecC >> 8; |
JC2112 | 0:a086e9699b2b | 37 | int bot8var = 255; |
JC2112 | 0:a086e9699b2b | 38 | int Bot8V = bot8var & DecV; |
JC2112 | 0:a086e9699b2b | 39 | int Bot8C = bot8var & DecC; |
JC2112 | 0:a086e9699b2b | 40 | |
JC2112 | 0:a086e9699b2b | 41 | ControlMsg.format = CANExtended;// or CANExtended; // standard or extended ID (can be skipped for standard) |
JC2112 | 0:a086e9699b2b | 42 | ControlMsg.id = 0x1806E5F4; |
JC2112 | 0:a086e9699b2b | 43 | ControlMsg.len = 4;//length in bytes (1 to 8); |
JC2112 | 0:a086e9699b2b | 44 | ControlMsg.data[0] = Top8V; // repeat for each byte. |
JC2112 | 0:a086e9699b2b | 45 | ControlMsg.data[1] = Bot8V; |
JC2112 | 0:a086e9699b2b | 46 | ControlMsg.data[2] = Top8C; |
JC2112 | 0:a086e9699b2b | 47 | ControlMsg.data[3] = Bot8C; |
JC2112 | 0:a086e9699b2b | 48 | ControlMsg.data[4] = 0; |
JC2112 | 0:a086e9699b2b | 49 | ControlMsg.data[5] = 0; |
JC2112 | 0:a086e9699b2b | 50 | ControlMsg.data[6] = 0; |
JC2112 | 0:a086e9699b2b | 51 | ControlMsg.data[7] = 0; |
JC2112 | 0:a086e9699b2b | 52 | if (can1.write(ControlMsg)){ |
JC2112 | 0:a086e9699b2b | 53 | led1 = !led1;} |
JC2112 | 0:a086e9699b2b | 54 | }; |
JC2112 | 0:a086e9699b2b | 55 | |
JC2112 | 0:a086e9699b2b | 56 | int main() { |
JC2112 | 0:a086e9699b2b | 57 | printf("main()\n\r"); |
JC2112 | 0:a086e9699b2b | 58 | ticker.attach(&send2Charger, 0.5); |
JC2112 | 0:a086e9699b2b | 59 | CANMessage msg; |
JC2112 | 0:a086e9699b2b | 60 | while(1) { |
JC2112 | 0:a086e9699b2b | 61 | if (can1.read(msg)) { |
JC2112 | 0:a086e9699b2b | 62 | if (msg.id == 0x11111111){ //BMS OK |
JC2112 | 0:a086e9699b2b | 63 | int OK = msg.data[0] + msg.data[1] + msg.data[2] + msg.data[3] + msg.data[4] + msg.data[5] + msg.data[6] + msg.data[7]; |
JC2112 | 0:a086e9699b2b | 64 | if (OK == 0){ |
JC2112 | 0:a086e9699b2b | 65 | printf("ERROR: BMS NOT OK!\n\r\n\r"); |
JC2112 | 0:a086e9699b2b | 66 | Shutdown = 1; |
JC2112 | 0:a086e9699b2b | 67 | } |
JC2112 | 0:a086e9699b2b | 68 | |
JC2112 | 0:a086e9699b2b | 69 | } |
JC2112 | 0:a086e9699b2b | 70 | if (msg.id == 0x150C5100){ //SoC Sub Pack 1 |
JC2112 | 0:a086e9699b2b | 71 | int s1 = msg.data[0] / 2; |
JC2112 | 0:a086e9699b2b | 72 | int s2 = msg.data[1] / 2; |
JC2112 | 0:a086e9699b2b | 73 | int s3 = msg.data[2] / 2; |
JC2112 | 0:a086e9699b2b | 74 | int s4 = msg.data[3] / 2; |
JC2112 | 0:a086e9699b2b | 75 | int s5 = msg.data[4] / 2; |
JC2112 | 0:a086e9699b2b | 76 | int s6 = msg.data[5] / 2; |
JC2112 | 0:a086e9699b2b | 77 | int s7 = msg.data[6] / 2; |
JC2112 | 0:a086e9699b2b | 78 | int s8 = msg.data[7] / 2; |
JC2112 | 0:a086e9699b2b | 79 | printf("Sub Pack 1: String 1: SoC: %d\n\r", s1); |
JC2112 | 0:a086e9699b2b | 80 | printf("Sub Pack 1: String 2: SoC: %d\n\r", s2); |
JC2112 | 0:a086e9699b2b | 81 | printf("Sub Pack 1: String 3: SoC: %d\n\r", s3); |
JC2112 | 0:a086e9699b2b | 82 | printf("Sub Pack 1: String 4: SoC: %d\n\r", s4); |
JC2112 | 0:a086e9699b2b | 83 | printf("Sub Pack 1: String 5: SoC: %d\n\r", s5); |
JC2112 | 0:a086e9699b2b | 84 | printf("Sub Pack 1: String 6: SoC: %d\n\r", s6); |
JC2112 | 0:a086e9699b2b | 85 | printf("Sub Pack 1: String 7: SoC: %d\n\r", s7); |
JC2112 | 0:a086e9699b2b | 86 | printf("Sub Pack 1: String 8: SoC: %d\n\r", s8); |
JC2112 | 0:a086e9699b2b | 87 | led2 = !led2; |
JC2112 | 0:a086e9699b2b | 88 | |
JC2112 | 0:a086e9699b2b | 89 | } |
JC2112 | 0:a086e9699b2b | 90 | if (msg.id == 0x18075100){ //Temp Sub Pack 1 |
JC2112 | 0:a086e9699b2b | 91 | |
JC2112 | 0:a086e9699b2b | 92 | int s1 = msg.data[0] / 3; |
JC2112 | 0:a086e9699b2b | 93 | int s2 = msg.data[1] / 3; |
JC2112 | 0:a086e9699b2b | 94 | int s3 = msg.data[2] / 3; |
JC2112 | 0:a086e9699b2b | 95 | int s4 = msg.data[3] / 3; |
JC2112 | 0:a086e9699b2b | 96 | int s5 = msg.data[4] / 3; |
JC2112 | 0:a086e9699b2b | 97 | int s6 = msg.data[5] / 3; |
JC2112 | 0:a086e9699b2b | 98 | int s7 = msg.data[6] / 3; |
JC2112 | 0:a086e9699b2b | 99 | int s8 = msg.data[7] / 3; |
JC2112 | 0:a086e9699b2b | 100 | printf("Sub Pack 1: String 1: Temp: %d\n\r", s1); |
JC2112 | 0:a086e9699b2b | 101 | printf("Sub Pack 1: String 2: Temp: %d\n\r", s2); |
JC2112 | 0:a086e9699b2b | 102 | printf("Sub Pack 1: String 3: Temp: %d\n\r", s3); |
JC2112 | 0:a086e9699b2b | 103 | printf("Sub Pack 1: String 4: Temp: %d\n\r", s4); |
JC2112 | 0:a086e9699b2b | 104 | printf("Sub Pack 1: String 5: Temp: %d\n\r", s5); |
JC2112 | 0:a086e9699b2b | 105 | printf("Sub Pack 1: String 6: Temp: %d\n\r", s6); |
JC2112 | 0:a086e9699b2b | 106 | printf("Sub Pack 1: String 7: Temp: %d\n\r", s7); |
JC2112 | 0:a086e9699b2b | 107 | printf("Sub Pack 1: String 8: Temp: %d\n\r", s8); |
JC2112 | 0:a086e9699b2b | 108 | led3 = !led3; |
JC2112 | 0:a086e9699b2b | 109 | } |
JC2112 | 0:a086e9699b2b | 110 | if (msg.id == 0x18FF50E5){ |
JC2112 | 0:a086e9699b2b | 111 | int HexVoltageTop = msg.data[0]; |
JC2112 | 0:a086e9699b2b | 112 | int HexVoltageBot = msg.data[1]; |
JC2112 | 0:a086e9699b2b | 113 | int HexCurrentTop = msg.data[2]; |
JC2112 | 0:a086e9699b2b | 114 | int HexCurrentBot = msg.data[3]; |
JC2112 | 0:a086e9699b2b | 115 | int d6 = msg.data[6]; |
JC2112 | 0:a086e9699b2b | 116 | int d7 = msg.data[7]; |
JC2112 | 0:a086e9699b2b | 117 | Charger1 = 1; |
JC2112 | 0:a086e9699b2b | 118 | Charger2 = 0; |
JC2112 | 0:a086e9699b2b | 119 | |
JC2112 | 0:a086e9699b2b | 120 | |
JC2112 | 0:a086e9699b2b | 121 | switch(d6) { |
JC2112 | 0:a086e9699b2b | 122 | case 138 : if (d7 == 119){ |
JC2112 | 0:a086e9699b2b | 123 | printf("Charger Error: No Battery!\n\r"); |
JC2112 | 0:a086e9699b2b | 124 | Shutdown = 1; |
JC2112 | 0:a086e9699b2b | 125 | } |
JC2112 | 0:a086e9699b2b | 126 | break; |
JC2112 | 0:a086e9699b2b | 127 | case 8 : if (d7 == 7){ |
JC2112 | 0:a086e9699b2b | 128 | printf("Charger Error: Over Heating!\n\r"); |
JC2112 | 0:a086e9699b2b | 129 | Shutdown = 1; |
JC2112 | 0:a086e9699b2b | 130 | } |
JC2112 | 0:a086e9699b2b | 131 | break; |
JC2112 | 0:a086e9699b2b | 132 | } |
JC2112 | 0:a086e9699b2b | 133 | |
JC2112 | 0:a086e9699b2b | 134 | int TopVoltCharger = HexVoltageTop << 8; |
JC2112 | 0:a086e9699b2b | 135 | ChargerVoltage = 0 | TopVoltCharger; |
JC2112 | 0:a086e9699b2b | 136 | ChargerVoltage = ChargerVoltage | HexVoltageBot; |
JC2112 | 0:a086e9699b2b | 137 | ChargerVoltage = ChargerVoltage/10; |
JC2112 | 0:a086e9699b2b | 138 | |
JC2112 | 0:a086e9699b2b | 139 | int TopCurrentCharger = HexCurrentTop << 8; |
JC2112 | 0:a086e9699b2b | 140 | ChargerCurrent = 0 | TopCurrentCharger; |
JC2112 | 0:a086e9699b2b | 141 | ChargerCurrent = ChargerCurrent | HexCurrentBot; |
JC2112 | 0:a086e9699b2b | 142 | ChargerCurrent = ChargerCurrent/10; |
JC2112 | 0:a086e9699b2b | 143 | |
JC2112 | 0:a086e9699b2b | 144 | if (ChargerVoltage > Voltage){ |
JC2112 | 0:a086e9699b2b | 145 | printf("ERROR: Charger Voltage Too High! \n\r"); |
JC2112 | 0:a086e9699b2b | 146 | printf("Max Voltage: %d\n\r", Voltage); |
JC2112 | 0:a086e9699b2b | 147 | printf("Charger Voltage: %d\n\r", ChargerVoltage); //This needs adapting as this can happen in constant current!!! |
JC2112 | 0:a086e9699b2b | 148 | ticker.detach(); |
JC2112 | 0:a086e9699b2b | 149 | Shutdown = 1; |
JC2112 | 0:a086e9699b2b | 150 | } |
JC2112 | 0:a086e9699b2b | 151 | else if (ChargerCurrent > Current){ |
JC2112 | 0:a086e9699b2b | 152 | printf("ERROR: Charger Current Too High! \n\r"); |
JC2112 | 0:a086e9699b2b | 153 | printf("Max Current: %d\n\r", Current); |
JC2112 | 0:a086e9699b2b | 154 | printf("Charger Current: %d\n\r", ChargerCurrent); //This needs adapting as this can happen in constant current!!! |
JC2112 | 0:a086e9699b2b | 155 | ticker.detach(); |
JC2112 | 0:a086e9699b2b | 156 | Shutdown = 1; |
JC2112 | 0:a086e9699b2b | 157 | } |
JC2112 | 0:a086e9699b2b | 158 | else{ |
JC2112 | 0:a086e9699b2b | 159 | printf("Charger Voltage: %d\n\r", ChargerVoltage); |
JC2112 | 0:a086e9699b2b | 160 | printf("Charger Current: %d\n\r", ChargerCurrent); |
JC2112 | 0:a086e9699b2b | 161 | ticker.attach(&send2Charger, 0.5); |
JC2112 | 0:a086e9699b2b | 162 | |
JC2112 | 0:a086e9699b2b | 163 | } |
JC2112 | 0:a086e9699b2b | 164 | |
JC2112 | 0:a086e9699b2b | 165 | led4 = !led4; |
JC2112 | 0:a086e9699b2b | 166 | } |
JC2112 | 0:a086e9699b2b | 167 | |
JC2112 | 0:a086e9699b2b | 168 | |
JC2112 | 0:a086e9699b2b | 169 | |
JC2112 | 0:a086e9699b2b | 170 | if (msg.id == 0x18FF50E7){ |
JC2112 | 0:a086e9699b2b | 171 | int HexVoltageTop = msg.data[0]; |
JC2112 | 0:a086e9699b2b | 172 | int HexVoltageBot = msg.data[1]; |
JC2112 | 0:a086e9699b2b | 173 | int HexCurrentTop = msg.data[2]; |
JC2112 | 0:a086e9699b2b | 174 | int HexCurrentBot = msg.data[3]; |
JC2112 | 0:a086e9699b2b | 175 | int d6 = msg.data[6]; |
JC2112 | 0:a086e9699b2b | 176 | int d7 = msg.data[7]; |
JC2112 | 0:a086e9699b2b | 177 | Charger1 = 0; |
JC2112 | 0:a086e9699b2b | 178 | Charger2 = 1; |
JC2112 | 0:a086e9699b2b | 179 | |
JC2112 | 0:a086e9699b2b | 180 | switch(d6) { |
JC2112 | 0:a086e9699b2b | 181 | case 138 : if (d7 == 119){ |
JC2112 | 0:a086e9699b2b | 182 | printf("Charger Error: No Battery!\n\r"); |
JC2112 | 0:a086e9699b2b | 183 | Shutdown = 1; |
JC2112 | 0:a086e9699b2b | 184 | } |
JC2112 | 0:a086e9699b2b | 185 | break; |
JC2112 | 0:a086e9699b2b | 186 | case 8 : if (d7 == 7){ |
JC2112 | 0:a086e9699b2b | 187 | printf("Charger Error: Over Heating!\n\r"); |
JC2112 | 0:a086e9699b2b | 188 | Shutdown = 1; |
JC2112 | 0:a086e9699b2b | 189 | } |
JC2112 | 0:a086e9699b2b | 190 | break; |
JC2112 | 0:a086e9699b2b | 191 | } |
JC2112 | 0:a086e9699b2b | 192 | |
JC2112 | 0:a086e9699b2b | 193 | int TopVoltCharger = HexVoltageTop << 8; |
JC2112 | 0:a086e9699b2b | 194 | ChargerVoltage = 0 | TopVoltCharger; |
JC2112 | 0:a086e9699b2b | 195 | ChargerVoltage = ChargerVoltage | HexVoltageBot; |
JC2112 | 0:a086e9699b2b | 196 | ChargerVoltage = ChargerVoltage/10; |
JC2112 | 0:a086e9699b2b | 197 | |
JC2112 | 0:a086e9699b2b | 198 | int TopCurrentCharger = HexCurrentTop << 8; |
JC2112 | 0:a086e9699b2b | 199 | ChargerCurrent = 0 | TopCurrentCharger; |
JC2112 | 0:a086e9699b2b | 200 | ChargerCurrent = ChargerCurrent | HexCurrentBot; |
JC2112 | 0:a086e9699b2b | 201 | ChargerCurrent = ChargerCurrent/10; |
JC2112 | 0:a086e9699b2b | 202 | |
JC2112 | 0:a086e9699b2b | 203 | if (ChargerVoltage > Voltage){ |
JC2112 | 0:a086e9699b2b | 204 | printf("ERROR: Charger Voltage Too High! \n\r"); |
JC2112 | 0:a086e9699b2b | 205 | printf("Max Voltage: %d\n\r", Voltage); |
JC2112 | 0:a086e9699b2b | 206 | printf("Charger Voltage: %d\n\r", ChargerVoltage); //This needs adapting as this can happen in constant current!!! |
JC2112 | 0:a086e9699b2b | 207 | ticker.detach(); |
JC2112 | 0:a086e9699b2b | 208 | Shutdown = 1; |
JC2112 | 0:a086e9699b2b | 209 | } |
JC2112 | 0:a086e9699b2b | 210 | else if (ChargerCurrent > Current){ |
JC2112 | 0:a086e9699b2b | 211 | printf("ERROR: Charger Current Too High! \n\r"); |
JC2112 | 0:a086e9699b2b | 212 | printf("Max Current: %d\n\r", Current); |
JC2112 | 0:a086e9699b2b | 213 | printf("Charger Current: %d\n\r", ChargerCurrent); //This needs adapting as this can happen in constant current!!! |
JC2112 | 0:a086e9699b2b | 214 | ticker.detach(); |
JC2112 | 0:a086e9699b2b | 215 | Shutdown = 1; |
JC2112 | 0:a086e9699b2b | 216 | } |
JC2112 | 0:a086e9699b2b | 217 | else{ |
JC2112 | 0:a086e9699b2b | 218 | printf("Charger Voltage: %d\n\r", ChargerVoltage); |
JC2112 | 0:a086e9699b2b | 219 | printf("Charger Current: %d\n\r", ChargerCurrent); |
JC2112 | 0:a086e9699b2b | 220 | ticker.attach(&send2Charger, 0.5); |
JC2112 | 0:a086e9699b2b | 221 | } |
JC2112 | 0:a086e9699b2b | 222 | |
JC2112 | 0:a086e9699b2b | 223 | led4 = !led4; |
JC2112 | 0:a086e9699b2b | 224 | } |
JC2112 | 0:a086e9699b2b | 225 | if(Reset){ |
JC2112 | 0:a086e9699b2b | 226 | ticker.attach(&send2Charger, 1); |
JC2112 | 0:a086e9699b2b | 227 | Shutdown = 0; |
JC2112 | 0:a086e9699b2b | 228 | } |
JC2112 | 0:a086e9699b2b | 229 | |
JC2112 | 0:a086e9699b2b | 230 | } |
JC2112 | 0:a086e9699b2b | 231 | |
JC2112 | 0:a086e9699b2b | 232 | } |