Mirjana Radosavljevic
/
BMS_LV
Battery Management System LV - 2020/2021
main.cpp@3:4dc457ed63d5, 2021-03-20 (annotated)
- Committer:
- minamax
- Date:
- Sat Mar 20 17:54:12 2021 +0000
- Revision:
- 3:4dc457ed63d5
- Parent:
- 2:03a6da61d834
This works
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 | |
minamax | 1:d0662d4ffb8c | 6 | DigitalIn bmsFault(PB_4); |
minamax | 1:d0662d4ffb8c | 7 | DigitalOut bmsWakeUp(PB_5); |
minamax | 1:d0662d4ffb8c | 8 | |
minamax | 1:d0662d4ffb8c | 9 | // - - - UART CONFIGURATION - - - |
minamax | 1:d0662d4ffb8c | 10 | |
minamax | 2:03a6da61d834 | 11 | Serial bms(PA_0, PA_1, 250000); //UART ka BMS Slaveu |
minamax | 1:d0662d4ffb8c | 12 | Serial pc1(USBTX, USBRX, 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; |
minamax | 1:d0662d4ffb8c | 24 | |
minamax | 1:d0662d4ffb8c | 25 | uint8_t pFrame1[(MAXBYTES+6)*TOTALBOARDS]; |
minamax | 1:d0662d4ffb8c | 26 | |
minamax | 1:d0662d4ffb8c | 27 | void callback() { |
minamax | 1:d0662d4ffb8c | 28 | // Note: you need to actually read from the serial to clear the RX interrupt |
minamax | 2:03a6da61d834 | 29 | //pc1.printf("* * * Uspesan PRIJEM! * * *\n"); |
minamax | 2:03a6da61d834 | 30 | |
minamax | 2:03a6da61d834 | 31 | //pc1.printf("rec = %d", c); |
minamax | 1:d0662d4ffb8c | 32 | recBuff[recLen++] = bms.getc(); |
minamax | 2:03a6da61d834 | 33 | if(expected==0) expected = recBuff[0]+7; //prvi bajt je (broj data - 1), +1 device id, +2 reg address, +2 CRC |
minamax | 2:03a6da61d834 | 34 | //pc1.printf("Prva rec = %d", recBuff[0]); |
minamax | 1:d0662d4ffb8c | 35 | if(expected == recLen){ |
minamax | 2:03a6da61d834 | 36 | //pc1.printf("\n\n- - - USAO U EXPECTED - - -\n"); |
minamax | 1:d0662d4ffb8c | 37 | full = true; |
minamax | 1:d0662d4ffb8c | 38 | rdLen = expected; |
minamax | 1:d0662d4ffb8c | 39 | expected = 0; |
minamax | 1:d0662d4ffb8c | 40 | recLen = 0; |
minamax | 1:d0662d4ffb8c | 41 | } |
minamax | 2:03a6da61d834 | 42 | |
minamax | 2:03a6da61d834 | 43 | |
minamax | 2:03a6da61d834 | 44 | //full = true; |
minamax | 2:03a6da61d834 | 45 | //recLen = 0; |
minamax | 2:03a6da61d834 | 46 | //rdLen = 17; //samo test - nebitno koji broj |
minamax | 1:d0662d4ffb8c | 47 | } |
minamax | 1:d0662d4ffb8c | 48 | |
minamax | 1:d0662d4ffb8c | 49 | void waitFrame(){ |
minamax | 1:d0662d4ffb8c | 50 | while(!full); |
minamax | 2:03a6da61d834 | 51 | //wait(2); |
minamax | 1:d0662d4ffb8c | 52 | full=false; |
minamax | 2:03a6da61d834 | 53 | pc1.printf("\n%d\n", rdLen); |
minamax | 1:d0662d4ffb8c | 54 | for(int i = 0;i<rdLen;i++){ |
minamax | 1:d0662d4ffb8c | 55 | pc1.printf("%X ",recBuff[i]); |
minamax | 1:d0662d4ffb8c | 56 | } |
minamax | 1:d0662d4ffb8c | 57 | |
minamax | 1:d0662d4ffb8c | 58 | pc1.printf("\n\n- - - VOLTAGE - - -\n"); |
minamax | 2:03a6da61d834 | 59 | message1.id = 0x71; |
minamax | 2:03a6da61d834 | 60 | int j = 0; |
minamax | 1:d0662d4ffb8c | 61 | for(int i = 4; i < recBuff[0] + 4; i += 2){ |
minamax | 1:d0662d4ffb8c | 62 | int voltage = recBuff[i+1]; //LSB |
minamax | 1:d0662d4ffb8c | 63 | voltage |= (recBuff[i]) << 8; //MSB |
minamax | 2:03a6da61d834 | 64 | double vol = voltage*0.0001907349; |
minamax | 2:03a6da61d834 | 65 | //double vol = ((double)voltage)/65536.0 * 5.0; |
minamax | 2:03a6da61d834 | 66 | pc1.printf("CELL[%d] = %6.2f V\n", i/2-1, vol); |
minamax | 2:03a6da61d834 | 67 | |
minamax | 2:03a6da61d834 | 68 | message1.data[j++] = recBuff[i]; |
minamax | 2:03a6da61d834 | 69 | |
minamax | 1:d0662d4ffb8c | 70 | } |
minamax | 2:03a6da61d834 | 71 | can1.write(message1); |
minamax | 1:d0662d4ffb8c | 72 | |
minamax | 1:d0662d4ffb8c | 73 | pc1.printf("\n"); |
minamax | 1:d0662d4ffb8c | 74 | } |
minamax | 3:4dc457ed63d5 | 75 | |
minamax | 3:4dc457ed63d5 | 76 | |
minamax | 3:4dc457ed63d5 | 77 | void waitFrameTemp(){ |
minamax | 3:4dc457ed63d5 | 78 | while(!full); |
minamax | 3:4dc457ed63d5 | 79 | //wait(2); |
minamax | 3:4dc457ed63d5 | 80 | full=false; |
minamax | 3:4dc457ed63d5 | 81 | pc1.printf("\n%d\n", rdLen); |
minamax | 3:4dc457ed63d5 | 82 | for(int i = 0;i<rdLen;i++){ |
minamax | 3:4dc457ed63d5 | 83 | pc1.printf("%X ",recBuff[i]); |
minamax | 3:4dc457ed63d5 | 84 | } |
minamax | 3:4dc457ed63d5 | 85 | |
minamax | 3:4dc457ed63d5 | 86 | |
minamax | 3:4dc457ed63d5 | 87 | int voltage = recBuff[5]; //LSB |
minamax | 3:4dc457ed63d5 | 88 | voltage |= (recBuff[4]) << 8; //MSB |
minamax | 3:4dc457ed63d5 | 89 | double vol = voltage*0.0001907349; |
minamax | 3:4dc457ed63d5 | 90 | //double vol = ((double)voltage)/65536.0 * 5.0; |
minamax | 3:4dc457ed63d5 | 91 | pc1.printf("temp1 = %6.2f V\n", vol); |
minamax | 3:4dc457ed63d5 | 92 | |
minamax | 3:4dc457ed63d5 | 93 | } |
minamax | 1:d0662d4ffb8c | 94 | void waitFrameResponse(){ |
minamax | 1:d0662d4ffb8c | 95 | while(!full); |
minamax | 1:d0662d4ffb8c | 96 | full = false; |
minamax | 1:d0662d4ffb8c | 97 | for(int i = 0;i < rdLen; i++){ |
minamax | 1:d0662d4ffb8c | 98 | pc1.printf("%X ", recBuff[i]); |
minamax | 1:d0662d4ffb8c | 99 | } |
minamax | 1:d0662d4ffb8c | 100 | pc1.printf("\n"); |
minamax | 1:d0662d4ffb8c | 101 | } |
minamax | 1:d0662d4ffb8c | 102 | |
minamax | 2:03a6da61d834 | 103 | |
minamax | 1:d0662d4ffb8c | 104 | int main(){ |
minamax | 1:d0662d4ffb8c | 105 | bms.attach(&callback); |
minamax | 1:d0662d4ffb8c | 106 | Wake79606(); |
minamax | 2:03a6da61d834 | 107 | //DigitalOut(PA_0, 0); |
minamax | 2:03a6da61d834 | 108 | //DigitalOut(PA_1, 0); |
minamax | 2:03a6da61d834 | 109 | //wait(1); |
minamax | 2:03a6da61d834 | 110 | //DigitalOut(PA_0, 1); |
minamax | 2:03a6da61d834 | 111 | //DigitalOut(PA_1, 1); |
minamax | 2:03a6da61d834 | 112 | //bms(PA_0, PA_1, 250000); |
minamax | 2:03a6da61d834 | 113 | bms.baud(10); |
minamax | 2:03a6da61d834 | 114 | bms.send_break(); |
minamax | 2:03a6da61d834 | 115 | bms.baud(250000); |
minamax | 2:03a6da61d834 | 116 | //wait_ms(500); |
minamax | 2:03a6da61d834 | 117 | //bms.clear_break(); |
minamax | 2:03a6da61d834 | 118 | |
minamax | 2:03a6da61d834 | 119 | wait(2); //marta rekla da mozda treba da se doda wait |
minamax | 1:d0662d4ffb8c | 120 | AutoAddress(); |
minamax | 2:03a6da61d834 | 121 | |
minamax | 2:03a6da61d834 | 122 | |
minamax | 2:03a6da61d834 | 123 | //WriteReg(0, COMM_CTRL, 0x343C, 2, FRMWRT_ALL_NR); //mask GPIO faults |
minamax | 2:03a6da61d834 | 124 | |
minamax | 2:03a6da61d834 | 125 | wait(2); |
minamax | 1:d0662d4ffb8c | 126 | init(); |
minamax | 2:03a6da61d834 | 127 | /*WriteReg(0, COMM_TO, 0x00, 1, FRMWRT_ALL_NR); //disable COMM timeout because printf takes a long time between reads |
minamax | 2:03a6da61d834 | 128 | WriteReg(0, SYSFLT1_FLT_RST, 0xFFFFFF, 3, FRMWRT_ALL_NR); //reset system faults |
minamax | 2:03a6da61d834 | 129 | 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 | 130 | |
minamax | 2:03a6da61d834 | 131 | //SET UP MAIN ADC |
minamax | 2:03a6da61d834 | 132 | WriteReg(0, CELL_ADC_CTRL, 0x3F, 1, FRMWRT_ALL_NR); //enable conversions for all cells |
minamax | 2:03a6da61d834 | 133 | WriteReg(0, CELL_ADC_CONF2, 0x08, 1, FRMWRT_ALL_NR); //set continuous ADC conversions, and set minimum conversion interval |
minamax | 2:03a6da61d834 | 134 | WriteReg(0, CONTROL2, 0x01, 1, FRMWRT_ALL_NR); //CELL_ADC_GO = 1 |
minamax | 2:03a6da61d834 | 135 | wait_ms(5);*/ |
minamax | 1:d0662d4ffb8c | 136 | |
minamax | 3:4dc457ed63d5 | 137 | bmsWakeUp = 0; |
minamax | 3:4dc457ed63d5 | 138 | |
minamax | 1:d0662d4ffb8c | 139 | while (1) { |
minamax | 1:d0662d4ffb8c | 140 | pc1.printf("Main Code \n"); |
minamax | 1:d0662d4ffb8c | 141 | |
minamax | 1:d0662d4ffb8c | 142 | pc1.printf("Board 0 \n"); |
minamax | 1:d0662d4ffb8c | 143 | |
minamax | 2:03a6da61d834 | 144 | |
minamax | 2:03a6da61d834 | 145 | |
minamax | 2:03a6da61d834 | 146 | |
minamax | 1:d0662d4ffb8c | 147 | wait(2); |
minamax | 3:4dc457ed63d5 | 148 | //while(bms.readable()) bms.getc(); |
minamax | 3:4dc457ed63d5 | 149 | 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 | 150 | |
minamax | 3:4dc457ed63d5 | 151 | |
minamax | 2:03a6da61d834 | 152 | |
minamax | 1:d0662d4ffb8c | 153 | waitFrame(); |
minamax | 1:d0662d4ffb8c | 154 | |
minamax | 3:4dc457ed63d5 | 155 | //ReadReg(0, AUX_GPIO1H, pFrame1, 2 , 0, FRMWRT_ALL_R); |
minamax | 3:4dc457ed63d5 | 156 | |
minamax | 3:4dc457ed63d5 | 157 | //waitFrameTemp(); |
minamax | 2:03a6da61d834 | 158 | |
minamax | 2:03a6da61d834 | 159 | |
minamax | 1:d0662d4ffb8c | 160 | //slanje zahteva za GRESKAMA |
minamax | 2:03a6da61d834 | 161 | //ReadReg(0, 0x52, &wTemp, 2, 0); // 0ms timeout |
minamax | 2:03a6da61d834 | 162 | //waitFrameResponse(); |
minamax | 1:d0662d4ffb8c | 163 | |
minamax | 1:d0662d4ffb8c | 164 | |
minamax | 1:d0662d4ffb8c | 165 | } |
minamax | 1:d0662d4ffb8c | 166 | |
minamax | 1:d0662d4ffb8c | 167 | |
minamax | 1:d0662d4ffb8c | 168 | |
minamax | 1:d0662d4ffb8c | 169 | } |