Battery Management System LV - 2020/2021

Dependencies:   mbed

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?

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
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 }