BMS I/Fプログラム

Dependencies:   mbed

Committer:
NT32
Date:
Fri Apr 29 09:59:16 2016 +0000
Revision:
4:c5b0a318c84d
Parent:
3:8607d7ab7f25
Child:
5:8076127d0690
for ??? ???

Who changed what in which revision?

UserRevisionLine numberNew contents of line
NT32 0:2d6ffd5a4d2e 1 #include "mbed.h"
NT32 0:2d6ffd5a4d2e 2 #include "LTC6803.h"
NT32 3:8607d7ab7f25 3 #define BMS_NUM 2
NT32 0:2d6ffd5a4d2e 4
NT32 1:5690684e5460 5 DigitalOut myled(LED1);
NT32 2:c7ea42f45ff5 6 SPI spi(dp2, dp1, dp6); // mosi, miso, sclk
NT32 2:c7ea42f45ff5 7 DigitalOut cs(dp4);
NT32 0:2d6ffd5a4d2e 8
NT32 2:c7ea42f45ff5 9 Serial pc(dp16, dp15);
NT32 0:2d6ffd5a4d2e 10
NT32 0:2d6ffd5a4d2e 11 unsigned char CalcCRCLTC6803(unsigned char * dat, unsigned char numdat);
NT32 0:2d6ffd5a4d2e 12
NT32 0:2d6ffd5a4d2e 13 static unsigned char crc8_table[256]; // 8-bit table for PEC calc
NT32 0:2d6ffd5a4d2e 14 static int made_table = 0; // table made flag
NT32 0:2d6ffd5a4d2e 15 unsigned char packet[18]={0}; // used for PEC calc
NT32 0:2d6ffd5a4d2e 16 unsigned char PECbyte; // PEC of a byte
NT32 0:2d6ffd5a4d2e 17 unsigned char PECpacket; // PEC of packet
NT32 0:2d6ffd5a4d2e 18 unsigned char PECpacketREAD; // value that PECpacket should be as read from 6803
NT32 0:2d6ffd5a4d2e 19
NT32 0:2d6ffd5a4d2e 20 static void init_crc8();
NT32 0:2d6ffd5a4d2e 21 void setPECbyte(unsigned char m);
NT32 0:2d6ffd5a4d2e 22 void setPECpacket(unsigned char np);
NT32 0:2d6ffd5a4d2e 23
NT32 0:2d6ffd5a4d2e 24 static void init_crc8() {
NT32 0:2d6ffd5a4d2e 25 int z,j;
NT32 0:2d6ffd5a4d2e 26 unsigned char cr;
NT32 0:2d6ffd5a4d2e 27 if (!made_table) {
NT32 0:2d6ffd5a4d2e 28 for (z = 0; z < 256; z ++) {
NT32 0:2d6ffd5a4d2e 29 cr = z;
NT32 0:2d6ffd5a4d2e 30 for (j = 0; j < 8; j ++) {
NT32 0:2d6ffd5a4d2e 31 cr = (cr << 1) ^ ((cr & 0x80) ? 0x07 : 0);
NT32 0:2d6ffd5a4d2e 32 }
NT32 0:2d6ffd5a4d2e 33 crc8_table[z] = cr & 0xFF;
NT32 0:2d6ffd5a4d2e 34 }
NT32 0:2d6ffd5a4d2e 35 made_table = 1;
NT32 0:2d6ffd5a4d2e 36 }
NT32 0:2d6ffd5a4d2e 37 }
NT32 0:2d6ffd5a4d2e 38
NT32 0:2d6ffd5a4d2e 39 void setPECbyte(unsigned char m) {
NT32 0:2d6ffd5a4d2e 40 PECbyte = 0x41; // initialize PECbyte
NT32 0:2d6ffd5a4d2e 41 if (!made_table) {
NT32 0:2d6ffd5a4d2e 42 init_crc8();
NT32 0:2d6ffd5a4d2e 43 }
NT32 0:2d6ffd5a4d2e 44 PECbyte = crc8_table[(PECbyte) ^ m];
NT32 0:2d6ffd5a4d2e 45 }
NT32 0:2d6ffd5a4d2e 46
NT32 0:2d6ffd5a4d2e 47 void setPECpacket(unsigned char np) { // np is number of bytes currently in packet[]
NT32 0:2d6ffd5a4d2e 48 int z;
NT32 0:2d6ffd5a4d2e 49 PECpacket = 0x41; // initialize PECpacket
NT32 0:2d6ffd5a4d2e 50 if (!made_table) {
NT32 0:2d6ffd5a4d2e 51 init_crc8();
NT32 0:2d6ffd5a4d2e 52 }
NT32 0:2d6ffd5a4d2e 53 for (z = 0; z < np; z ++) {
NT32 0:2d6ffd5a4d2e 54 PECpacket = crc8_table[(PECpacket) ^ packet[z]];
NT32 0:2d6ffd5a4d2e 55 }
NT32 0:2d6ffd5a4d2e 56 }
NT32 0:2d6ffd5a4d2e 57 unsigned char CalcCRCLTC6803(unsigned char * dat, unsigned char numdat){
NT32 0:2d6ffd5a4d2e 58 unsigned char pec;
NT32 0:2d6ffd5a4d2e 59 char loop, outerloop;
NT32 0:2d6ffd5a4d2e 60 datainput in;
NT32 0:2d6ffd5a4d2e 61 in.byte = 0;
NT32 0:2d6ffd5a4d2e 62 pec = CRCDEFAULT;
NT32 0:2d6ffd5a4d2e 63 for(outerloop = 0; outerloop < numdat; outerloop++){
NT32 0:2d6ffd5a4d2e 64 for(loop = 8; loop > 0; loop--){
NT32 0:2d6ffd5a4d2e 65 in.in.b0 = (dat[outerloop] >> (loop - 1)) ^ ((pec >> 7));
NT32 0:2d6ffd5a4d2e 66 in.in.b1 = in.in.b0 ^ (pec);
NT32 0:2d6ffd5a4d2e 67 in.in.b2 = in.in.b0 ^ (pec >> 1);
NT32 0:2d6ffd5a4d2e 68 pec = pec << 1;
NT32 0:2d6ffd5a4d2e 69 pec = (pec & 0xF8) | (in.byte & 0x07);
NT32 0:2d6ffd5a4d2e 70 }
NT32 0:2d6ffd5a4d2e 71 }
NT32 0:2d6ffd5a4d2e 72 return pec;
NT32 0:2d6ffd5a4d2e 73 }
NT32 0:2d6ffd5a4d2e 74
NT32 0:2d6ffd5a4d2e 75
NT32 0:2d6ffd5a4d2e 76
NT32 0:2d6ffd5a4d2e 77 int main() {
NT32 3:8607d7ab7f25 78 unsigned char cmd, tmp, datnum, getpec;
NT32 3:8607d7ab7f25 79 unsigned char dat[16], getdat[18][BMS_NUM];
NT32 1:5690684e5460 80 // float cellvol[4];
NT32 3:8607d7ab7f25 81 int cellvol[12][BMS_NUM];
NT32 2:c7ea42f45ff5 82 int cellallvol;
NT32 0:2d6ffd5a4d2e 83 char str[32];
NT32 0:2d6ffd5a4d2e 84 cs = 1;
NT32 0:2d6ffd5a4d2e 85 spi.format(8,3);
NT32 2:c7ea42f45ff5 86 spi.frequency(500000);
NT32 0:2d6ffd5a4d2e 87 pc.baud(460800);
NT32 1:5690684e5460 88
NT32 1:5690684e5460 89 cs = 0;
NT32 0:2d6ffd5a4d2e 90 cmd = WRCFG;
NT32 0:2d6ffd5a4d2e 91 spi.write(cmd);
NT32 0:2d6ffd5a4d2e 92 spi.write(CalcCRCLTC6803(&cmd, 1));
NT32 0:2d6ffd5a4d2e 93 dat[0] = 0x02;
NT32 2:c7ea42f45ff5 94 dat[1] = 0x00;
NT32 1:5690684e5460 95 dat[2] = 0x00;
NT32 0:2d6ffd5a4d2e 96 dat[3] = 0xff;
NT32 1:5690684e5460 97 dat[4] = 42;
NT32 1:5690684e5460 98 dat[5] = 255;
NT32 4:c5b0a318c84d 99
NT32 4:c5b0a318c84d 100 for(int loop = 0;loop < 6; loop++){
NT32 4:c5b0a318c84d 101 spi.write(dat[loop]);
NT32 0:2d6ffd5a4d2e 102 }
NT32 4:c5b0a318c84d 103 cmd = CalcCRCLTC6803(dat, 6);
NT32 4:c5b0a318c84d 104 spi.write(cmd);
NT32 4:c5b0a318c84d 105 for(int loop = 0;loop < 6; loop++){
NT32 4:c5b0a318c84d 106 spi.write(dat[loop]);
NT32 4:c5b0a318c84d 107 }
NT32 4:c5b0a318c84d 108 cmd = CalcCRCLTC6803(dat, 6);
NT32 4:c5b0a318c84d 109 spi.write(cmd);
NT32 4:c5b0a318c84d 110
NT32 1:5690684e5460 111 cs = 1;
NT32 1:5690684e5460 112 wait(0.001);
NT32 0:2d6ffd5a4d2e 113 while(1) {
NT32 0:2d6ffd5a4d2e 114 cs = 0;
NT32 2:c7ea42f45ff5 115 cmd = RDCV;
NT32 0:2d6ffd5a4d2e 116 spi.write(cmd);
NT32 1:5690684e5460 117 spi.write(CalcCRCLTC6803(&cmd, 1));
NT32 4:c5b0a318c84d 118
NT32 4:c5b0a318c84d 119 for(int cell = 0;cell < 18; cell++){
NT32 4:c5b0a318c84d 120 getdat[cell][0] = spi.write(0);
NT32 0:2d6ffd5a4d2e 121 }
NT32 4:c5b0a318c84d 122 getpec = spi.write(0);
NT32 4:c5b0a318c84d 123 for(int cell = 0;cell < 18; cell++){
NT32 4:c5b0a318c84d 124 getdat[cell][1] = spi.write(0);
NT32 4:c5b0a318c84d 125 }
NT32 4:c5b0a318c84d 126 getpec = spi.write(0);
NT32 4:c5b0a318c84d 127
NT32 0:2d6ffd5a4d2e 128 cs = 1;
NT32 1:5690684e5460 129 wait(0.001);
NT32 1:5690684e5460 130 cs = 0;
NT32 1:5690684e5460 131 pc.printf("\033[2J");
NT32 1:5690684e5460 132 pc.printf("\033[%d;%dH" , 0, 0);
NT32 2:c7ea42f45ff5 133 cellallvol = 0;
NT32 3:8607d7ab7f25 134 for(int bms = 0; bms < BMS_NUM; bms++){
NT32 3:8607d7ab7f25 135 cellvol[0][bms] = (((getdat[1][bms] & 0x0f) << 8) | getdat[0][bms]);
NT32 3:8607d7ab7f25 136 cellvol[1][bms] = ((getdat[2][bms] << 4) | ((getdat[1][bms] & 0xf0) >> 4));
NT32 3:8607d7ab7f25 137 cellvol[2][bms] = (((getdat[4][bms] & 0x0f) << 8) | getdat[3][bms]);
NT32 3:8607d7ab7f25 138 cellvol[3][bms] = ((getdat[5][bms] << 4) | ((getdat[4][bms] & 0xf0) >> 4));
NT32 3:8607d7ab7f25 139 cellvol[4][bms] = (((getdat[7][bms] & 0x0f) << 8) | getdat[6][bms]);
NT32 3:8607d7ab7f25 140 cellvol[5][bms] = ((getdat[8][bms] << 4) | ((getdat[7][bms] & 0xf0) >> 4));
NT32 3:8607d7ab7f25 141 cellvol[6][bms] = (((getdat[10][bms] & 0x0f) << 8) | getdat[9][bms]);
NT32 3:8607d7ab7f25 142 cellvol[7][bms] = ((getdat[11][bms] << 4) | ((getdat[10][bms] & 0xf0) >> 4));
NT32 3:8607d7ab7f25 143 cellvol[8][bms] = (((getdat[13][bms] & 0x0f) << 8) | getdat[12][bms]);
NT32 3:8607d7ab7f25 144 cellvol[9][bms] = ((getdat[14][bms] << 4) | ((getdat[13][bms] & 0xf0) >> 4));
NT32 3:8607d7ab7f25 145 cellvol[10][bms] = (((getdat[16][bms] & 0x0f) << 8) | getdat[15][bms]);
NT32 3:8607d7ab7f25 146 cellvol[11][bms] = ((getdat[17][bms] << 4) | ((getdat[16][bms] & 0xf0) >> 4));
NT32 3:8607d7ab7f25 147 for(int loop = 0;loop < (12); loop++){
NT32 3:8607d7ab7f25 148 //表示する数値は(cellvol[loop] - 512)*1.5mV
NT32 4:c5b0a318c84d 149 pc.printf("Cell%2d = %5dmV\n", (loop + (bms*12)) + 1, ((cellvol[loop][bms] - 512)+((cellvol[loop][bms] - 512)/2)));
NT32 3:8607d7ab7f25 150 cellallvol += cellvol[loop][bms];
NT32 3:8607d7ab7f25 151 }
NT32 0:2d6ffd5a4d2e 152 }
NT32 3:8607d7ab7f25 153 pc.printf("CellALL = %5dmV\n", ((cellallvol - 512*(12 * BMS_NUM))+((cellallvol - 512*(12 * BMS_NUM))/2)));
NT32 1:5690684e5460 154
NT32 4:c5b0a318c84d 155 cmd = STCVADSELF1;
NT32 1:5690684e5460 156
NT32 1:5690684e5460 157 spi.write(cmd);
NT32 1:5690684e5460 158 spi.write(CalcCRCLTC6803(&cmd, 1));
NT32 1:5690684e5460 159 cs = 1;
NT32 0:2d6ffd5a4d2e 160 myled = !myled;
NT32 1:5690684e5460 161 wait(0.4);
NT32 0:2d6ffd5a4d2e 162 }
NT32 0:2d6ffd5a4d2e 163 }