Forum: Mikrocontroller und Digitale Elektronik PAC1710 an Arduino - Viel zu geringe Ausgabe


von Sören W. (swillrodt)


Lesenswert?

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

: Bearbeitet durch User
von bastel (Gast)


Lesenswert?

Nimm Dir mal ein Register, das Du schreiben und lesen kannst, und guck 
ob das klappt, also das das Gleiche wieder rauskommt bein Lesen.

Vielleicht stimmt nur der Programmteil für die Darstellung nicht

von H.Joachim S. (crazyhorse)


Lesenswert?

Sören W. schrieb:
> uint16_t num3 = num1 << 2 | num2 >> 6;

 uint16_t num3 = num1 << 3 | num2 >> 5; ?

von Sören W. (swillrodt)


Lesenswert?

H.Joachim S. schrieb:
> uint16_t num3 = num1 << 3 | num2 >> 5; ?

Natürlich, das hab ich beim verzweifelten Testen ausprobiert.

bastel schrieb:
> ...also das das Gleiche wieder rauskommt bein Lesen.

Ich habe mein Programm einfach die eingebauten Festgelegten Register 
ausgeben lassen (Manufacturer ID,Revision).
Das klappt einwandfrei.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.