mikrocontroller.net

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


Autor: Sören W. (swillrodt)
Datum:

Bewertung
0 lesenswert
nicht 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

//Adresses for the PAC
byte address[] = {0b1001100, //0 ohm
                  0b1001101,  //100 ohm
                  0b1001110,  //180 ohm
                  0b1001111,  //300 ohm
                  0b1001000,  //430 ohm
                  0b1001001,  //560 ohm
                  0b1001010,  //750 ohm
                  0b1001011,  //1270 ohm
                  0b0101000,  //1600 ohm
                  0b0101001,  //2000 ohm
                  0b0101010,  //2700 ohm
                  0b0101011,  //3600 ohm
                  0b0101100,  //5600 ohm
                  0b0101101,  //9100 ohm
                  0b0101110,  //20000 ohm
                  0b0011000,  //infinite ohm (open)
                 };
uint8_t num1 = 0;
uint8_t num2 = 0;

#define I2C_HARDWARE 1
#define I2C_PULLUP 1
#include <SoftI2CMaster.h>

#define resolution 1024
#define FSV 39.96

void setup() {

  i2c_init();
  Serial.begin(9600);
}

void loop() {
  while (!i2c_start(address[0] << 1 | I2C_WRITE));
  i2c_write(0x11);
  i2c_rep_start(address[0] << 1 | I2C_READ);
  num1 = i2c_read(false);
  num2 = i2c_read(true);
  i2c_stop();

  printBits(num1, num2);
  uint16_t num3 = num1 << 2 | num2 >> 6;
  Serial.println(num3);
  delay(100);
}
void printBits(byte msb, byte lsb) {
  String out = "";
  boolean finish = false;
  for (byte mask = 0x80; mask; mask >>= 1) {
    if (mask  & msb) {
      //Serial.print('1');
      out += "1";
    }
    else {
      //Serial.print('0');
      out += "0";
    }
  }
  for (byte mask = 0x80; mask; mask >>= 1) {
    if (mask  & lsb) {
      //Serial.print('1');
      out += "1";
    } else {
      //Serial.print('0');
      out += "0";
    }
    if (mask == 64) {
      Serial.println(out);
      break;
    }
  }
}

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
Autor: bastel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: H.Joachim S. (crazyhorse)
Datum:

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

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

Autor: Sören W. (swillrodt)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.