Joe Capper
/
DummyBMSCharger_v1
Detailed Design Dummy BMS and Charger code
main.cpp@0:68289c64435b, 2018-05-20 (annotated)
- Committer:
- JC2112
- Date:
- Sun May 20 11:37:56 2018 +0000
- Revision:
- 0:68289c64435b
Detailed Design;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
JC2112 | 0:68289c64435b | 1 | #include "mbed.h" |
JC2112 | 0:68289c64435b | 2 | |
JC2112 | 0:68289c64435b | 3 | Ticker BMSticker1; |
JC2112 | 0:68289c64435b | 4 | Ticker BMSticker2; |
JC2112 | 0:68289c64435b | 5 | Ticker SoCSP1ticker; |
JC2112 | 0:68289c64435b | 6 | Ticker TempSP1ticker; |
JC2112 | 0:68289c64435b | 7 | Ticker Chargerticker; |
JC2112 | 0:68289c64435b | 8 | DigitalOut led1(LED1); |
JC2112 | 0:68289c64435b | 9 | DigitalOut led2(LED2); |
JC2112 | 0:68289c64435b | 10 | DigitalOut led3(LED3); |
JC2112 | 0:68289c64435b | 11 | DigitalOut led4(LED4); |
JC2112 | 0:68289c64435b | 12 | DigitalOut Normal(p21); |
JC2112 | 0:68289c64435b | 13 | DigitalOut Fast(p22); |
JC2112 | 0:68289c64435b | 14 | DigitalOut OKError(p25); |
JC2112 | 0:68289c64435b | 15 | DigitalOut ChargeStateError(p26); |
JC2112 | 0:68289c64435b | 16 | DigitalOut VoltageError(p27); |
JC2112 | 0:68289c64435b | 17 | DigitalIn OKSwitch(p5); |
JC2112 | 0:68289c64435b | 18 | DigitalIn ChargeStateSwitch(p6); |
JC2112 | 0:68289c64435b | 19 | DigitalIn VoltageSwitch(p7); |
JC2112 | 0:68289c64435b | 20 | DigitalIn Charger(p8); |
JC2112 | 0:68289c64435b | 21 | CAN can1(p9, p10); |
JC2112 | 0:68289c64435b | 22 | CAN can2(p30, p29); |
JC2112 | 0:68289c64435b | 23 | CANMessage BMSMsg; |
JC2112 | 0:68289c64435b | 24 | CANMessage BMSOK; |
JC2112 | 0:68289c64435b | 25 | CANMessage BMSSoCSP1; |
JC2112 | 0:68289c64435b | 26 | CANMessage BMSTSP1; |
JC2112 | 0:68289c64435b | 27 | CANMessage ChargerMsg; |
JC2112 | 0:68289c64435b | 28 | int Voltage; |
JC2112 | 0:68289c64435b | 29 | int Current; |
JC2112 | 0:68289c64435b | 30 | |
JC2112 | 0:68289c64435b | 31 | void DummyBMSOK() { |
JC2112 | 0:68289c64435b | 32 | |
JC2112 | 0:68289c64435b | 33 | int OK; |
JC2112 | 0:68289c64435b | 34 | |
JC2112 | 0:68289c64435b | 35 | if(OKSwitch){ |
JC2112 | 0:68289c64435b | 36 | OKError = 1; |
JC2112 | 0:68289c64435b | 37 | OK = 1; |
JC2112 | 0:68289c64435b | 38 | } |
JC2112 | 0:68289c64435b | 39 | else{ |
JC2112 | 0:68289c64435b | 40 | OKError = 0; |
JC2112 | 0:68289c64435b | 41 | OK = 0; |
JC2112 | 0:68289c64435b | 42 | } |
JC2112 | 0:68289c64435b | 43 | |
JC2112 | 0:68289c64435b | 44 | BMSOK.format = CANExtended;// or CANExtended; // standard or extended ID (can be skipped for standard) |
JC2112 | 0:68289c64435b | 45 | BMSOK.id = 0x11111111; |
JC2112 | 0:68289c64435b | 46 | BMSOK.len = 8;//length in bytes (1 to 8); |
JC2112 | 0:68289c64435b | 47 | |
JC2112 | 0:68289c64435b | 48 | if (OK == 0){ |
JC2112 | 0:68289c64435b | 49 | BMSOK.data[0] = 0; |
JC2112 | 0:68289c64435b | 50 | BMSOK.data[1] = 0; |
JC2112 | 0:68289c64435b | 51 | BMSOK.data[2] = 0; |
JC2112 | 0:68289c64435b | 52 | BMSOK.data[3] = 0; |
JC2112 | 0:68289c64435b | 53 | BMSOK.data[4] = 0; |
JC2112 | 0:68289c64435b | 54 | BMSOK.data[5] = 0; |
JC2112 | 0:68289c64435b | 55 | BMSOK.data[6] = 0; |
JC2112 | 0:68289c64435b | 56 | BMSOK.data[7] = 0; |
JC2112 | 0:68289c64435b | 57 | } |
JC2112 | 0:68289c64435b | 58 | else{ |
JC2112 | 0:68289c64435b | 59 | BMSOK.data[0] = 255; |
JC2112 | 0:68289c64435b | 60 | BMSOK.data[1] = 255; |
JC2112 | 0:68289c64435b | 61 | BMSOK.data[2] = 255; |
JC2112 | 0:68289c64435b | 62 | BMSOK.data[3] = 255; |
JC2112 | 0:68289c64435b | 63 | BMSOK.data[4] = 255; |
JC2112 | 0:68289c64435b | 64 | BMSOK.data[5] = 255; |
JC2112 | 0:68289c64435b | 65 | BMSOK.data[6] = 255; |
JC2112 | 0:68289c64435b | 66 | BMSOK.data[7] = 255; |
JC2112 | 0:68289c64435b | 67 | } |
JC2112 | 0:68289c64435b | 68 | |
JC2112 | 0:68289c64435b | 69 | if (can1.write(BMSOK)){ |
JC2112 | 0:68289c64435b | 70 | led1 = !led1; |
JC2112 | 0:68289c64435b | 71 | } |
JC2112 | 0:68289c64435b | 72 | }; |
JC2112 | 0:68289c64435b | 73 | |
JC2112 | 0:68289c64435b | 74 | void DummyBMSSoCSP1(){ |
JC2112 | 0:68289c64435b | 75 | |
JC2112 | 0:68289c64435b | 76 | BMSSoCSP1.format = CANExtended;// or CANExtended; // standard or extended ID (can be skipped for standard) |
JC2112 | 0:68289c64435b | 77 | BMSSoCSP1.id = 0x150C5100; |
JC2112 | 0:68289c64435b | 78 | BMSSoCSP1.len = 8;//length in bytes (1 to 8); |
JC2112 | 0:68289c64435b | 79 | |
JC2112 | 0:68289c64435b | 80 | int s1 = 55; |
JC2112 | 0:68289c64435b | 81 | int s2 = 51; |
JC2112 | 0:68289c64435b | 82 | int s3 = 52; |
JC2112 | 0:68289c64435b | 83 | int s4 = 58; |
JC2112 | 0:68289c64435b | 84 | int s5 = 49; |
JC2112 | 0:68289c64435b | 85 | int s6 = 53; |
JC2112 | 0:68289c64435b | 86 | int s7 = 54; |
JC2112 | 0:68289c64435b | 87 | int s8 = 56; |
JC2112 | 0:68289c64435b | 88 | |
JC2112 | 0:68289c64435b | 89 | int s1h = s1 * 2; |
JC2112 | 0:68289c64435b | 90 | int s2h = s2 * 2; |
JC2112 | 0:68289c64435b | 91 | int s3h = s3 * 2; |
JC2112 | 0:68289c64435b | 92 | int s4h = s4 * 2; |
JC2112 | 0:68289c64435b | 93 | int s5h = s5 * 2; |
JC2112 | 0:68289c64435b | 94 | int s6h = s6 * 2; |
JC2112 | 0:68289c64435b | 95 | int s7h = s7 * 2; |
JC2112 | 0:68289c64435b | 96 | int s8h = s8 * 2; |
JC2112 | 0:68289c64435b | 97 | |
JC2112 | 0:68289c64435b | 98 | |
JC2112 | 0:68289c64435b | 99 | |
JC2112 | 0:68289c64435b | 100 | BMSSoCSP1.data[0] = s1h; |
JC2112 | 0:68289c64435b | 101 | BMSSoCSP1.data[1] = s2h; |
JC2112 | 0:68289c64435b | 102 | BMSSoCSP1.data[2] = s3h; |
JC2112 | 0:68289c64435b | 103 | BMSSoCSP1.data[3] = s4h; |
JC2112 | 0:68289c64435b | 104 | BMSSoCSP1.data[4] = s5h; |
JC2112 | 0:68289c64435b | 105 | BMSSoCSP1.data[5] = s6h; |
JC2112 | 0:68289c64435b | 106 | BMSSoCSP1.data[6] = s7h; |
JC2112 | 0:68289c64435b | 107 | BMSSoCSP1.data[7] = s8h; |
JC2112 | 0:68289c64435b | 108 | |
JC2112 | 0:68289c64435b | 109 | if (can1.write(BMSSoCSP1)){ |
JC2112 | 0:68289c64435b | 110 | //led1 = !led1; |
JC2112 | 0:68289c64435b | 111 | } |
JC2112 | 0:68289c64435b | 112 | }; |
JC2112 | 0:68289c64435b | 113 | |
JC2112 | 0:68289c64435b | 114 | void DummyBMSTempSP1() { |
JC2112 | 0:68289c64435b | 115 | |
JC2112 | 0:68289c64435b | 116 | BMSTSP1.format = CANExtended;// or CANExtended; // standard or extended ID (can be skipped for standard) |
JC2112 | 0:68289c64435b | 117 | BMSTSP1.id = 0x18075100; |
JC2112 | 0:68289c64435b | 118 | BMSTSP1.len = 8;//length in bytes (1 to 8); |
JC2112 | 0:68289c64435b | 119 | |
JC2112 | 0:68289c64435b | 120 | int s1 = 29; |
JC2112 | 0:68289c64435b | 121 | int s2 = 29; |
JC2112 | 0:68289c64435b | 122 | int s3 = 30; |
JC2112 | 0:68289c64435b | 123 | int s4 = 31; |
JC2112 | 0:68289c64435b | 124 | int s5 = 32; |
JC2112 | 0:68289c64435b | 125 | int s6 = 32; |
JC2112 | 0:68289c64435b | 126 | int s7 = 32; |
JC2112 | 0:68289c64435b | 127 | int s8 = 33; |
JC2112 | 0:68289c64435b | 128 | |
JC2112 | 0:68289c64435b | 129 | int s1h = s1 * 3; |
JC2112 | 0:68289c64435b | 130 | int s2h = s2 * 3; |
JC2112 | 0:68289c64435b | 131 | int s3h = s3 * 3; |
JC2112 | 0:68289c64435b | 132 | int s4h = s4 * 3; |
JC2112 | 0:68289c64435b | 133 | int s5h = s5 * 3; |
JC2112 | 0:68289c64435b | 134 | int s6h = s6 * 3; |
JC2112 | 0:68289c64435b | 135 | int s7h = s7 * 3; |
JC2112 | 0:68289c64435b | 136 | int s8h = s8 * 3; |
JC2112 | 0:68289c64435b | 137 | |
JC2112 | 0:68289c64435b | 138 | |
JC2112 | 0:68289c64435b | 139 | |
JC2112 | 0:68289c64435b | 140 | BMSTSP1.data[0] = s1h; |
JC2112 | 0:68289c64435b | 141 | BMSTSP1.data[1] = s2h; |
JC2112 | 0:68289c64435b | 142 | BMSTSP1.data[2] = s3h; |
JC2112 | 0:68289c64435b | 143 | BMSTSP1.data[3] = s4h; |
JC2112 | 0:68289c64435b | 144 | BMSTSP1.data[4] = s5h; |
JC2112 | 0:68289c64435b | 145 | BMSTSP1.data[5] = s6h; |
JC2112 | 0:68289c64435b | 146 | BMSTSP1.data[6] = s7h; |
JC2112 | 0:68289c64435b | 147 | BMSTSP1.data[7] = s8h; |
JC2112 | 0:68289c64435b | 148 | |
JC2112 | 0:68289c64435b | 149 | if (can1.write(BMSTSP1)){ |
JC2112 | 0:68289c64435b | 150 | led2 = !led2; |
JC2112 | 0:68289c64435b | 151 | } |
JC2112 | 0:68289c64435b | 152 | }; |
JC2112 | 0:68289c64435b | 153 | |
JC2112 | 0:68289c64435b | 154 | void DummyCharger(){ |
JC2112 | 0:68289c64435b | 155 | |
JC2112 | 0:68289c64435b | 156 | int VoltageNew; |
JC2112 | 0:68289c64435b | 157 | int CurrentNew = 2.4; |
JC2112 | 0:68289c64435b | 158 | |
JC2112 | 0:68289c64435b | 159 | if(VoltageSwitch){ |
JC2112 | 0:68289c64435b | 160 | VoltageError = 1; |
JC2112 | 0:68289c64435b | 161 | VoltageNew = 500; |
JC2112 | 0:68289c64435b | 162 | } |
JC2112 | 0:68289c64435b | 163 | else{ |
JC2112 | 0:68289c64435b | 164 | VoltageError = 0; |
JC2112 | 0:68289c64435b | 165 | VoltageNew = 300; |
JC2112 | 0:68289c64435b | 166 | } |
JC2112 | 0:68289c64435b | 167 | |
JC2112 | 0:68289c64435b | 168 | int State_No_Batt = 0; |
JC2112 | 0:68289c64435b | 169 | int State_Over_Heat = 0; |
JC2112 | 0:68289c64435b | 170 | int d6 = 0x00; |
JC2112 | 0:68289c64435b | 171 | int d7 = 0x00; |
JC2112 | 0:68289c64435b | 172 | |
JC2112 | 0:68289c64435b | 173 | if (ChargeStateSwitch){ |
JC2112 | 0:68289c64435b | 174 | ChargeStateError = 1; |
JC2112 | 0:68289c64435b | 175 | //State_No_Batt = 1; |
JC2112 | 0:68289c64435b | 176 | State_Over_Heat = 1; |
JC2112 | 0:68289c64435b | 177 | } |
JC2112 | 0:68289c64435b | 178 | else{ |
JC2112 | 0:68289c64435b | 179 | ChargeStateError = 0; |
JC2112 | 0:68289c64435b | 180 | State_No_Batt = 0; |
JC2112 | 0:68289c64435b | 181 | State_Over_Heat = 0; |
JC2112 | 0:68289c64435b | 182 | } |
JC2112 | 0:68289c64435b | 183 | |
JC2112 | 0:68289c64435b | 184 | if (State_No_Batt == 1){ |
JC2112 | 0:68289c64435b | 185 | d6 = 0x8A; |
JC2112 | 0:68289c64435b | 186 | d7 = 0x77; |
JC2112 | 0:68289c64435b | 187 | printf("No Battery\n\r"); |
JC2112 | 0:68289c64435b | 188 | } |
JC2112 | 0:68289c64435b | 189 | else if (State_Over_Heat == 1){ |
JC2112 | 0:68289c64435b | 190 | d6 = 0x08; |
JC2112 | 0:68289c64435b | 191 | d7 = 0x07; |
JC2112 | 0:68289c64435b | 192 | } |
JC2112 | 0:68289c64435b | 193 | else { |
JC2112 | 0:68289c64435b | 194 | d6 = 0x00; |
JC2112 | 0:68289c64435b | 195 | d7 = 0x00; |
JC2112 | 0:68289c64435b | 196 | }; |
JC2112 | 0:68289c64435b | 197 | |
JC2112 | 0:68289c64435b | 198 | int DecV = VoltageNew * 10; |
JC2112 | 0:68289c64435b | 199 | int DecC = CurrentNew * 10; |
JC2112 | 0:68289c64435b | 200 | int Top8V = DecV >> 8; |
JC2112 | 0:68289c64435b | 201 | int Top8C = DecC >> 8; |
JC2112 | 0:68289c64435b | 202 | int Bot8var = 255; |
JC2112 | 0:68289c64435b | 203 | int Bot8V = Bot8var & DecV; |
JC2112 | 0:68289c64435b | 204 | int Bot8C = Bot8var & DecC; |
JC2112 | 0:68289c64435b | 205 | |
JC2112 | 0:68289c64435b | 206 | ChargerMsg.format = CANExtended;// or CANExtended; // standard or extended ID (can be skipped for standard) |
JC2112 | 0:68289c64435b | 207 | if (Charger){ |
JC2112 | 0:68289c64435b | 208 | ChargerMsg.id = 0x18FF50E5; |
JC2112 | 0:68289c64435b | 209 | } |
JC2112 | 0:68289c64435b | 210 | else{ |
JC2112 | 0:68289c64435b | 211 | ChargerMsg.id = 0x18FF50E7; |
JC2112 | 0:68289c64435b | 212 | } |
JC2112 | 0:68289c64435b | 213 | ChargerMsg.len = 8;//length in bytes (1 to 8); |
JC2112 | 0:68289c64435b | 214 | ChargerMsg.data[0] = Top8V; // repeat for each byte. |
JC2112 | 0:68289c64435b | 215 | ChargerMsg.data[1] = Bot8V; |
JC2112 | 0:68289c64435b | 216 | ChargerMsg.data[2] = Top8C; |
JC2112 | 0:68289c64435b | 217 | ChargerMsg.data[3] = Bot8C; |
JC2112 | 0:68289c64435b | 218 | ChargerMsg.data[4] = 0; |
JC2112 | 0:68289c64435b | 219 | ChargerMsg.data[5] = 0; |
JC2112 | 0:68289c64435b | 220 | ChargerMsg.data[6] = d6; |
JC2112 | 0:68289c64435b | 221 | ChargerMsg.data[7] = d7; |
JC2112 | 0:68289c64435b | 222 | if (can2.write(ChargerMsg)){ |
JC2112 | 0:68289c64435b | 223 | led3 = !led3; |
JC2112 | 0:68289c64435b | 224 | } |
JC2112 | 0:68289c64435b | 225 | }; |
JC2112 | 0:68289c64435b | 226 | |
JC2112 | 0:68289c64435b | 227 | int main() { |
JC2112 | 0:68289c64435b | 228 | printf("main()\n\r"); |
JC2112 | 0:68289c64435b | 229 | BMSticker1.attach(&DummyBMSSoC, 1); |
JC2112 | 0:68289c64435b | 230 | BMSticker2.attach(&DummyBMSOK, 0.5); |
JC2112 | 0:68289c64435b | 231 | SoCSP1ticker.attach(&DummyBMSSoCSP1, 1); |
JC2112 | 0:68289c64435b | 232 | TempSP1ticker.attach(&DummyBMSTempSP1, 1); |
JC2112 | 0:68289c64435b | 233 | Chargerticker.attach(&DummyCharger, 1); |
JC2112 | 0:68289c64435b | 234 | CANMessage msg; |
JC2112 | 0:68289c64435b | 235 | while(1) { |
JC2112 | 0:68289c64435b | 236 | if (can1.read(msg)) { |
JC2112 | 0:68289c64435b | 237 | if (msg.id == 0x1806E5F4){ |
JC2112 | 0:68289c64435b | 238 | int HexVoltageTop = msg.data[0]; |
JC2112 | 0:68289c64435b | 239 | int HexVoltageBot = msg.data[1]; |
JC2112 | 0:68289c64435b | 240 | int HexCurrentTop = msg.data[2]; |
JC2112 | 0:68289c64435b | 241 | int HexCurrentBot = msg.data[3]; |
JC2112 | 0:68289c64435b | 242 | |
JC2112 | 0:68289c64435b | 243 | |
JC2112 | 0:68289c64435b | 244 | int TopVoltage = HexVoltageTop << 8; |
JC2112 | 0:68289c64435b | 245 | Voltage = 0 | TopVoltage; |
JC2112 | 0:68289c64435b | 246 | Voltage = Voltage | HexVoltageBot; |
JC2112 | 0:68289c64435b | 247 | Voltage = Voltage/10; |
JC2112 | 0:68289c64435b | 248 | |
JC2112 | 0:68289c64435b | 249 | int TopCurrent = HexCurrentTop << 8; |
JC2112 | 0:68289c64435b | 250 | Current = 0 | TopCurrent; |
JC2112 | 0:68289c64435b | 251 | Current = Current | HexCurrentBot; |
JC2112 | 0:68289c64435b | 252 | Current = Current/10; |
JC2112 | 0:68289c64435b | 253 | printf("Charger Current: %d\n\r", Current); |
JC2112 | 0:68289c64435b | 254 | if (Current == 16){ |
JC2112 | 0:68289c64435b | 255 | Fast = 1; |
JC2112 | 0:68289c64435b | 256 | Normal = 0; |
JC2112 | 0:68289c64435b | 257 | } |
JC2112 | 0:68289c64435b | 258 | else{ |
JC2112 | 0:68289c64435b | 259 | Fast = 0; |
JC2112 | 0:68289c64435b | 260 | Normal = 1; |
JC2112 | 0:68289c64435b | 261 | } |
JC2112 | 0:68289c64435b | 262 | led4 = !led4; |
JC2112 | 0:68289c64435b | 263 | } |
JC2112 | 0:68289c64435b | 264 | |
JC2112 | 0:68289c64435b | 265 | } |
JC2112 | 0:68289c64435b | 266 | } |
JC2112 | 0:68289c64435b | 267 | |
JC2112 | 0:68289c64435b | 268 | } |