Charger Controller

Dependencies:   mbed

Committer:
JC2112
Date:
Sun May 20 11:47:23 2018 +0000
Revision:
0:a086e9699b2b
Charger Controller

Who changed what in which revision?

UserRevisionLine numberNew 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 }