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