Arduino Due: I2C Digitalpotentiometer

Hallo Community,

für ein privates Projekt habe ich ein I2C Digitalpotentiometer (AD524, genauer AD5245BRJZ50) mit 50kOhm verbaut.
Die Adresse des Digitalpoti habe ich bereits herausgefunden: 0x2C.
Das Poti liegt an 3.3V Versorgungsspannung. Die I2C Busverbindung scheint zu funktionieren.

Zum testen des Poti habe ich ein Sketch für den Arduino DUE geschrieben, dass den Wert des Poti in regelmäßigen abständen (3 Sekunden) ändert (siehe unten).

Jetzt zur eigentlichen Problemstellung;
Egal welchen Wert ich durch das Sketch an den Poti sende, steht sozusagen der „Schleiferkontakt“ immer mittig, also bei etwa 25kOhm. Das setzen des Potis auf GND (Übergabewert „0“) funktioniert.
Also kurz: Ich kann nur zwischen 1,65V und 0V hin- und herschalten.

Was mache ich falsch? Ich will auch andere Werte als diese zwei Werte am Schleifer (W) einstellen können.

Könnt Ihr mir helfen?

Viele Grüße
kleinerkaktus

Anmerkung zum Sketch: Der Übergabewert 255 im Sketch sollte doch eigentlich den Poti auf „Vollausschlag“, also 50kOhm stellen, oder nicht?

// ++++++++++++++++++++ Libraries ++++++++++++++++++++

#include <Wire.h> // I2C-Bus Library

// ++++++++++++++++++++ Variable ++++++++++++++++++++

// Digitalpotentiometer
byte potAdress = 0x2C; // Setzt die Adresse des Digitalpotentiometers
const double valuePotA = 3.3; // Spannung an Terminal A
const double valuePotB = 0; // Spannung an Terminal B

//++++++++++++++++++++ SETUP ++++++++++++++++++++

void setup() {
  Serial.begin(9600); //Startet die Kommunikation per USB zum Computer

  // Setup I2C:
  Wire.begin(); // Startet die I2C Kommunikation
  while (!Serial); //Leaonardo wait for serial monitors
}

//++++++++++++++++++++ LOOP ++++++++++++++++++++

void loop() {
  delay(3000);
  setValue(255);
  delay(3000);
  setValue(0);
  
}

void setValue(byte val)
{
  Wire.beginTransmission(potAdress);
  Wire.write(val);
  Wire.endTransmission();
}

Hallo jetzt melde ich mich nochmal mit einem Nachtrag:

Die Formel zur Berechnung des Übergabewertes D aus dem Datenblatt lautet:

Vw(D) = ((D/256)*Va)+((256-D)/256)*Vb

Vw(D) : Spannung am Schleiferkontakt (W)
D: Einstellwert
Va: Spannung am Terminal A (3.3V)
Vb: Spannung am Terminal B (GND)

Da Vb = GND ist, fällt der hintere Teil der Gleichung ab dem „+“ weg.

Der AD524 ist etwas anderes, das ist ein Messverstärker.
AD5245 ist richtig.

OK, das hilft dir nicht weiter. :frowning:

Das Problem ist nicht neu, das hatten wir vor Jahren schon einmal in einem Forum.

Aber ich kann mich nicht erinnern wo und was der Fehler war.
Das Problem liegt irgendwo in der I2C-Ansteuerung.

MfG Peter(TOO)

Hallo Peter(TOO),

Danke für deine Antwort.
War das damals eher ein Hardwareproblem, also von z.b den I2C-Pullup Widerständen, oder ein eher ein Problem mit der wire.h Library?
Weißt du das noch?

Viele Grüße
kleiner_kaktus

Hallo!
Wenn ich ins Datenblatt schaue, steht da, daß der Chip 2 bytes erwartet. Mit dem ersten sagt man ihm, ob er einen Reset oder shutdown machen soll, und das zweite ist das eigentliche Daten-Byte. Du sendest aber immer nur ein Byte, und dann können so lustige Sachen sachen wie bei dir jetzt auftreten.
Sende mal immer zuerst eine 0 vor dem eigentlichen Wert.

Nachtrag:

Die I²C-Kommunikation läuft prinzipiell so ab, daß zuerst die Adressierung, also ein „Hey, Adresse 0x02, ich rede mit dir“ geschickt wird, gefolgt von einem Kommand-byte und einem Daten-Byte.

Dein Wire.beginTransmission(potAdress); ist das „Hey, ich rede mit dir!“. Demnach schickst du IMMER nur ein Kommando-byte, und niemals ein Datenbyte.

Jetzt passiert folgendes in deinem Code:

Wire.write(255);

Sowohl Shutdown als auch Reset-Bit sind damit gesetzt.

Shutdown heißt: Der Schleifkontakt wird direkt mit Pin A verbunden, während Pin B vom Poti getrennt wird. Das heißt aber auch: wenn du A mit GND verbunden hast, bekommst du 0V raus.
Der Setzwert des Potis wird dabei nicht geändert. Heißt: Wenn man das Shutdown wieder weg nimmt, macht das Poti da weiter, wo es vorher aufgehört hat.

Reset heißt: Der Setzwert wird auf 50% gesetzt.

Wire.write(0);

Shutdown und Reset werden damit zurück genommen. Vom letzten Reset steht der Setz-Wert noch auf 50%, daher misst du jetzt 1,65V


Es ist natürlich so, daß je nach gesendeten Werten auch was anderes passieren kann. Um das, was du willst zu erreichen, müßtest du das hier machen:

Wire.beginTransmission(potAdress);
Wire.write(0);  // Kommando
Wire.write(val); // Setzwert
Wire.endTransmission();

Und da du ja eine Reaktion von dem Chip bekommst, und seine Adresse herausgefunden hast, kannst du eigentlich davon ausgehen, daß bei der I²C-Kommunikation alles in Ordnung ist. (Naja, ein Garant ist das nicht, aber dein Problem ist wie gesagt ein anderes)

Hallo Ihr alle und hallo sweber,

vielen Dank für eure und insbesondere auch deine Hilfe!

Es war tatsächlich das von sweber beschriebene Problem. Das erste Byte ist das Resetbyte. Das zweite das Datenbyte. Mit der von dir beschriebenen Methode hat es sofort auf anhieb funktioniert.

Ich denke mal der Digitalpoti wird in seinem gesamten Potileben nicht mehr so viele getaktete Resets erhalten wie gestern :wink:

Vielen Dank für die Hilfe!!!

Viele Grüße
kleiner_kakuts