Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp@7:1118eeb3fe41, 2021-10-28 (annotated)
- Committer:
- dragica
- Date:
- Thu Oct 28 19:10:50 2021 +0000
- Revision:
- 7:1118eeb3fe41
- Parent:
- 6:6a98a279d987
- Child:
- 8:ad9084b473a9
Cell balancing test, balancing enabled
Who changed what in which revision?
User | Revision | Line number | New 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 | 7:1118eeb3fe41 | 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 | } |