naoto tanaka
/
LTC6803_Eval
BMS I/Fプログラム
main.cpp@4:c5b0a318c84d, 2016-04-29 (annotated)
- 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?
User | Revision | Line number | New 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 | } |