Guten Tag
ich bin momentan dabei einen Batterietester für bis zu 20s (Einzelzellen
in Serie) zu bauen. Dazu habe ich erstmal einen kleinen Testaufbau
aufgebaut:
Einen PAC1710
(http://ww1.microchip.com/downloads/en/DeviceDoc/20005386B.pdf) mit
kupferlackdraht auf 2,54mm Lochrasterplatine gelötet. Sense + und - sind
miteinander verbunden, da ich keine Shuntmessung mache und der ADDR-SEL
Pin ist mit 0 Ohm auf Masse verbunden (Adresse ist somit 0b1001100).
Ich habe dazu ein kleines Arduino Programm geschrieben:
Library ist diese: https://github.com/felias-fogg/SoftI2CMaster
1 | //Adresses for the PAC
|
2 | byte address[] = {0b1001100, //0 ohm
|
3 | 0b1001101, //100 ohm
|
4 | 0b1001110, //180 ohm
|
5 | 0b1001111, //300 ohm
|
6 | 0b1001000, //430 ohm
|
7 | 0b1001001, //560 ohm
|
8 | 0b1001010, //750 ohm
|
9 | 0b1001011, //1270 ohm
|
10 | 0b0101000, //1600 ohm
|
11 | 0b0101001, //2000 ohm
|
12 | 0b0101010, //2700 ohm
|
13 | 0b0101011, //3600 ohm
|
14 | 0b0101100, //5600 ohm
|
15 | 0b0101101, //9100 ohm
|
16 | 0b0101110, //20000 ohm
|
17 | 0b0011000, //infinite ohm (open)
|
18 | };
|
19 | uint8_t num1 = 0;
|
20 | uint8_t num2 = 0;
|
21 |
|
22 | #define I2C_HARDWARE 1
|
23 | #define I2C_PULLUP 1
|
24 | #include <SoftI2CMaster.h>
|
25 |
|
26 | #define resolution 1024
|
27 | #define FSV 39.96
|
28 |
|
29 | void setup() {
|
30 |
|
31 | i2c_init();
|
32 | Serial.begin(9600);
|
33 | }
|
34 |
|
35 | void loop() {
|
36 | while (!i2c_start(address[0] << 1 | I2C_WRITE));
|
37 | i2c_write(0x11);
|
38 | i2c_rep_start(address[0] << 1 | I2C_READ);
|
39 | num1 = i2c_read(false);
|
40 | num2 = i2c_read(true);
|
41 | i2c_stop();
|
42 |
|
43 | printBits(num1, num2);
|
44 | uint16_t num3 = num1 << 2 | num2 >> 6;
|
45 | Serial.println(num3);
|
46 | delay(100);
|
47 | }
|
48 | void printBits(byte msb, byte lsb) {
|
49 | String out = "";
|
50 | boolean finish = false;
|
51 | for (byte mask = 0x80; mask; mask >>= 1) {
|
52 | if (mask & msb) {
|
53 | //Serial.print('1');
|
54 | out += "1";
|
55 | }
|
56 | else {
|
57 | //Serial.print('0');
|
58 | out += "0";
|
59 | }
|
60 | }
|
61 | for (byte mask = 0x80; mask; mask >>= 1) {
|
62 | if (mask & lsb) {
|
63 | //Serial.print('1');
|
64 | out += "1";
|
65 | } else {
|
66 | //Serial.print('0');
|
67 | out += "0";
|
68 | }
|
69 | if (mask == 64) {
|
70 | Serial.println(out);
|
71 | break;
|
72 | }
|
73 | }
|
74 | }
|
Das Programm holt sich das ab dem Register mit der Adresse 0x11 zwei
Bytes (Register von Vsource high byte und low byte).
wenn ich nun das Sensekabel auf 5 V stecke bekomme ich einen viel zu
kleinen Wert raus (mit dem Datenblatt ermittelt wären das 0,8V.
Wenn ich das über die formel berechne komme ich auf 1,7V, aber das sind
immernoch zu wenig.
Vielleicht fällt einem von euch ein Fehler auf
Danke Schonmal
Sören