Dragica Stoiljkovic / Mbed 2 deprecated BMS_LV_TEMP_VOLT_BALANCE

Dependencies:   mbed

Committer:
dragica
Date:
Thu Oct 28 19:09:52 2021 +0000
Revision:
6:6a98a279d987
Parent:
5:979ff570efce
Child:
7:1118eeb3fe41
Balancing

Who changed what in which revision?

UserRevisionLine numberNew contents of line
minamax 1:d0662d4ffb8c 1 #include "mbed.h"
minamax 1:d0662d4ffb8c 2 #include "bq79606.h"
minamax 1:d0662d4ffb8c 3
minamax 1:d0662d4ffb8c 4 // - - - PIN CONFIGURATION - - -
minamax 1:d0662d4ffb8c 5
dragica 6:6a98a279d987 6 //DigitalIn bmsFault(PB_4);
dragica 6:6a98a279d987 7 DigitalOut bmsWakeUp(PB_4);
dragica 6:6a98a279d987 8 DigitalOut LV_ON(PC_6);
minamax 1:d0662d4ffb8c 9
minamax 1:d0662d4ffb8c 10 // - - - UART CONFIGURATION - - -
dragica 6:6a98a279d987 11 Serial bms(PC_12, PD_2, 250000); //UART ka BMS Slaveu
dragica 6:6a98a279d987 12 Serial pc1(PC_10, PC_11, 9600);//PC_10, PC_11,9600); //UART ka PCu Serijskom monitoru
minamax 1:d0662d4ffb8c 13
minamax 2:03a6da61d834 14 CAN can1(PB_8, PB_9, 500000);
minamax 2:03a6da61d834 15 CANMessage message1;
minamax 2:03a6da61d834 16
minamax 2:03a6da61d834 17
minamax 1:d0662d4ffb8c 18 BYTE recBuff[1024];
minamax 2:03a6da61d834 19 volatile int recLen=0;
minamax 2:03a6da61d834 20 volatile int expected=0;
minamax 1:d0662d4ffb8c 21 volatile bool full = false;
minamax 2:03a6da61d834 22 volatile int rdLen=0;
minamax 1:d0662d4ffb8c 23 int counter = 0;
dragica 5:979ff570efce 24 volatile int devStat = 0;
dragica 5:979ff570efce 25 volatile int cbRun = 1;
dragica 5:979ff570efce 26 volatile int cbDone = 0;
minamax 1:d0662d4ffb8c 27
minamax 1:d0662d4ffb8c 28 uint8_t pFrame1[(MAXBYTES+6)*TOTALBOARDS];
minamax 1:d0662d4ffb8c 29
minamax 1:d0662d4ffb8c 30 void callback() {
minamax 1:d0662d4ffb8c 31 // Note: you need to actually read from the serial to clear the RX interrupt
minamax 2:03a6da61d834 32 //pc1.printf("* * * Uspesan PRIJEM! * * *\n");
minamax 2:03a6da61d834 33
minamax 2:03a6da61d834 34 //pc1.printf("rec = %d", c);
minamax 1:d0662d4ffb8c 35 recBuff[recLen++] = bms.getc();
minamax 2:03a6da61d834 36 if(expected==0) expected = recBuff[0]+7; //prvi bajt je (broj data - 1), +1 device id, +2 reg address, +2 CRC
minamax 2:03a6da61d834 37 //pc1.printf("Prva rec = %d", recBuff[0]);
minamax 1:d0662d4ffb8c 38 if(expected == recLen){
minamax 2:03a6da61d834 39 //pc1.printf("\n\n- - - USAO U EXPECTED - - -\n");
minamax 1:d0662d4ffb8c 40 full = true;
minamax 1:d0662d4ffb8c 41 rdLen = expected;
minamax 1:d0662d4ffb8c 42 expected = 0;
minamax 1:d0662d4ffb8c 43 recLen = 0;
minamax 1:d0662d4ffb8c 44 }
minamax 2:03a6da61d834 45
minamax 2:03a6da61d834 46
minamax 2:03a6da61d834 47 //full = true;
minamax 2:03a6da61d834 48 //recLen = 0;
minamax 2:03a6da61d834 49 //rdLen = 17; //samo test - nebitno koji broj
minamax 1:d0662d4ffb8c 50 }
minamax 1:d0662d4ffb8c 51
minamax 1:d0662d4ffb8c 52 void waitFrame(){
minamax 1:d0662d4ffb8c 53 while(!full);
minamax 2:03a6da61d834 54 //wait(2);
minamax 1:d0662d4ffb8c 55 full=false;
minamax 2:03a6da61d834 56 pc1.printf("\n%d\n", rdLen);
minamax 1:d0662d4ffb8c 57 for(int i = 0;i<rdLen;i++){
minamax 1:d0662d4ffb8c 58 pc1.printf("%X ",recBuff[i]);
minamax 1:d0662d4ffb8c 59 }
minamax 1:d0662d4ffb8c 60
minamax 1:d0662d4ffb8c 61 pc1.printf("\n\n- - - VOLTAGE - - -\n");
minamax 2:03a6da61d834 62 message1.id = 0x71;
minamax 2:03a6da61d834 63 int j = 0;
minamax 1:d0662d4ffb8c 64 for(int i = 4; i < recBuff[0] + 4; i += 2){
minamax 1:d0662d4ffb8c 65 int voltage = recBuff[i+1]; //LSB
minamax 1:d0662d4ffb8c 66 voltage |= (recBuff[i]) << 8; //MSB
minamax 2:03a6da61d834 67 double vol = voltage*0.0001907349;
minamax 2:03a6da61d834 68 //double vol = ((double)voltage)/65536.0 * 5.0;
minamax 2:03a6da61d834 69 pc1.printf("CELL[%d] = %6.2f V\n", i/2-1, vol);
minamax 2:03a6da61d834 70
minamax 2:03a6da61d834 71 message1.data[j++] = recBuff[i];
minamax 2:03a6da61d834 72
minamax 1:d0662d4ffb8c 73 }
minamax 2:03a6da61d834 74 can1.write(message1);
minamax 1:d0662d4ffb8c 75
minamax 1:d0662d4ffb8c 76 pc1.printf("\n");
minamax 1:d0662d4ffb8c 77 }
minamax 3:4dc457ed63d5 78
minamax 3:4dc457ed63d5 79
minamax 3:4dc457ed63d5 80 void waitFrameTemp(){
minamax 3:4dc457ed63d5 81 while(!full);
minamax 3:4dc457ed63d5 82 //wait(2);
minamax 3:4dc457ed63d5 83 full=false;
dragica 4:28919318b141 84 pc1.printf("****** TEMPERATURA *****");
minamax 3:4dc457ed63d5 85 pc1.printf("\n%d\n", rdLen);
minamax 3:4dc457ed63d5 86 for(int i = 0;i<rdLen;i++){
minamax 3:4dc457ed63d5 87 pc1.printf("%X ",recBuff[i]);
minamax 3:4dc457ed63d5 88 }
minamax 3:4dc457ed63d5 89 int voltage = recBuff[5]; //LSB
minamax 3:4dc457ed63d5 90 voltage |= (recBuff[4]) << 8; //MSB
minamax 3:4dc457ed63d5 91 double vol = voltage*0.0001907349;
minamax 3:4dc457ed63d5 92 //double vol = ((double)voltage)/65536.0 * 5.0;
dragica 4:28919318b141 93 pc1.printf("temp1 = %f V\n", vol);
minamax 3:4dc457ed63d5 94
minamax 3:4dc457ed63d5 95 }
minamax 1:d0662d4ffb8c 96 void waitFrameResponse(){
minamax 1:d0662d4ffb8c 97 while(!full);
minamax 1:d0662d4ffb8c 98 full = false;
minamax 1:d0662d4ffb8c 99 for(int i = 0;i < rdLen; i++){
minamax 1:d0662d4ffb8c 100 pc1.printf("%X ", recBuff[i]);
minamax 1:d0662d4ffb8c 101 }
minamax 1:d0662d4ffb8c 102 pc1.printf("\n");
minamax 1:d0662d4ffb8c 103 }
dragica 5:979ff570efce 104 void cellBalanceStart()
dragica 5:979ff570efce 105 {
dragica 5:979ff570efce 106 cbRun = 1;
dragica 5:979ff570efce 107 cbDone = 0;
dragica 5:979ff570efce 108 WriteReg(0, CB_CONFIG, 0xFA, 1, FRMWRT_ALL_NR); // Odds then Evens, continue regardless of fault condition, 30sec, seconds
dragica 5:979ff570efce 109
dragica 5:979ff570efce 110 WriteReg(0, CB_DONE_THRESHOLD, 0x5F, 1, FRMWRT_ALL_NR); // Thresh hold set to value 3.6V, CBDONE comparators enabled
dragica 5:979ff570efce 111 //Enabling the CBDONE voltage threshold overrides the OVUV function and pauses it.
dragica 5:979ff570efce 112
dragica 5:979ff570efce 113 WriteReg(0, CB_CELL1_CTRL, 0xBC, 1, FRMWRT_ALL_NR);//cell 1- 1 minute balance timer
dragica 5:979ff570efce 114 WriteReg(0, CB_CELL2_CTRL, 0xBC, 1, FRMWRT_ALL_NR);//cell 2- 1 minute balance timer
dragica 5:979ff570efce 115 WriteReg(0, CB_CELL3_CTRL, 0xBC, 1, FRMWRT_ALL_NR);//cell 3- 1 minute balance timer
dragica 5:979ff570efce 116
dragica 5:979ff570efce 117 WriteReg(0, CONTROL2, 0x30, 1, FRMWRT_ALL_NR);//BAL_GO set to 1, and TSREF enabled
dragica 5:979ff570efce 118 wait_us(100);
dragica 5:979ff570efce 119 pc1.printf("Setupovano balansiranje\n");
dragica 5:979ff570efce 120 while (cbRun)
dragica 5:979ff570efce 121 {
dragica 5:979ff570efce 122 ReadReg(0, DEV_STAT, pFrame1, 1 , 0, FRMWRT_ALL_R);
dragica 5:979ff570efce 123 wait(1);
dragica 5:979ff570efce 124 devStat = recBuff[4];
dragica 5:979ff570efce 125 cbRun = (devStat & 0x10) >> 4;
dragica 5:979ff570efce 126 wait_us(500);
dragica 5:979ff570efce 127 if (!cbRun)
dragica 5:979ff570efce 128 {
dragica 5:979ff570efce 129 pc1.printf("DEV STAT = %d\n", devStat);
dragica 5:979ff570efce 130 pc1.printf("CBRUN = %d\n", cbRun);
dragica 5:979ff570efce 131 //wait(10);
dragica 5:979ff570efce 132 }
dragica 5:979ff570efce 133 }
dragica 5:979ff570efce 134
dragica 5:979ff570efce 135 while(!cbDone)
dragica 5:979ff570efce 136 {
dragica 5:979ff570efce 137 ReadReg(0, DEV_STAT, pFrame1, 1 , 0, FRMWRT_ALL_R);
dragica 5:979ff570efce 138 wait(1);
dragica 5:979ff570efce 139 devStat = recBuff[4];
dragica 5:979ff570efce 140 cbDone = (devStat & 0x40) >> 6;
dragica 5:979ff570efce 141 wait_us(500);
dragica 5:979ff570efce 142 if (cbDone)
dragica 5:979ff570efce 143 {
dragica 5:979ff570efce 144 pc1.printf("DEV STAT = %d\n", devStat);
dragica 5:979ff570efce 145 pc1.printf("CBDONE = %d\n", cbDone);
dragica 5:979ff570efce 146 //wait(10);
dragica 5:979ff570efce 147 }
dragica 5:979ff570efce 148 }
dragica 5:979ff570efce 149 // Cleanup
dragica 5:979ff570efce 150 WriteReg(0, CONTROL2, 0x00, 1, FRMWRT_ALL_NR);//Reset
dragica 5:979ff570efce 151 WriteReg(0, CB_DONE_THRESHOLD, 0x20, 1, FRMWRT_ALL_NR);
dragica 5:979ff570efce 152 }
minamax 1:d0662d4ffb8c 153 int main(){
dragica 4:28919318b141 154 pc1.printf("Main ulazak\n");
minamax 1:d0662d4ffb8c 155 bms.attach(&callback);
dragica 4:28919318b141 156 pc1.printf("Main after attacha\n");
minamax 1:d0662d4ffb8c 157 Wake79606();
dragica 4:28919318b141 158 pc1.printf("woken up\n");
minamax 2:03a6da61d834 159 //DigitalOut(PA_0, 0);
minamax 2:03a6da61d834 160 //DigitalOut(PA_1, 0);
minamax 2:03a6da61d834 161 //wait(1);
minamax 2:03a6da61d834 162 //DigitalOut(PA_0, 1);
minamax 2:03a6da61d834 163 //DigitalOut(PA_1, 1);
minamax 2:03a6da61d834 164 //bms(PA_0, PA_1, 250000);
minamax 2:03a6da61d834 165 bms.baud(10);
minamax 2:03a6da61d834 166 bms.send_break();
minamax 2:03a6da61d834 167 bms.baud(250000);
minamax 2:03a6da61d834 168 //wait_ms(500);
minamax 2:03a6da61d834 169 //bms.clear_break();
minamax 2:03a6da61d834 170
minamax 2:03a6da61d834 171 wait(2); //marta rekla da mozda treba da se doda wait
minamax 1:d0662d4ffb8c 172 AutoAddress();
minamax 2:03a6da61d834 173
minamax 2:03a6da61d834 174
minamax 2:03a6da61d834 175 //WriteReg(0, COMM_CTRL, 0x343C, 2, FRMWRT_ALL_NR); //mask GPIO faults
minamax 2:03a6da61d834 176
minamax 2:03a6da61d834 177 wait(2);
minamax 1:d0662d4ffb8c 178 init();
minamax 2:03a6da61d834 179 /*WriteReg(0, COMM_TO, 0x00, 1, FRMWRT_ALL_NR); //disable COMM timeout because printf takes a long time between reads
minamax 2:03a6da61d834 180 WriteReg(0, SYSFLT1_FLT_RST, 0xFFFFFF, 3, FRMWRT_ALL_NR); //reset system faults
minamax 2:03a6da61d834 181 WriteReg(0, SYSFLT1_FLT_MSK, 0xFFFFFF, 3, FRMWRT_ALL_NR); //mask system faults (so we can test boards and not worry about triggering these faults accidentally)
minamax 2:03a6da61d834 182
minamax 2:03a6da61d834 183 //SET UP MAIN ADC
minamax 2:03a6da61d834 184 WriteReg(0, CELL_ADC_CTRL, 0x3F, 1, FRMWRT_ALL_NR); //enable conversions for all cells
minamax 2:03a6da61d834 185 WriteReg(0, CELL_ADC_CONF2, 0x08, 1, FRMWRT_ALL_NR); //set continuous ADC conversions, and set minimum conversion interval
minamax 2:03a6da61d834 186 WriteReg(0, CONTROL2, 0x01, 1, FRMWRT_ALL_NR); //CELL_ADC_GO = 1
minamax 2:03a6da61d834 187 wait_ms(5);*/
minamax 1:d0662d4ffb8c 188
dragica 4:28919318b141 189 //bmsWakeUp = 0;
dragica 4:28919318b141 190 pc1.printf("Pre while-a\n");
dragica 6:6a98a279d987 191 LV_ON = 1;
minamax 1:d0662d4ffb8c 192 while (1) {
minamax 1:d0662d4ffb8c 193 pc1.printf("Main Code \n");
minamax 1:d0662d4ffb8c 194
minamax 1:d0662d4ffb8c 195 pc1.printf("Board 0 \n");
minamax 1:d0662d4ffb8c 196
minamax 2:03a6da61d834 197
minamax 2:03a6da61d834 198
minamax 2:03a6da61d834 199
minamax 1:d0662d4ffb8c 200 wait(2);
minamax 3:4dc457ed63d5 201 //while(bms.readable()) bms.getc();
minamax 3:4dc457ed63d5 202 int rdLen = ReadReg(0, VCELL1H , pFrame1, 6 , 0, FRMWRT_ALL_R); //6 bajtova jer cita od adrese VCELL1H po dva bajta za svaki kanal (ima 3 kanala)
minamax 3:4dc457ed63d5 203
minamax 3:4dc457ed63d5 204
minamax 2:03a6da61d834 205
minamax 1:d0662d4ffb8c 206 waitFrame();
minamax 1:d0662d4ffb8c 207
dragica 4:28919318b141 208 WriteReg(0, CONTROL2, 0x02, 1, FRMWRT_ALL_NR);
dragica 4:28919318b141 209 ReadReg(0, AUX_GPIO1H, pFrame1, 2 , 0, FRMWRT_ALL_R);
minamax 3:4dc457ed63d5 210
dragica 4:28919318b141 211 waitFrameTemp();
minamax 2:03a6da61d834 212
dragica 6:6a98a279d987 213 // cellBalanceStart();
minamax 2:03a6da61d834 214
minamax 1:d0662d4ffb8c 215 //slanje zahteva za GRESKAMA
minamax 2:03a6da61d834 216 //ReadReg(0, 0x52, &wTemp, 2, 0); // 0ms timeout
minamax 2:03a6da61d834 217 //waitFrameResponse();
minamax 1:d0662d4ffb8c 218
minamax 1:d0662d4ffb8c 219
minamax 1:d0662d4ffb8c 220 }
minamax 1:d0662d4ffb8c 221
minamax 1:d0662d4ffb8c 222
minamax 1:d0662d4ffb8c 223
minamax 1:d0662d4ffb8c 224 }