![](/media/cache/profiles/original_Gv3RkmR.jpg.50x50_q85.jpg)
Battery Management System LV - 2020/2021
main.cpp@2:03a6da61d834, 2020-12-23 (annotated)
- Committer:
- minamax
- Date:
- Wed Dec 23 21:41:03 2020 +0000
- Revision:
- 2:03a6da61d834
- Parent:
- 1:d0662d4ffb8c
- Child:
- 3:4dc457ed63d5
This version 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 | 1:d0662d4ffb8c | 75 | void waitFrameResponse(){ |
minamax | 1:d0662d4ffb8c | 76 | while(!full); |
minamax | 1:d0662d4ffb8c | 77 | full = false; |
minamax | 1:d0662d4ffb8c | 78 | for(int i = 0;i < rdLen; i++){ |
minamax | 1:d0662d4ffb8c | 79 | pc1.printf("%X ", recBuff[i]); |
minamax | 1:d0662d4ffb8c | 80 | } |
minamax | 1:d0662d4ffb8c | 81 | pc1.printf("\n"); |
minamax | 1:d0662d4ffb8c | 82 | } |
minamax | 1:d0662d4ffb8c | 83 | |
minamax | 2:03a6da61d834 | 84 | |
minamax | 1:d0662d4ffb8c | 85 | int main(){ |
minamax | 1:d0662d4ffb8c | 86 | bms.attach(&callback); |
minamax | 1:d0662d4ffb8c | 87 | Wake79606(); |
minamax | 2:03a6da61d834 | 88 | //DigitalOut(PA_0, 0); |
minamax | 2:03a6da61d834 | 89 | //DigitalOut(PA_1, 0); |
minamax | 2:03a6da61d834 | 90 | //wait(1); |
minamax | 2:03a6da61d834 | 91 | //DigitalOut(PA_0, 1); |
minamax | 2:03a6da61d834 | 92 | //DigitalOut(PA_1, 1); |
minamax | 2:03a6da61d834 | 93 | //bms(PA_0, PA_1, 250000); |
minamax | 2:03a6da61d834 | 94 | bms.baud(10); |
minamax | 2:03a6da61d834 | 95 | bms.send_break(); |
minamax | 2:03a6da61d834 | 96 | bms.baud(250000); |
minamax | 2:03a6da61d834 | 97 | //wait_ms(500); |
minamax | 2:03a6da61d834 | 98 | //bms.clear_break(); |
minamax | 2:03a6da61d834 | 99 | |
minamax | 2:03a6da61d834 | 100 | wait(2); //marta rekla da mozda treba da se doda wait |
minamax | 1:d0662d4ffb8c | 101 | AutoAddress(); |
minamax | 2:03a6da61d834 | 102 | |
minamax | 2:03a6da61d834 | 103 | |
minamax | 2:03a6da61d834 | 104 | //WriteReg(0, COMM_CTRL, 0x343C, 2, FRMWRT_ALL_NR); //mask GPIO faults |
minamax | 2:03a6da61d834 | 105 | |
minamax | 2:03a6da61d834 | 106 | wait(2); |
minamax | 1:d0662d4ffb8c | 107 | init(); |
minamax | 2:03a6da61d834 | 108 | /*WriteReg(0, COMM_TO, 0x00, 1, FRMWRT_ALL_NR); //disable COMM timeout because printf takes a long time between reads |
minamax | 2:03a6da61d834 | 109 | WriteReg(0, SYSFLT1_FLT_RST, 0xFFFFFF, 3, FRMWRT_ALL_NR); //reset system faults |
minamax | 2:03a6da61d834 | 110 | 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 | 111 | |
minamax | 2:03a6da61d834 | 112 | //SET UP MAIN ADC |
minamax | 2:03a6da61d834 | 113 | WriteReg(0, CELL_ADC_CTRL, 0x3F, 1, FRMWRT_ALL_NR); //enable conversions for all cells |
minamax | 2:03a6da61d834 | 114 | WriteReg(0, CELL_ADC_CONF2, 0x08, 1, FRMWRT_ALL_NR); //set continuous ADC conversions, and set minimum conversion interval |
minamax | 2:03a6da61d834 | 115 | WriteReg(0, CONTROL2, 0x01, 1, FRMWRT_ALL_NR); //CELL_ADC_GO = 1 |
minamax | 2:03a6da61d834 | 116 | wait_ms(5);*/ |
minamax | 1:d0662d4ffb8c | 117 | |
minamax | 1:d0662d4ffb8c | 118 | while (1) { |
minamax | 1:d0662d4ffb8c | 119 | pc1.printf("Main Code \n"); |
minamax | 1:d0662d4ffb8c | 120 | |
minamax | 1:d0662d4ffb8c | 121 | pc1.printf("Board 0 \n"); |
minamax | 1:d0662d4ffb8c | 122 | |
minamax | 2:03a6da61d834 | 123 | |
minamax | 2:03a6da61d834 | 124 | |
minamax | 2:03a6da61d834 | 125 | |
minamax | 1:d0662d4ffb8c | 126 | wait(2); |
minamax | 2:03a6da61d834 | 127 | while(bms.readable()) bms.getc(); |
minamax | 2:03a6da61d834 | 128 | int rdLen = ReadReg(0, VCELL1H , pFrame1, 6 , 0, FRMWRT_ALL_R); //12 bajtova jer cita od adrese VCELL1H po dva bajta za svaki kanal (ima 6 kanala) |
minamax | 2:03a6da61d834 | 129 | |
minamax | 1:d0662d4ffb8c | 130 | waitFrame(); |
minamax | 1:d0662d4ffb8c | 131 | |
minamax | 2:03a6da61d834 | 132 | |
minamax | 2:03a6da61d834 | 133 | |
minamax | 1:d0662d4ffb8c | 134 | //slanje zahteva za GRESKAMA |
minamax | 2:03a6da61d834 | 135 | //ReadReg(0, 0x52, &wTemp, 2, 0); // 0ms timeout |
minamax | 2:03a6da61d834 | 136 | //waitFrameResponse(); |
minamax | 1:d0662d4ffb8c | 137 | |
minamax | 1:d0662d4ffb8c | 138 | |
minamax | 1:d0662d4ffb8c | 139 | } |
minamax | 1:d0662d4ffb8c | 140 | |
minamax | 1:d0662d4ffb8c | 141 | |
minamax | 1:d0662d4ffb8c | 142 | |
minamax | 1:d0662d4ffb8c | 143 | } |