all bms comunicating with nucleo board and balancing

Dependencies:   CANnucleo LTC68041 mbed

Fork of BMS_2 by Joao Vieira

Committer:
Crazyaboutmachines
Date:
Wed Nov 09 11:13:56 2016 +0000
Revision:
34:8f92a17c5be9
Parent:
33:54861cd567cd
Child:
35:117a807c481a
debug1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
hudakz 19:872e304d7e17 1 #include "CANnucleo.h"
hudakz 16:a86f339d1c25 2 #include "mbed.h"
ser1516 21:988413f53fbe 3 #include "LTC68041.h"
hudakz 16:a86f339d1c25 4
ser1516 21:988413f53fbe 5 uint8_t const TOTAL_IC = 1;//!<number of ICs in the daisy chain
ser1516 21:988413f53fbe 6 uint8_t rx_cfg[TOTAL_IC][8];
ser1516 21:988413f53fbe 7 uint8_t tx_cfg[TOTAL_IC][6];
ser1516 21:988413f53fbe 8 uint16_t aux_codes[TOTAL_IC][6];
ser1516 21:988413f53fbe 9 uint16_t cell_codes[TOTAL_IC][12];
Crazyaboutmachines 33:54861cd567cd 10
Crazyaboutmachines 33:54861cd567cd 11 //uint16_t temp_codes[32]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32};
Crazyaboutmachines 34:8f92a17c5be9 12 float temp_codes[32];
Crazyaboutmachines 33:54861cd567cd 13
ser1516 21:988413f53fbe 14 volatile bool msgAvailable = false;
ser1516 21:988413f53fbe 15 volatile bool to_send = false;
hudakz 17:18d4d0ff26a6 16 CANnucleo::CAN can(PA_11, PA_12); // CAN Rx pin name, CAN Tx pin name
hudakz 17:18d4d0ff26a6 17 CANnucleo::CANMessage rxMsg;
hudakz 17:18d4d0ff26a6 18 CANnucleo::CANMessage txMsg;
Crazyaboutmachines 33:54861cd567cd 19 CANnucleo::CANMessage txMsg1;
ser1516 21:988413f53fbe 20 DigitalOut led(PA_5);
Crazyaboutmachines 32:a52605800210 21
ser1516 21:988413f53fbe 22 /*!***********************************
ser1516 21:988413f53fbe 23 \brief Initializes the configuration array
ser1516 21:988413f53fbe 24 **************************************/
ser1516 21:988413f53fbe 25 void init_cfg()
ser1516 21:988413f53fbe 26 {
ser1516 21:988413f53fbe 27 for (int i = 0; i<TOTAL_IC; i++) {
ser1516 21:988413f53fbe 28 tx_cfg[i][0] = 0xFE;
ser1516 21:988413f53fbe 29 tx_cfg[i][1] = 0x00 ;
ser1516 21:988413f53fbe 30 tx_cfg[i][2] = 0x00 ;
ser1516 21:988413f53fbe 31 tx_cfg[i][3] = 0x00 ;
ser1516 21:988413f53fbe 32 tx_cfg[i][4] = 0x00 ;
ser1516 21:988413f53fbe 33 tx_cfg[i][5] = 0x00 ;
ser1516 21:988413f53fbe 34 }
ser1516 21:988413f53fbe 35 }
ser1516 21:988413f53fbe 36 void serial_print_hex(uint8_t data)
ser1516 21:988413f53fbe 37 {
ser1516 21:988413f53fbe 38 if (data< 16) {
ser1516 21:988413f53fbe 39 printf("0");
ser1516 21:988413f53fbe 40 printf("%x",(uint8_t)data);
ser1516 21:988413f53fbe 41 } else
ser1516 21:988413f53fbe 42 printf("%x",(uint8_t)data);
ser1516 21:988413f53fbe 43 }
ser1516 21:988413f53fbe 44 void print_config()
ser1516 21:988413f53fbe 45 {
ser1516 21:988413f53fbe 46 int cfg_pec;
ser1516 21:988413f53fbe 47 printf("Written Configuration:\n\r ");
ser1516 21:988413f53fbe 48 for (int current_ic = 0; current_ic<TOTAL_IC; current_ic++) {
ser1516 21:988413f53fbe 49 printf(" IC ");
ser1516 21:988413f53fbe 50 printf("%d", current_ic+1);
ser1516 21:988413f53fbe 51 printf(": ");
ser1516 21:988413f53fbe 52 printf("0x");
ser1516 21:988413f53fbe 53 serial_print_hex(tx_cfg[current_ic][0]);
ser1516 21:988413f53fbe 54 printf(", 0x");
ser1516 21:988413f53fbe 55 serial_print_hex(tx_cfg[current_ic][1]);
ser1516 21:988413f53fbe 56 printf(", 0x");
ser1516 21:988413f53fbe 57 serial_print_hex(tx_cfg[current_ic][2]);
ser1516 21:988413f53fbe 58 printf(", 0x");
ser1516 21:988413f53fbe 59 serial_print_hex(tx_cfg[current_ic][3]);
ser1516 21:988413f53fbe 60 printf(", 0x");
ser1516 21:988413f53fbe 61 serial_print_hex(tx_cfg[current_ic][4]);
ser1516 21:988413f53fbe 62 printf(", 0x");
ser1516 21:988413f53fbe 63 serial_print_hex(tx_cfg[current_ic][5]);
ser1516 21:988413f53fbe 64 printf(", Calculated PEC: 0x");
ser1516 21:988413f53fbe 65 cfg_pec = pec15_calc(6,&tx_cfg[current_ic][0]);
ser1516 21:988413f53fbe 66 serial_print_hex((uint8_t)(cfg_pec>>8));
ser1516 21:988413f53fbe 67 printf(", 0x");
ser1516 21:988413f53fbe 68 serial_print_hex((uint8_t)(cfg_pec));
ser1516 21:988413f53fbe 69 }
ser1516 21:988413f53fbe 70 printf("\n\r");
ser1516 21:988413f53fbe 71 }
ser1516 21:988413f53fbe 72
ser1516 21:988413f53fbe 73 void print_rxconfig()
ser1516 21:988413f53fbe 74 {
ser1516 21:988413f53fbe 75 printf("Received Configuration ");
ser1516 21:988413f53fbe 76 for (int current_ic=0; current_ic<TOTAL_IC; current_ic++) {
ser1516 21:988413f53fbe 77 printf(" IC ");
ser1516 21:988413f53fbe 78 printf("%d " ,current_ic+1);
ser1516 21:988413f53fbe 79 printf(": 0x");
ser1516 21:988413f53fbe 80 serial_print_hex(rx_cfg[current_ic][0]);
ser1516 21:988413f53fbe 81 printf(", 0x");
ser1516 21:988413f53fbe 82 serial_print_hex(rx_cfg[current_ic][1]);
ser1516 21:988413f53fbe 83 printf(", 0x");
ser1516 21:988413f53fbe 84 serial_print_hex(rx_cfg[current_ic][2]);
ser1516 21:988413f53fbe 85 printf(", 0x");
ser1516 21:988413f53fbe 86 serial_print_hex(rx_cfg[current_ic][3]);
ser1516 21:988413f53fbe 87 printf(", 0x");
ser1516 21:988413f53fbe 88 serial_print_hex(rx_cfg[current_ic][4]);
ser1516 21:988413f53fbe 89 printf(", 0x");
ser1516 21:988413f53fbe 90 serial_print_hex(rx_cfg[current_ic][5]);
ser1516 21:988413f53fbe 91 printf(", Received PEC: 0x");
ser1516 21:988413f53fbe 92 serial_print_hex(rx_cfg[current_ic][6]);
ser1516 21:988413f53fbe 93 printf(", 0x");
ser1516 21:988413f53fbe 94 serial_print_hex(rx_cfg[current_ic][7]);
ser1516 21:988413f53fbe 95 }
ser1516 21:988413f53fbe 96 }
Crazyaboutmachines 25:6f4f7510db24 97
ser1516 21:988413f53fbe 98 int err;
ser1516 21:988413f53fbe 99 void print_cells2()
ser1516 21:988413f53fbe 100 {
ser1516 21:988413f53fbe 101
ser1516 21:988413f53fbe 102 for (int current_ic = 0 ; current_ic < TOTAL_IC; current_ic++) {
ser1516 21:988413f53fbe 103
ser1516 21:988413f53fbe 104 for (int i=0; i<12; i++) {
ser1516 21:988413f53fbe 105 printf(" C");
ser1516 21:988413f53fbe 106 printf("%d",i+1);
ser1516 21:988413f53fbe 107 printf(":");
ser1516 21:988413f53fbe 108 printf("%f", cell_codes[current_ic][i]*0.0001);
ser1516 21:988413f53fbe 109 printf(",");
ser1516 21:988413f53fbe 110 }
hudakz 0:c5e5d0df6f2a 111
ser1516 21:988413f53fbe 112 }
ser1516 21:988413f53fbe 113 }
Crazyaboutmachines 25:6f4f7510db24 114
ser1516 21:988413f53fbe 115 void pec_error()
ser1516 21:988413f53fbe 116 {
ser1516 21:988413f53fbe 117 for(int i = 0; i<5; i++) {
ser1516 21:988413f53fbe 118 led = 1;
ser1516 21:988413f53fbe 119 wait(0.2);
ser1516 21:988413f53fbe 120 led=0;
ser1516 21:988413f53fbe 121 wait(0.2);
ser1516 21:988413f53fbe 122 }
ser1516 21:988413f53fbe 123 }
ser1516 21:988413f53fbe 124 char cells_left=0;
Crazyaboutmachines 33:54861cd567cd 125 char temps_left=0;
ser1516 21:988413f53fbe 126 Ticker ticker;
ser1516 21:988413f53fbe 127 Ticker sender;
ser1516 21:988413f53fbe 128
ser1516 21:988413f53fbe 129 typedef union can_union {
ser1516 21:988413f53fbe 130 int i[2];
ser1516 21:988413f53fbe 131 char bytes[8];
ser1516 21:988413f53fbe 132 float f[2];
ser1516 21:988413f53fbe 133 } data;
ser1516 21:988413f53fbe 134
Crazyaboutmachines 33:54861cd567cd 135 typedef union can_union2 {
Crazyaboutmachines 33:54861cd567cd 136 int i[2];
Crazyaboutmachines 33:54861cd567cd 137 char bytes[8];
Crazyaboutmachines 33:54861cd567cd 138 float f[2];
Crazyaboutmachines 33:54861cd567cd 139 } data2;
Crazyaboutmachines 33:54861cd567cd 140
ser1516 21:988413f53fbe 141 void message_trigger()
ser1516 21:988413f53fbe 142 {
ser1516 21:988413f53fbe 143 if(cells_left < 1) {
ser1516 21:988413f53fbe 144 sender.detach();
ser1516 21:988413f53fbe 145 } else {
ser1516 21:988413f53fbe 146 to_send = 1;
ser1516 21:988413f53fbe 147 }
ser1516 21:988413f53fbe 148 }
ser1516 21:988413f53fbe 149
ser1516 21:988413f53fbe 150 void check_charging_voltage()
ser1516 21:988413f53fbe 151 {
ser1516 21:988413f53fbe 152 wakeup_idle();
ser1516 21:988413f53fbe 153 LTC6804_adcv();
ser1516 21:988413f53fbe 154 wait_ms(10);
ser1516 21:988413f53fbe 155 wakeup_idle();
ser1516 21:988413f53fbe 156 err = LTC6804_rdcv(0, TOTAL_IC,cell_codes);
ser1516 21:988413f53fbe 157 if (err == -1) {
ser1516 21:988413f53fbe 158 pec_error();
ser1516 21:988413f53fbe 159 }
Crazyaboutmachines 31:1fab4bb4e9ee 160 cells_left = 12;
ser1516 21:988413f53fbe 161 for (int current_ic = 0 ; current_ic < TOTAL_IC; current_ic++) {
ser1516 21:988413f53fbe 162 for (int i=0; i<12; i++) {
Crazyaboutmachines 25:6f4f7510db24 163 if(cell_codes[current_ic][i]*0.0001 > 3.6) {
ser1516 21:988413f53fbe 164 switch (i) {
Crazyaboutmachines 30:9c9f2d789153 165 case 0: //cell 1
Crazyaboutmachines 25:6f4f7510db24 166 tx_cfg[0][4] = tx_cfg[0][4] | 0x01 ; // 00000001
Crazyaboutmachines 30:9c9f2d789153 167 case 1: //cell 2
Crazyaboutmachines 25:6f4f7510db24 168 tx_cfg[0][4] = tx_cfg[0][4] | 0x02 ; // 00000010
Crazyaboutmachines 30:9c9f2d789153 169 case 2: //cell 3
Crazyaboutmachines 25:6f4f7510db24 170 tx_cfg[0][4] = tx_cfg[0][4] | 0x04 ; // 00000100
Crazyaboutmachines 30:9c9f2d789153 171 case 3: //cell 4
Crazyaboutmachines 25:6f4f7510db24 172 tx_cfg[0][4] = tx_cfg[0][4] | 0x08 ; // 00001000
Crazyaboutmachines 30:9c9f2d789153 173 case 4: //cell 5
Crazyaboutmachines 25:6f4f7510db24 174 tx_cfg[0][4] = tx_cfg[0][4] | 0x10 ; // 00010000
Crazyaboutmachines 30:9c9f2d789153 175 case 6: //cell 7
Crazyaboutmachines 30:9c9f2d789153 176 tx_cfg[0][4] = tx_cfg[0][4] | 0x40 ; // 01000000
Crazyaboutmachines 30:9c9f2d789153 177 case 7: //cell 8
Crazyaboutmachines 30:9c9f2d789153 178 tx_cfg[0][4] = tx_cfg[0][4] | 0x80 ; // 10000000
Crazyaboutmachines 30:9c9f2d789153 179 case 8: //cell 9
Crazyaboutmachines 25:6f4f7510db24 180 tx_cfg[0][5] = tx_cfg[0][5] | 0x01; // 00000001
Crazyaboutmachines 30:9c9f2d789153 181 case 9: //cell 10
Crazyaboutmachines 30:9c9f2d789153 182 tx_cfg[0][5] = tx_cfg[0][5] | 0x02; // 00000010
Crazyaboutmachines 26:c55656391a29 183 }
Crazyaboutmachines 26:c55656391a29 184 } else {
Crazyaboutmachines 26:c55656391a29 185 switch (i) {
Crazyaboutmachines 30:9c9f2d789153 186 case 0: //cell 1
Crazyaboutmachines 25:6f4f7510db24 187 tx_cfg[0][4] = tx_cfg[0][4] & 0xFE ; // 11111110
Crazyaboutmachines 30:9c9f2d789153 188 case 1: //cell 2
Crazyaboutmachines 25:6f4f7510db24 189 tx_cfg[0][4] = tx_cfg[0][4] & 0xFD ; // 11111101
Crazyaboutmachines 30:9c9f2d789153 190 case 2: //cell 3
Crazyaboutmachines 25:6f4f7510db24 191 tx_cfg[0][4] = tx_cfg[0][4] & 0xFB ; // 11111011
Crazyaboutmachines 30:9c9f2d789153 192 case 3: //cell 4
Crazyaboutmachines 25:6f4f7510db24 193 tx_cfg[0][4] = tx_cfg[0][4] & 0xF7 ; // 11110111
Crazyaboutmachines 30:9c9f2d789153 194 case 4: //cell 5
Crazyaboutmachines 25:6f4f7510db24 195 tx_cfg[0][4] = tx_cfg[0][4] & 0xEF ; // 11101111
Crazyaboutmachines 30:9c9f2d789153 196 case 6: //cell 7
Crazyaboutmachines 25:6f4f7510db24 197 tx_cfg[0][4] = tx_cfg[0][4] & 0xBF ; // 10111111
Crazyaboutmachines 30:9c9f2d789153 198 case 7: //cell 8
Crazyaboutmachines 30:9c9f2d789153 199 tx_cfg[0][4] = tx_cfg[0][4] & 0x7F ; // 01111111
Crazyaboutmachines 30:9c9f2d789153 200 case 8: //cell 9
Crazyaboutmachines 25:6f4f7510db24 201 tx_cfg[0][5] = tx_cfg[0][5] & 0xFE; // 11111110
Crazyaboutmachines 30:9c9f2d789153 202 case 9: //cell 10
Crazyaboutmachines 26:c55656391a29 203 tx_cfg[0][5] = tx_cfg[0][5] & 0xFD; // 11111101
Crazyaboutmachines 26:c55656391a29 204 }
ser1516 21:988413f53fbe 205 }
ser1516 21:988413f53fbe 206 }
ser1516 21:988413f53fbe 207 }
ser1516 21:988413f53fbe 208 //print_cells2();
ser1516 21:988413f53fbe 209 LTC6804_wrcfg(TOTAL_IC,tx_cfg);
ser1516 21:988413f53fbe 210 }
ser1516 21:988413f53fbe 211
ser1516 21:988413f53fbe 212 void check_discharging_voltage()
ser1516 21:988413f53fbe 213 {
ser1516 21:988413f53fbe 214 wakeup_idle();
ser1516 21:988413f53fbe 215 LTC6804_adcv();
ser1516 21:988413f53fbe 216 wait_ms(10);
ser1516 21:988413f53fbe 217 wakeup_idle();
ser1516 21:988413f53fbe 218 err = LTC6804_rdcv(0, TOTAL_IC,cell_codes);
ser1516 21:988413f53fbe 219 if (err == -1) {
ser1516 21:988413f53fbe 220 pec_error();
ser1516 21:988413f53fbe 221 }/*
ser1516 21:988413f53fbe 222 for (int current_ic = 0 ; current_ic < TOTAL_IC; current_ic++) {
ser1516 21:988413f53fbe 223 for (int i=0; i<11; i++) {
ser1516 21:988413f53fbe 224 //printf("%f\t", cell_codes[current_ic][i]*0.0001);
ser1516 21:988413f53fbe 225 if(cell_codes[current_ic][i]*0.0001 < 2.7) {
ser1516 21:988413f53fbe 226 txMsg.clear();
ser1516 21:988413f53fbe 227 txMsg.id = 1;
ser1516 21:988413f53fbe 228 printf("%f\t", cell_codes[current_ic][i]*0.0001);
ser1516 21:988413f53fbe 229
ser1516 21:988413f53fbe 230 txMsg << cell_codes[current_ic][i]*0.0001;
ser1516 21:988413f53fbe 231 can.write(txMsg);
ser1516 21:988413f53fbe 232 wait(0.1);
ser1516 21:988413f53fbe 233 }
ser1516 21:988413f53fbe 234 }
ser1516 21:988413f53fbe 235 }*/
ser1516 21:988413f53fbe 236 //print_cells2();
ser1516 21:988413f53fbe 237 cells_left = 12;
Crazyaboutmachines 32:a52605800210 238 tx_cfg[0][4] = tx_cfg[0][4] & 0b00000000; //para desactivar balanceamento durante a descarga
Crazyaboutmachines 32:a52605800210 239 tx_cfg[0][5] = tx_cfg[0][5] & 0b11110000;
Crazyaboutmachines 32:a52605800210 240 //print_cells2();
ser1516 21:988413f53fbe 241 LTC6804_wrcfg(TOTAL_IC,tx_cfg);
ser1516 21:988413f53fbe 242 }
ser1516 21:988413f53fbe 243
Crazyaboutmachines 33:54861cd567cd 244 AnalogIn MUXA_Read(PC_1);
Crazyaboutmachines 33:54861cd567cd 245 DigitalOut MUXA_0(PB_10);
Crazyaboutmachines 33:54861cd567cd 246 DigitalOut MUXA_1(PB_2);
Crazyaboutmachines 33:54861cd567cd 247 DigitalOut MUXA_2(PB_0);
Crazyaboutmachines 33:54861cd567cd 248 DigitalOut MUXA_3(PB_1);
Crazyaboutmachines 33:54861cd567cd 249 AnalogIn MUXB_Read(PC_2);
Crazyaboutmachines 33:54861cd567cd 250 DigitalOut MUXB_0(PC_7);
Crazyaboutmachines 33:54861cd567cd 251 DigitalOut MUXB_1(PC_6);
Crazyaboutmachines 33:54861cd567cd 252 DigitalOut MUXB_2(PB_14);
Crazyaboutmachines 33:54861cd567cd 253 DigitalOut MUXB_3(PB_15);
Crazyaboutmachines 33:54861cd567cd 254
Crazyaboutmachines 34:8f92a17c5be9 255
Crazyaboutmachines 34:8f92a17c5be9 256 void check_temperatures()
Crazyaboutmachines 34:8f92a17c5be9 257 {
Crazyaboutmachines 34:8f92a17c5be9 258 float meas;
Crazyaboutmachines 34:8f92a17c5be9 259 int i=14;
Crazyaboutmachines 34:8f92a17c5be9 260 MUXA_3=1; MUXA_2=1; MUXA_1=1; MUXA_0=0; //(escolha do NTC on board)
Crazyaboutmachines 34:8f92a17c5be9 261 meas = MUXA_Read.read();
Crazyaboutmachines 34:8f92a17c5be9 262 temp_codes[i]=meas;
Crazyaboutmachines 34:8f92a17c5be9 263 temps_left = 14;
Crazyaboutmachines 34:8f92a17c5be9 264 }
Crazyaboutmachines 34:8f92a17c5be9 265
Crazyaboutmachines 34:8f92a17c5be9 266
Crazyaboutmachines 34:8f92a17c5be9 267 /*
Crazyaboutmachines 33:54861cd567cd 268 void check_temperatures()
Crazyaboutmachines 33:54861cd567cd 269 {
Crazyaboutmachines 33:54861cd567cd 270 for (int i=0; i<32; i++){
Crazyaboutmachines 33:54861cd567cd 271 switch (i) {
Crazyaboutmachines 33:54861cd567cd 272 case 0: //ntc 1 //from MUXA
Crazyaboutmachines 33:54861cd567cd 273 MUXA_3=0; MUXA_2=0; MUXA_1=0; MUXA_0=0;
Crazyaboutmachines 33:54861cd567cd 274 case 1: //ntc 2
Crazyaboutmachines 33:54861cd567cd 275 MUXA_3=0; MUXA_2=0; MUXA_1=0; MUXA_0=1;
Crazyaboutmachines 33:54861cd567cd 276 case 2: //ntc 3
Crazyaboutmachines 33:54861cd567cd 277 MUXA_3=0; MUXA_2=0; MUXA_1=1; MUXA_0=0;
Crazyaboutmachines 33:54861cd567cd 278 case 3: //ntc 4
Crazyaboutmachines 33:54861cd567cd 279 MUXA_3=0; MUXA_2=0; MUXA_1=1; MUXA_0=1;
Crazyaboutmachines 33:54861cd567cd 280 case 4: //ntc 5
Crazyaboutmachines 33:54861cd567cd 281 MUXA_3=0; MUXA_2=1; MUXA_1=0; MUXA_0=0;
Crazyaboutmachines 33:54861cd567cd 282 case 5: //ntc 6
Crazyaboutmachines 33:54861cd567cd 283 MUXA_3=0; MUXA_2=1; MUXA_1=0; MUXA_0=1;
Crazyaboutmachines 33:54861cd567cd 284 case 6: //ntc 7
Crazyaboutmachines 33:54861cd567cd 285 MUXA_3=0; MUXA_2=1; MUXA_1=1; MUXA_0=0;
Crazyaboutmachines 33:54861cd567cd 286 case 7: //ntc 8
Crazyaboutmachines 33:54861cd567cd 287 MUXA_3=0; MUXA_2=1; MUXA_1=1; MUXA_0=1;
Crazyaboutmachines 33:54861cd567cd 288 case 8: //ntc 9
Crazyaboutmachines 33:54861cd567cd 289 MUXA_3=1; MUXA_2=0; MUXA_1=0; MUXA_0=0;
Crazyaboutmachines 33:54861cd567cd 290 case 9: //ntc 10
Crazyaboutmachines 33:54861cd567cd 291 MUXA_3=1; MUXA_2=0; MUXA_1=0; MUXA_0=1;
Crazyaboutmachines 33:54861cd567cd 292 case 10: //ntc 11
Crazyaboutmachines 33:54861cd567cd 293 MUXA_3=1; MUXA_2=0; MUXA_1=1; MUXA_0=0;
Crazyaboutmachines 33:54861cd567cd 294 case 11: //ntc 12
Crazyaboutmachines 33:54861cd567cd 295 MUXA_3=1; MUXA_2=0; MUXA_1=1; MUXA_0=1;
Crazyaboutmachines 33:54861cd567cd 296 case 12: //ntc 13
Crazyaboutmachines 33:54861cd567cd 297 MUXA_3=1; MUXA_2=1; MUXA_1=0; MUXA_0=0;
Crazyaboutmachines 33:54861cd567cd 298 case 13: //ntc 14
Crazyaboutmachines 33:54861cd567cd 299 MUXA_3=1; MUXA_2=1; MUXA_1=0; MUXA_0=1;
Crazyaboutmachines 33:54861cd567cd 300 case 14: //ntc 15
Crazyaboutmachines 33:54861cd567cd 301 MUXA_3=1; MUXA_2=1; MUXA_1=1; MUXA_0=0;
Crazyaboutmachines 33:54861cd567cd 302 case 15: //ntc 16
Crazyaboutmachines 33:54861cd567cd 303 MUXA_3=1; MUXA_2=1; MUXA_1=1; MUXA_0=1;
Crazyaboutmachines 33:54861cd567cd 304 case 16: //ntc 17 //from MUXB
Crazyaboutmachines 33:54861cd567cd 305 MUXB_3=0; MUXB_2=0; MUXB_1=0; MUXB_0=0;
Crazyaboutmachines 33:54861cd567cd 306 case 17: //ntc 18
Crazyaboutmachines 33:54861cd567cd 307 MUXB_3=0; MUXB_2=0; MUXB_1=0; MUXB_0=1;
Crazyaboutmachines 33:54861cd567cd 308 case 18: //ntc 19
Crazyaboutmachines 33:54861cd567cd 309 MUXB_3=0; MUXB_2=0; MUXB_1=1; MUXB_0=0;
Crazyaboutmachines 33:54861cd567cd 310 case 19: //ntc 20
Crazyaboutmachines 33:54861cd567cd 311 MUXB_3=0; MUXB_2=0; MUXB_1=1; MUXB_0=1;
Crazyaboutmachines 33:54861cd567cd 312 case 20: //ntc 21
Crazyaboutmachines 33:54861cd567cd 313 MUXB_3=0; MUXB_2=1; MUXB_1=0; MUXB_0=0;
Crazyaboutmachines 33:54861cd567cd 314 case 21: //ntc 22
Crazyaboutmachines 33:54861cd567cd 315 MUXB_3=0; MUXB_2=1; MUXB_1=0; MUXB_0=1;
Crazyaboutmachines 33:54861cd567cd 316 case 22: //ntc 23
Crazyaboutmachines 33:54861cd567cd 317 MUXB_3=0; MUXB_2=1; MUXB_1=1; MUXB_0=0;
Crazyaboutmachines 33:54861cd567cd 318 case 23: //ntc 24
Crazyaboutmachines 33:54861cd567cd 319 MUXB_3=0; MUXB_2=1; MUXB_1=1; MUXB_0=1;
Crazyaboutmachines 33:54861cd567cd 320 case 24: //ntc 25
Crazyaboutmachines 33:54861cd567cd 321 MUXB_3=1; MUXB_2=0; MUXB_1=0; MUXB_0=0;
Crazyaboutmachines 33:54861cd567cd 322 case 25: //ntc 26
Crazyaboutmachines 33:54861cd567cd 323 MUXB_3=1; MUXB_2=0; MUXB_1=0; MUXB_0=1;
Crazyaboutmachines 33:54861cd567cd 324 case 26: //ntc 27
Crazyaboutmachines 33:54861cd567cd 325 MUXB_3=1; MUXB_2=0; MUXB_1=1; MUXB_0=0;
Crazyaboutmachines 33:54861cd567cd 326 case 27: //ntc 28
Crazyaboutmachines 33:54861cd567cd 327 MUXB_3=1; MUXB_2=0; MUXB_1=1; MUXB_0=1;
Crazyaboutmachines 33:54861cd567cd 328 case 28: //ntc 29
Crazyaboutmachines 33:54861cd567cd 329 MUXB_3=1; MUXB_2=1; MUXB_1=0; MUXB_0=0;
Crazyaboutmachines 33:54861cd567cd 330 case 29: //ntc 30
Crazyaboutmachines 33:54861cd567cd 331 MUXB_3=1; MUXB_2=1; MUXB_1=0; MUXB_0=1;
Crazyaboutmachines 33:54861cd567cd 332 case 30: //ntc 31
Crazyaboutmachines 33:54861cd567cd 333 MUXB_3=1; MUXB_2=1; MUXB_1=1; MUXB_0=0;
Crazyaboutmachines 33:54861cd567cd 334 case 31: //ntc 32
Crazyaboutmachines 33:54861cd567cd 335 MUXB_3=1; MUXB_2=1; MUXB_1=1; MUXB_0=1;
Crazyaboutmachines 33:54861cd567cd 336 }
Crazyaboutmachines 33:54861cd567cd 337 wait_ms(10); //tempo para a tensao á saida do mux estabilisar
Crazyaboutmachines 33:54861cd567cd 338 if(i<16){ // Converts and read the analog input value (value from 0.0 to 1.0)
Crazyaboutmachines 33:54861cd567cd 339 temp_codes[i] = MUXA_Read.read()*3300;
Crazyaboutmachines 33:54861cd567cd 340 }else{
Crazyaboutmachines 33:54861cd567cd 341 temp_codes[i] = MUXB_Read.read()*3300;
Crazyaboutmachines 33:54861cd567cd 342 }
Crazyaboutmachines 33:54861cd567cd 343 }
Crazyaboutmachines 33:54861cd567cd 344 temps_left = 32;
Crazyaboutmachines 33:54861cd567cd 345 }
Crazyaboutmachines 34:8f92a17c5be9 346 */
ser1516 21:988413f53fbe 347 void onMsgReceived()
ser1516 21:988413f53fbe 348 {
hudakz 16:a86f339d1c25 349 msgAvailable = true;
hudakz 16:a86f339d1c25 350 }
hudakz 16:a86f339d1c25 351
ser1516 21:988413f53fbe 352
Crazyaboutmachines 29:86e963cc5ce7 353 bool to_charge_or_not_to_charge=false; // false = discharge
ser1516 21:988413f53fbe 354 bool charging = false;
Crazyaboutmachines 29:86e963cc5ce7 355 bool discharging = false;
Crazyaboutmachines 25:6f4f7510db24 356
ser1516 21:988413f53fbe 357 void monitor()
ser1516 21:988413f53fbe 358 {
ser1516 21:988413f53fbe 359 led = !led;
ser1516 21:988413f53fbe 360 if(to_charge_or_not_to_charge) {
ser1516 21:988413f53fbe 361 charging = 1;
ser1516 21:988413f53fbe 362 discharging = 0;
ser1516 21:988413f53fbe 363 } else {
ser1516 21:988413f53fbe 364 discharging = 1;
ser1516 21:988413f53fbe 365 charging = 0;
hudakz 0:c5e5d0df6f2a 366 }
hudakz 0:c5e5d0df6f2a 367 }
hudakz 7:2dce8ed51091 368
hudakz 12:e91e44924194 369
Crazyaboutmachines 26:c55656391a29 370 uint8_t motostate=0;
Crazyaboutmachines 26:c55656391a29 371
ser1516 21:988413f53fbe 372 int main()
ser1516 21:988413f53fbe 373 {
Crazyaboutmachines 26:c55656391a29 374 data data;
Crazyaboutmachines 33:54861cd567cd 375 data2 data2;
ser1516 21:988413f53fbe 376 //printf("starting\n\r");
ser1516 21:988413f53fbe 377 led =1;
ser1516 21:988413f53fbe 378 wait(1);
ser1516 21:988413f53fbe 379 pec_error();
Crazyaboutmachines 31:1fab4bb4e9ee 380 to_charge_or_not_to_charge=0;
Crazyaboutmachines 31:1fab4bb4e9ee 381 charging = 0;
Crazyaboutmachines 29:86e963cc5ce7 382 discharging = 1;
Crazyaboutmachines 32:a52605800210 383 ticker.attach(&monitor, 2);
ser1516 21:988413f53fbe 384 LTC6804_initialize();
ser1516 21:988413f53fbe 385 init_cfg();
Crazyaboutmachines 29:86e963cc5ce7 386 //write configuration
ser1516 21:988413f53fbe 387 wakeup_sleep();
ser1516 21:988413f53fbe 388 __disable_irq(); // Disable Interrupts
ser1516 21:988413f53fbe 389 LTC6804_wrcfg(TOTAL_IC,tx_cfg);
ser1516 21:988413f53fbe 390 __enable_irq();
ser1516 21:988413f53fbe 391 wait(1);
ser1516 21:988413f53fbe 392 //read configuration: may differ from written config
ser1516 21:988413f53fbe 393 wakeup_sleep();
ser1516 21:988413f53fbe 394 __disable_irq();
ser1516 21:988413f53fbe 395 err = LTC6804_rdcfg(TOTAL_IC,rx_cfg);
ser1516 21:988413f53fbe 396 __enable_irq();
ser1516 21:988413f53fbe 397 if (err == -1) {
ser1516 21:988413f53fbe 398 pec_error();
ser1516 21:988413f53fbe 399 }
ser1516 21:988413f53fbe 400 wait(0.5);
ser1516 21:988413f53fbe 401 wakeup_idle();
ser1516 21:988413f53fbe 402 __disable_irq();
ser1516 21:988413f53fbe 403 LTC6804_adcv();
ser1516 21:988413f53fbe 404 __enable_irq();
ser1516 21:988413f53fbe 405 wait_ms(10);
ser1516 21:988413f53fbe 406 wakeup_idle();
ser1516 21:988413f53fbe 407 __disable_irq();
ser1516 21:988413f53fbe 408 err = LTC6804_rdcv(0, TOTAL_IC,cell_codes);
ser1516 21:988413f53fbe 409 __enable_irq();
ser1516 21:988413f53fbe 410 if (err == -1) {
ser1516 21:988413f53fbe 411 pec_error();
ser1516 21:988413f53fbe 412 }
ser1516 21:988413f53fbe 413 can.frequency(1000000); // set bit rate to 1Mbps
ser1516 21:988413f53fbe 414 can.attach(&onMsgReceived);
ser1516 21:988413f53fbe 415 //print_cells2();
ser1516 21:988413f53fbe 416 while(1) {
Crazyaboutmachines 29:86e963cc5ce7 417 if(charging) {
Crazyaboutmachines 29:86e963cc5ce7 418 charging = 0;
ser1516 21:988413f53fbe 419 check_charging_voltage();
Crazyaboutmachines 33:54861cd567cd 420 check_temperatures();
Crazyaboutmachines 31:1fab4bb4e9ee 421 sender.attach(&message_trigger,0.1);
ser1516 21:988413f53fbe 422 }
Crazyaboutmachines 29:86e963cc5ce7 423 if(discharging) {
Crazyaboutmachines 29:86e963cc5ce7 424 discharging = 0;
ser1516 21:988413f53fbe 425 check_discharging_voltage();
Crazyaboutmachines 33:54861cd567cd 426 check_temperatures();
Crazyaboutmachines 29:86e963cc5ce7 427 sender.attach(&message_trigger,0.1);
ser1516 21:988413f53fbe 428 }
Crazyaboutmachines 29:86e963cc5ce7 429 if(to_send) {
ser1516 21:988413f53fbe 430 to_send=0;
Crazyaboutmachines 33:54861cd567cd 431 //-----------------1º send cell voltages
ser1516 21:988413f53fbe 432 txMsg.clear();
Crazyaboutmachines 33:54861cd567cd 433 txMsg.id = 11; //BMS1=>ID:11; BMS2=>ID:12; BMS3=>ID:13.
ser1516 21:988413f53fbe 434 txMsg.len = 5;
ser1516 21:988413f53fbe 435 data.f[0] = cell_codes[0][cells_left-1]*0.0001;
ser1516 21:988413f53fbe 436 txMsg.data[0] = data.bytes[0];
ser1516 21:988413f53fbe 437 txMsg.data[1] = data.bytes[1];
ser1516 21:988413f53fbe 438 txMsg.data[2] = data.bytes[2];
ser1516 21:988413f53fbe 439 txMsg.data[3] = data.bytes[3];
ser1516 21:988413f53fbe 440 txMsg.data[4] = cells_left;
ser1516 21:988413f53fbe 441 cells_left--;
Crazyaboutmachines 29:86e963cc5ce7 442 if(!(can.write(txMsg))) { //se nao conseguiu transmitir continua a tentar transmitir a tensão dessa celula
ser1516 21:988413f53fbe 443 pec_error();
ser1516 21:988413f53fbe 444 cells_left++;
ser1516 21:988413f53fbe 445 //to_send=1;
ser1516 21:988413f53fbe 446 }
Crazyaboutmachines 33:54861cd567cd 447 //-----------------2º send cell temperatures
Crazyaboutmachines 33:54861cd567cd 448 txMsg1.clear();
Crazyaboutmachines 33:54861cd567cd 449 txMsg1.id = 21; //BMS1=>ID:11; BMS2=>ID:12; BMS3=>ID:13.
Crazyaboutmachines 34:8f92a17c5be9 450 txMsg1.len = 5;
Crazyaboutmachines 33:54861cd567cd 451
Crazyaboutmachines 34:8f92a17c5be9 452 data2.f[0] = temp_codes[temps_left-1];
Crazyaboutmachines 34:8f92a17c5be9 453
Crazyaboutmachines 33:54861cd567cd 454 txMsg1.data[0] = data2.bytes[0];
Crazyaboutmachines 33:54861cd567cd 455 txMsg1.data[1] = data2.bytes[1];
Crazyaboutmachines 34:8f92a17c5be9 456 txMsg1.data[2] = data2.bytes[2];
Crazyaboutmachines 34:8f92a17c5be9 457 txMsg1.data[3] = data2.bytes[3];
Crazyaboutmachines 34:8f92a17c5be9 458
Crazyaboutmachines 34:8f92a17c5be9 459 txMsg1.data[4] = temps_left;
Crazyaboutmachines 34:8f92a17c5be9 460 //temps_left--;
Crazyaboutmachines 33:54861cd567cd 461 if(!(can.write(txMsg1))) { //se nao conseguiu transmitir continua a tentar transmitir a tensão dessa celula
Crazyaboutmachines 33:54861cd567cd 462 pec_error();
Crazyaboutmachines 34:8f92a17c5be9 463 //temps_left++;
Crazyaboutmachines 33:54861cd567cd 464 //to_send=1;
Crazyaboutmachines 33:54861cd567cd 465 }
ser1516 21:988413f53fbe 466 }
Crazyaboutmachines 29:86e963cc5ce7 467 if(msgAvailable) {
Crazyaboutmachines 26:c55656391a29 468 int len = can.read(rxMsg);
Crazyaboutmachines 29:86e963cc5ce7 469 if(rxMsg.id==9){
Crazyaboutmachines 29:86e963cc5ce7 470 motostate = rxMsg.data[0];
Crazyaboutmachines 26:c55656391a29 471 //motostate: (0|0|0|0|0|0|to_charge_or_not_to_charge|key_switch)
Crazyaboutmachines 29:86e963cc5ce7 472 to_charge_or_not_to_charge=((motostate & 0b00000010)>>1);
Crazyaboutmachines 26:c55656391a29 473 msgAvailable = false;
Crazyaboutmachines 26:c55656391a29 474 }
Crazyaboutmachines 26:c55656391a29 475 }
ser1516 21:988413f53fbe 476 }
ser1516 21:988413f53fbe 477 }