all bms comunicating with nucleo board and balancing

Dependencies:   CANnucleo LTC68041 mbed

Fork of BMS_2 by Joao Vieira

Committer:
Crazyaboutmachines
Date:
Tue Oct 25 12:49:57 2016 +0000
Revision:
28:b7d1c8d8a2aa
Parent:
27:db96e99e37c9
Child:
29:86e963cc5ce7
not reading voltages during discharge

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Crazyaboutmachines 27:db96e99e37c9 1 /*notes:---------------------
Crazyaboutmachines 27:db96e99e37c9 2 *-organizar codigo
Crazyaboutmachines 28:b7d1c8d8a2aa 3 *-ver como desactivar balanceamento durante leitura de correntes e comparar as tensões obtidas
Crazyaboutmachines 28:b7d1c8d8a2aa 4 *
Crazyaboutmachines 28:b7d1c8d8a2aa 5 *
Crazyaboutmachines 27:db96e99e37c9 6 *
Crazyaboutmachines 27:db96e99e37c9 7 *
Crazyaboutmachines 27:db96e99e37c9 8 *
Crazyaboutmachines 27:db96e99e37c9 9 *
Crazyaboutmachines 27:db96e99e37c9 10 -----------------------------*/
Crazyaboutmachines 27:db96e99e37c9 11
Crazyaboutmachines 27:db96e99e37c9 12
Crazyaboutmachines 27:db96e99e37c9 13
Crazyaboutmachines 27:db96e99e37c9 14
hudakz 19:872e304d7e17 15 #include "CANnucleo.h"
hudakz 16:a86f339d1c25 16 #include "mbed.h"
ser1516 21:988413f53fbe 17 #include "LTC68041.h"
hudakz 16:a86f339d1c25 18
ser1516 21:988413f53fbe 19
ser1516 21:988413f53fbe 20
ser1516 21:988413f53fbe 21 uint8_t const TOTAL_IC = 1;//!<number of ICs in the daisy chain
ser1516 21:988413f53fbe 22
ser1516 21:988413f53fbe 23 uint8_t rx_cfg[TOTAL_IC][8];
ser1516 21:988413f53fbe 24 uint8_t tx_cfg[TOTAL_IC][6];
ser1516 21:988413f53fbe 25 uint16_t aux_codes[TOTAL_IC][6];
ser1516 21:988413f53fbe 26 uint16_t cell_codes[TOTAL_IC][12];
ser1516 21:988413f53fbe 27 volatile bool msgAvailable = false;
ser1516 21:988413f53fbe 28 volatile bool to_send = false;
hudakz 17:18d4d0ff26a6 29 CANnucleo::CAN can(PA_11, PA_12); // CAN Rx pin name, CAN Tx pin name
hudakz 17:18d4d0ff26a6 30 CANnucleo::CANMessage rxMsg;
hudakz 17:18d4d0ff26a6 31 CANnucleo::CANMessage txMsg;
ser1516 21:988413f53fbe 32 DigitalOut led(PA_5);
ser1516 21:988413f53fbe 33 /*!***********************************
ser1516 21:988413f53fbe 34 \brief Initializes the configuration array
ser1516 21:988413f53fbe 35 **************************************/
ser1516 21:988413f53fbe 36 void init_cfg()
ser1516 21:988413f53fbe 37 {
ser1516 21:988413f53fbe 38 for (int i = 0; i<TOTAL_IC; i++) {
ser1516 21:988413f53fbe 39 tx_cfg[i][0] = 0xFE;
ser1516 21:988413f53fbe 40 tx_cfg[i][1] = 0x00 ;
ser1516 21:988413f53fbe 41 tx_cfg[i][2] = 0x00 ;
ser1516 21:988413f53fbe 42 tx_cfg[i][3] = 0x00 ;
ser1516 21:988413f53fbe 43 tx_cfg[i][4] = 0x00 ;
ser1516 21:988413f53fbe 44 tx_cfg[i][5] = 0x00 ;
ser1516 21:988413f53fbe 45 }
ser1516 21:988413f53fbe 46 }
ser1516 21:988413f53fbe 47 void serial_print_hex(uint8_t data)
ser1516 21:988413f53fbe 48 {
ser1516 21:988413f53fbe 49 if (data< 16) {
ser1516 21:988413f53fbe 50 printf("0");
ser1516 21:988413f53fbe 51 printf("%x",(uint8_t)data);
ser1516 21:988413f53fbe 52 } else
ser1516 21:988413f53fbe 53 printf("%x",(uint8_t)data);
ser1516 21:988413f53fbe 54 }
ser1516 21:988413f53fbe 55 void print_config()
ser1516 21:988413f53fbe 56 {
ser1516 21:988413f53fbe 57 int cfg_pec;
ser1516 21:988413f53fbe 58 printf("Written Configuration:\n\r ");
ser1516 21:988413f53fbe 59 for (int current_ic = 0; current_ic<TOTAL_IC; current_ic++) {
ser1516 21:988413f53fbe 60 printf(" IC ");
ser1516 21:988413f53fbe 61 printf("%d", current_ic+1);
ser1516 21:988413f53fbe 62 printf(": ");
ser1516 21:988413f53fbe 63 printf("0x");
ser1516 21:988413f53fbe 64 serial_print_hex(tx_cfg[current_ic][0]);
ser1516 21:988413f53fbe 65 printf(", 0x");
ser1516 21:988413f53fbe 66 serial_print_hex(tx_cfg[current_ic][1]);
ser1516 21:988413f53fbe 67 printf(", 0x");
ser1516 21:988413f53fbe 68 serial_print_hex(tx_cfg[current_ic][2]);
ser1516 21:988413f53fbe 69 printf(", 0x");
ser1516 21:988413f53fbe 70 serial_print_hex(tx_cfg[current_ic][3]);
ser1516 21:988413f53fbe 71 printf(", 0x");
ser1516 21:988413f53fbe 72 serial_print_hex(tx_cfg[current_ic][4]);
ser1516 21:988413f53fbe 73 printf(", 0x");
ser1516 21:988413f53fbe 74 serial_print_hex(tx_cfg[current_ic][5]);
ser1516 21:988413f53fbe 75 printf(", Calculated PEC: 0x");
ser1516 21:988413f53fbe 76 cfg_pec = pec15_calc(6,&tx_cfg[current_ic][0]);
ser1516 21:988413f53fbe 77 serial_print_hex((uint8_t)(cfg_pec>>8));
ser1516 21:988413f53fbe 78 printf(", 0x");
ser1516 21:988413f53fbe 79 serial_print_hex((uint8_t)(cfg_pec));
ser1516 21:988413f53fbe 80 }
ser1516 21:988413f53fbe 81 printf("\n\r");
ser1516 21:988413f53fbe 82 }
ser1516 21:988413f53fbe 83
ser1516 21:988413f53fbe 84 void print_rxconfig()
ser1516 21:988413f53fbe 85 {
ser1516 21:988413f53fbe 86 printf("Received Configuration ");
ser1516 21:988413f53fbe 87 for (int current_ic=0; current_ic<TOTAL_IC; current_ic++) {
ser1516 21:988413f53fbe 88 printf(" IC ");
ser1516 21:988413f53fbe 89 printf("%d " ,current_ic+1);
ser1516 21:988413f53fbe 90 printf(": 0x");
ser1516 21:988413f53fbe 91 serial_print_hex(rx_cfg[current_ic][0]);
ser1516 21:988413f53fbe 92 printf(", 0x");
ser1516 21:988413f53fbe 93 serial_print_hex(rx_cfg[current_ic][1]);
ser1516 21:988413f53fbe 94 printf(", 0x");
ser1516 21:988413f53fbe 95 serial_print_hex(rx_cfg[current_ic][2]);
ser1516 21:988413f53fbe 96 printf(", 0x");
ser1516 21:988413f53fbe 97 serial_print_hex(rx_cfg[current_ic][3]);
ser1516 21:988413f53fbe 98 printf(", 0x");
ser1516 21:988413f53fbe 99 serial_print_hex(rx_cfg[current_ic][4]);
ser1516 21:988413f53fbe 100 printf(", 0x");
ser1516 21:988413f53fbe 101 serial_print_hex(rx_cfg[current_ic][5]);
ser1516 21:988413f53fbe 102 printf(", Received PEC: 0x");
ser1516 21:988413f53fbe 103 serial_print_hex(rx_cfg[current_ic][6]);
ser1516 21:988413f53fbe 104 printf(", 0x");
ser1516 21:988413f53fbe 105 serial_print_hex(rx_cfg[current_ic][7]);
ser1516 21:988413f53fbe 106 }
ser1516 21:988413f53fbe 107 }
Crazyaboutmachines 25:6f4f7510db24 108
ser1516 21:988413f53fbe 109 int err;
ser1516 21:988413f53fbe 110 void print_cells2()
ser1516 21:988413f53fbe 111 {
ser1516 21:988413f53fbe 112
ser1516 21:988413f53fbe 113 for (int current_ic = 0 ; current_ic < TOTAL_IC; current_ic++) {
ser1516 21:988413f53fbe 114
ser1516 21:988413f53fbe 115 for (int i=0; i<12; i++) {
ser1516 21:988413f53fbe 116 printf(" C");
ser1516 21:988413f53fbe 117 printf("%d",i+1);
ser1516 21:988413f53fbe 118 printf(":");
ser1516 21:988413f53fbe 119 printf("%f", cell_codes[current_ic][i]*0.0001);
ser1516 21:988413f53fbe 120 printf(",");
ser1516 21:988413f53fbe 121 }
hudakz 0:c5e5d0df6f2a 122
ser1516 21:988413f53fbe 123 }
ser1516 21:988413f53fbe 124 }
Crazyaboutmachines 25:6f4f7510db24 125
ser1516 21:988413f53fbe 126 void pec_error()
ser1516 21:988413f53fbe 127 {
ser1516 21:988413f53fbe 128 for(int i = 0; i<5; i++) {
ser1516 21:988413f53fbe 129 led = 1;
ser1516 21:988413f53fbe 130 wait(0.2);
ser1516 21:988413f53fbe 131 led=0;
ser1516 21:988413f53fbe 132 wait(0.2);
ser1516 21:988413f53fbe 133 }
ser1516 21:988413f53fbe 134 }
Crazyaboutmachines 25:6f4f7510db24 135
ser1516 21:988413f53fbe 136 char cells_left=0;
ser1516 21:988413f53fbe 137 Ticker ticker;
ser1516 21:988413f53fbe 138 Ticker sender;
ser1516 21:988413f53fbe 139
ser1516 21:988413f53fbe 140 typedef union can_union {
ser1516 21:988413f53fbe 141 int i[2];
ser1516 21:988413f53fbe 142 char bytes[8];
ser1516 21:988413f53fbe 143 float f[2];
ser1516 21:988413f53fbe 144 } data;
ser1516 21:988413f53fbe 145
ser1516 21:988413f53fbe 146 void message_trigger()
ser1516 21:988413f53fbe 147 {
ser1516 21:988413f53fbe 148 if(cells_left < 1) {
ser1516 21:988413f53fbe 149 sender.detach();
ser1516 21:988413f53fbe 150 } else {
ser1516 21:988413f53fbe 151 to_send = 1;
ser1516 21:988413f53fbe 152 }
ser1516 21:988413f53fbe 153 }
ser1516 21:988413f53fbe 154
ser1516 21:988413f53fbe 155 void check_charging_voltage()
ser1516 21:988413f53fbe 156 {
ser1516 21:988413f53fbe 157 wakeup_idle();
ser1516 21:988413f53fbe 158 __disable_irq();
ser1516 21:988413f53fbe 159 LTC6804_adcv();
ser1516 21:988413f53fbe 160 __enable_irq();
ser1516 21:988413f53fbe 161 wait_ms(10);
ser1516 21:988413f53fbe 162 wakeup_idle();
ser1516 21:988413f53fbe 163 __enable_irq();
ser1516 21:988413f53fbe 164 err = LTC6804_rdcv(0, TOTAL_IC,cell_codes);
ser1516 21:988413f53fbe 165 __disable_irq();
ser1516 21:988413f53fbe 166 if (err == -1) {
ser1516 21:988413f53fbe 167 pec_error();
ser1516 21:988413f53fbe 168 }
ser1516 21:988413f53fbe 169 for (int current_ic = 0 ; current_ic < TOTAL_IC; current_ic++) {
ser1516 21:988413f53fbe 170 for (int i=0; i<12; i++) {
Crazyaboutmachines 25:6f4f7510db24 171 if(cell_codes[current_ic][i]*0.0001 > 3.6) {
ser1516 21:988413f53fbe 172 switch (i) {
ser1516 21:988413f53fbe 173 case 0:
Crazyaboutmachines 25:6f4f7510db24 174 tx_cfg[0][4] = tx_cfg[0][4] | 0x01 ; // 00000001
ser1516 21:988413f53fbe 175 case 1:
Crazyaboutmachines 25:6f4f7510db24 176 tx_cfg[0][4] = tx_cfg[0][4] | 0x02 ; // 00000010
ser1516 21:988413f53fbe 177 case 2:
Crazyaboutmachines 25:6f4f7510db24 178 tx_cfg[0][4] = tx_cfg[0][4] | 0x04 ; // 00000100
ser1516 21:988413f53fbe 179 case 3:
Crazyaboutmachines 25:6f4f7510db24 180 tx_cfg[0][4] = tx_cfg[0][4] | 0x08 ; // 00001000
ser1516 21:988413f53fbe 181 case 4:
Crazyaboutmachines 25:6f4f7510db24 182 tx_cfg[0][4] = tx_cfg[0][4] | 0x10 ; // 00010000
ser1516 21:988413f53fbe 183 case 5:
Crazyaboutmachines 25:6f4f7510db24 184 tx_cfg[0][4] = tx_cfg[0][4] | 0x20 ; // 00100001
ser1516 21:988413f53fbe 185 case 6:
Crazyaboutmachines 25:6f4f7510db24 186 tx_cfg[0][4] = tx_cfg[0][4] | 0x40 ; // 01000001
ser1516 21:988413f53fbe 187 case 7:
Crazyaboutmachines 25:6f4f7510db24 188 tx_cfg[0][4] = tx_cfg[0][4] | 0x80; // 10000001
ser1516 21:988413f53fbe 189 case 8:
Crazyaboutmachines 25:6f4f7510db24 190 tx_cfg[0][5] = tx_cfg[0][5] | 0x01; // 00000001
ser1516 21:988413f53fbe 191 case 9:
Crazyaboutmachines 25:6f4f7510db24 192 tx_cfg[0][5] = tx_cfg[0][5] | 0x10; // 00000010
Crazyaboutmachines 26:c55656391a29 193 }
Crazyaboutmachines 26:c55656391a29 194 } else {
Crazyaboutmachines 26:c55656391a29 195 switch (i) {
Crazyaboutmachines 25:6f4f7510db24 196 case 0:
Crazyaboutmachines 25:6f4f7510db24 197 tx_cfg[0][4] = tx_cfg[0][4] & 0xFE ; // 11111110
Crazyaboutmachines 25:6f4f7510db24 198 case 1:
Crazyaboutmachines 25:6f4f7510db24 199 tx_cfg[0][4] = tx_cfg[0][4] & 0xFD ; // 11111101
Crazyaboutmachines 25:6f4f7510db24 200 case 2:
Crazyaboutmachines 25:6f4f7510db24 201 tx_cfg[0][4] = tx_cfg[0][4] & 0xFB ; // 11111011
Crazyaboutmachines 25:6f4f7510db24 202 case 3:
Crazyaboutmachines 25:6f4f7510db24 203 tx_cfg[0][4] = tx_cfg[0][4] & 0xF7 ; // 11110111
Crazyaboutmachines 25:6f4f7510db24 204 case 4:
Crazyaboutmachines 25:6f4f7510db24 205 tx_cfg[0][4] = tx_cfg[0][4] & 0xEF ; // 11101111
Crazyaboutmachines 25:6f4f7510db24 206 case 5:
Crazyaboutmachines 25:6f4f7510db24 207 tx_cfg[0][4] = tx_cfg[0][4] & 0xDF ; // 11011111
Crazyaboutmachines 25:6f4f7510db24 208 case 6:
Crazyaboutmachines 25:6f4f7510db24 209 tx_cfg[0][4] = tx_cfg[0][4] & 0xBF ; // 10111111
Crazyaboutmachines 25:6f4f7510db24 210 case 7:
Crazyaboutmachines 25:6f4f7510db24 211 tx_cfg[0][4] = tx_cfg[0][4] & 0x7F; // 01111111
Crazyaboutmachines 25:6f4f7510db24 212 case 8:
Crazyaboutmachines 25:6f4f7510db24 213 tx_cfg[0][5] = tx_cfg[0][5] & 0xFE; // 11111110
Crazyaboutmachines 25:6f4f7510db24 214 case 9:
Crazyaboutmachines 26:c55656391a29 215 tx_cfg[0][5] = tx_cfg[0][5] & 0xFD; // 11111101
Crazyaboutmachines 26:c55656391a29 216 }
ser1516 21:988413f53fbe 217 }
ser1516 21:988413f53fbe 218 }
ser1516 21:988413f53fbe 219 }
ser1516 21:988413f53fbe 220 //print_cells2();
ser1516 21:988413f53fbe 221 __disable_irq();
ser1516 21:988413f53fbe 222 LTC6804_wrcfg(TOTAL_IC,tx_cfg);
ser1516 21:988413f53fbe 223 __enable_irq();
ser1516 21:988413f53fbe 224 }
ser1516 21:988413f53fbe 225
ser1516 21:988413f53fbe 226
ser1516 21:988413f53fbe 227
ser1516 21:988413f53fbe 228 void check_discharging_voltage()
ser1516 21:988413f53fbe 229 {
ser1516 21:988413f53fbe 230 wakeup_idle();
Crazyaboutmachines 28:b7d1c8d8a2aa 231 __disable_irq(); //<---------
ser1516 21:988413f53fbe 232 LTC6804_adcv();
Crazyaboutmachines 28:b7d1c8d8a2aa 233 __enable_irq(); //<---------
ser1516 21:988413f53fbe 234 wait_ms(10);
ser1516 21:988413f53fbe 235 wakeup_idle();
Crazyaboutmachines 28:b7d1c8d8a2aa 236 __disable_irq();
Crazyaboutmachines 28:b7d1c8d8a2aa 237 //<---------
ser1516 21:988413f53fbe 238 err = LTC6804_rdcv(0, TOTAL_IC,cell_codes);
Crazyaboutmachines 28:b7d1c8d8a2aa 239 __enable_irq(); //<---------
ser1516 21:988413f53fbe 240 if (err == -1) {
ser1516 21:988413f53fbe 241 pec_error();
ser1516 21:988413f53fbe 242 }/*
ser1516 21:988413f53fbe 243 for (int current_ic = 0 ; current_ic < TOTAL_IC; current_ic++) {
ser1516 21:988413f53fbe 244 for (int i=0; i<11; i++) {
ser1516 21:988413f53fbe 245 //printf("%f\t", cell_codes[current_ic][i]*0.0001);
ser1516 21:988413f53fbe 246 if(cell_codes[current_ic][i]*0.0001 < 2.7) {
ser1516 21:988413f53fbe 247 txMsg.clear();
ser1516 21:988413f53fbe 248 txMsg.id = 1;
ser1516 21:988413f53fbe 249 printf("%f\t", cell_codes[current_ic][i]*0.0001);
ser1516 21:988413f53fbe 250
ser1516 21:988413f53fbe 251 txMsg << cell_codes[current_ic][i]*0.0001;
ser1516 21:988413f53fbe 252 can.write(txMsg);
ser1516 21:988413f53fbe 253 wait(0.1);
ser1516 21:988413f53fbe 254 }
ser1516 21:988413f53fbe 255 }
ser1516 21:988413f53fbe 256 }*/
ser1516 21:988413f53fbe 257 //print_cells2();
ser1516 21:988413f53fbe 258 cells_left = 12;
ser1516 21:988413f53fbe 259
Crazyaboutmachines 26:c55656391a29 260 tx_cfg[0][4] = tx_cfg[0][4] & 0b00000000; //para desactivar balanceamento durante a descarga
Crazyaboutmachines 26:c55656391a29 261 tx_cfg[0][5] = tx_cfg[0][5] & 0b11110000;
Crazyaboutmachines 26:c55656391a29 262
ser1516 21:988413f53fbe 263 //print_cells2();
Crazyaboutmachines 28:b7d1c8d8a2aa 264 __disable_irq(); //<----------------------------
ser1516 21:988413f53fbe 265 LTC6804_wrcfg(TOTAL_IC,tx_cfg);
Crazyaboutmachines 28:b7d1c8d8a2aa 266 __enable_irq(); //<----------------------------
ser1516 21:988413f53fbe 267 }
ser1516 21:988413f53fbe 268
ser1516 21:988413f53fbe 269 void onMsgReceived()
ser1516 21:988413f53fbe 270 {
hudakz 16:a86f339d1c25 271 msgAvailable = true;
hudakz 16:a86f339d1c25 272 }
hudakz 16:a86f339d1c25 273
ser1516 21:988413f53fbe 274
Crazyaboutmachines 28:b7d1c8d8a2aa 275 //bool to_charge_or_not_to_charge=false; // false = discharge
ser1516 21:988413f53fbe 276 bool charging = false;
Crazyaboutmachines 28:b7d1c8d8a2aa 277 //bool discharging = true;
Crazyaboutmachines 25:6f4f7510db24 278
Crazyaboutmachines 28:b7d1c8d8a2aa 279
Crazyaboutmachines 28:b7d1c8d8a2aa 280 /*
ser1516 21:988413f53fbe 281 void monitor()
ser1516 21:988413f53fbe 282 {
ser1516 21:988413f53fbe 283 led = !led;
ser1516 21:988413f53fbe 284 if(to_charge_or_not_to_charge) {
ser1516 21:988413f53fbe 285 charging = 1;
ser1516 21:988413f53fbe 286 discharging = 0;
ser1516 21:988413f53fbe 287 } else {
ser1516 21:988413f53fbe 288 discharging = 1;
ser1516 21:988413f53fbe 289 charging = 0;
hudakz 0:c5e5d0df6f2a 290 }
hudakz 0:c5e5d0df6f2a 291 }
Crazyaboutmachines 28:b7d1c8d8a2aa 292 */
hudakz 7:2dce8ed51091 293
hudakz 12:e91e44924194 294
Crazyaboutmachines 26:c55656391a29 295 uint8_t motostate=0;
Crazyaboutmachines 26:c55656391a29 296
ser1516 21:988413f53fbe 297 int main()
ser1516 21:988413f53fbe 298 {
Crazyaboutmachines 26:c55656391a29 299 data data;
hudakz 17:18d4d0ff26a6 300
ser1516 21:988413f53fbe 301 //printf("starting\n\r");
ser1516 21:988413f53fbe 302 led =1;
ser1516 21:988413f53fbe 303 wait(1);
ser1516 21:988413f53fbe 304 pec_error();
Crazyaboutmachines 28:b7d1c8d8a2aa 305 // charging = 0;
Crazyaboutmachines 28:b7d1c8d8a2aa 306 // ticker.attach(&monitor, 5); //apenas serve para actualizar as variaveis charging/discharging
ser1516 21:988413f53fbe 307 LTC6804_initialize();
ser1516 21:988413f53fbe 308 init_cfg();
Crazyaboutmachines 28:b7d1c8d8a2aa 309 //write configuration
ser1516 21:988413f53fbe 310 wakeup_sleep();
ser1516 21:988413f53fbe 311 __disable_irq(); // Disable Interrupts
ser1516 21:988413f53fbe 312 LTC6804_wrcfg(TOTAL_IC,tx_cfg);
ser1516 21:988413f53fbe 313 __enable_irq();
ser1516 21:988413f53fbe 314 wait(1);
ser1516 21:988413f53fbe 315 //read configuration: may differ from written config
ser1516 21:988413f53fbe 316 wakeup_sleep();
ser1516 21:988413f53fbe 317 __disable_irq();
ser1516 21:988413f53fbe 318 err = LTC6804_rdcfg(TOTAL_IC,rx_cfg);
ser1516 21:988413f53fbe 319 __enable_irq();
ser1516 21:988413f53fbe 320 if (err == -1) {
ser1516 21:988413f53fbe 321 pec_error();
ser1516 21:988413f53fbe 322 }
ser1516 21:988413f53fbe 323 wait(0.5);
ser1516 21:988413f53fbe 324
ser1516 21:988413f53fbe 325 wakeup_idle();
ser1516 21:988413f53fbe 326 __disable_irq();
ser1516 21:988413f53fbe 327 LTC6804_adcv();
ser1516 21:988413f53fbe 328 __enable_irq();
ser1516 21:988413f53fbe 329 wait_ms(10);
ser1516 21:988413f53fbe 330 wakeup_idle();
ser1516 21:988413f53fbe 331 __disable_irq();
ser1516 21:988413f53fbe 332 err = LTC6804_rdcv(0, TOTAL_IC,cell_codes);
ser1516 21:988413f53fbe 333 __enable_irq();
ser1516 21:988413f53fbe 334 if (err == -1) {
ser1516 21:988413f53fbe 335 pec_error();
ser1516 21:988413f53fbe 336 }
ser1516 21:988413f53fbe 337 can.frequency(1000000); // set bit rate to 1Mbps
ser1516 21:988413f53fbe 338 can.attach(&onMsgReceived);
ser1516 21:988413f53fbe 339 //print_cells2();
Crazyaboutmachines 28:b7d1c8d8a2aa 340 sender.attach(&message_trigger,0.1);
ser1516 21:988413f53fbe 341 while(1) {
Crazyaboutmachines 28:b7d1c8d8a2aa 342 if(charging)
Crazyaboutmachines 28:b7d1c8d8a2aa 343 {
Crazyaboutmachines 28:b7d1c8d8a2aa 344 //charging = 0;
ser1516 21:988413f53fbe 345 check_charging_voltage();
ser1516 21:988413f53fbe 346 }
Crazyaboutmachines 28:b7d1c8d8a2aa 347 else
Crazyaboutmachines 28:b7d1c8d8a2aa 348 {
Crazyaboutmachines 28:b7d1c8d8a2aa 349 //charging = 1;
ser1516 21:988413f53fbe 350 check_discharging_voltage();
Crazyaboutmachines 28:b7d1c8d8a2aa 351 //sender.attach(&message_trigger,0.1);
ser1516 21:988413f53fbe 352 }
Crazyaboutmachines 28:b7d1c8d8a2aa 353 if(to_send)
Crazyaboutmachines 28:b7d1c8d8a2aa 354 {
ser1516 21:988413f53fbe 355 to_send=0;
ser1516 21:988413f53fbe 356 txMsg.clear();
Crazyaboutmachines 25:6f4f7510db24 357 txMsg.id = 11; //BMS1=>ID:11; BMS2=>ID:12; BMS3=>ID:13.
ser1516 21:988413f53fbe 358 txMsg.len = 5;
ser1516 21:988413f53fbe 359 data.f[0] = cell_codes[0][cells_left-1]*0.0001;
ser1516 21:988413f53fbe 360 txMsg.data[0] = data.bytes[0];
ser1516 21:988413f53fbe 361 txMsg.data[1] = data.bytes[1];
ser1516 21:988413f53fbe 362 txMsg.data[2] = data.bytes[2];
ser1516 21:988413f53fbe 363 txMsg.data[3] = data.bytes[3];
ser1516 21:988413f53fbe 364 txMsg.data[4] = cells_left;
ser1516 21:988413f53fbe 365 cells_left--;
Crazyaboutmachines 28:b7d1c8d8a2aa 366 if(!(can.write(txMsg)))
Crazyaboutmachines 28:b7d1c8d8a2aa 367 { //se nao conseguiu transmitir continua a tentar transmitir a tensão dessa celula
ser1516 21:988413f53fbe 368 pec_error();
ser1516 21:988413f53fbe 369 cells_left++;
ser1516 21:988413f53fbe 370 //to_send=1;
ser1516 21:988413f53fbe 371 }
ser1516 21:988413f53fbe 372 }
Crazyaboutmachines 28:b7d1c8d8a2aa 373 if(msgAvailable)
Crazyaboutmachines 28:b7d1c8d8a2aa 374 {
Crazyaboutmachines 26:c55656391a29 375 int len = can.read(rxMsg);
Crazyaboutmachines 28:b7d1c8d8a2aa 376 if(rxMsg.id==9)
Crazyaboutmachines 28:b7d1c8d8a2aa 377 {
Crazyaboutmachines 28:b7d1c8d8a2aa 378 motostate = rxMsg.data[0];
Crazyaboutmachines 26:c55656391a29 379 //motostate: (0|0|0|0|0|0|to_charge_or_not_to_charge|key_switch)
Crazyaboutmachines 28:b7d1c8d8a2aa 380 charging=((motostate & 0b00000010)>>1);
Crazyaboutmachines 26:c55656391a29 381 msgAvailable = false;
Crazyaboutmachines 26:c55656391a29 382 }
Crazyaboutmachines 26:c55656391a29 383 }
ser1516 21:988413f53fbe 384 }
ser1516 21:988413f53fbe 385 }