Dragica Stoiljkovic / Mbed 2 deprecated BMS_LV_TEMP_VOLT_BALANCE

Dependencies:   mbed

Committer:
dragica
Date:
Sat Nov 06 21:08:56 2021 +0000
Revision:
8:ad9084b473a9
Parent:
7:1118eeb3fe41
Working Ballancing code

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