Ansteuerung Digitalpoti AD5270 über ESP32 mit SPI

Hallo,

ich möchte gerne ein digitales Potentiometer AD5270 mit dem ESP32 ansteuern. Am Ausgang habe ich eine LED angeschlossen, die mir die Spannungsänderung beispielhaft darstellen soll.

Jedoch ändert sich weder die Helligkeit, noch der Widerstandswert oder die Spannung am Ausgang.

Ich habe mir von der Arduinoseite einen Beispielcode geladen, welchen ich etwas verkürzt habe. Im Anhang findet ihr den Code, sowie das Datenblatt.

Mein Programm zählt ja die Schritte hoch, jedoch wird entweder nichts übertragen, oder ich habe einen anderen Fehler. Vielleicht kann mir jemand helfen?

ad5270_Datenblatt.pdf (2.5 MB)

/

// inslude the SPI library:
#include <SPI.h>

// set pin 10 as the chip select for the digital pot:

const int chipSelectPin = 5;

void setup() {

  // set the chipSelectPin as an output:

  pinMode(chipSelectPin, OUTPUT);

  // initialize SPI:

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

void loop() {




  // change the resistance on this channel from min to max:

  for (int level = 0; level < 1023; level=level+10) {

    digitalPotWrite(chipSelectPin, level);
    Serial.println(level);
    delay(2000);

  }

  // wait a second at the top:

  delay(2000);

/*  // change the resistance on this channel from max to min:

  for (int level = 0; level < 255; level++) {

    digitalPotWrite(chipSelectPin, 255 - level);
    Serial.print(level);
    delay(10);

  }*/

}



void digitalPotWrite(int address, int value) {

  // take the SS pin low to select the chip:

  digitalWrite(chipSelectPin, LOW);

  delay(100);

  //  send in the address and value via SPI:

  SPI.transfer(address);

  SPI.transfer(value);

  delay(100);

  // take the SS pin high to de-select the chip:

  digitalWrite(chipSelectPin, HIGH);
}

Hallo,
auch dein Schaltbild ist wichtig, wie du alles zusammengeschaltet hast.
Auch da könnte ein Fehler sein.

Im Anhang die Skizze wie es verschaltet ist

Die Pins des ESP32 sind nicht 5V tolerant. Verwende die 3,3V für das Poti oder setze Levelshifter ein.
Welchen Wert hat dein Poti ?
Ich kann mit nicht vorstellen, das damit eine Led leuchten wird.

Wo hast du denn deinen Sketch her ?
Ich vermute, den hast du zu weit gekürzt, so dass dieser nicht mehr funktioniert.
Warum arbeitest du nicht mit einer passenden Library und dem zugehörigen Beispiel ?

Eben ist mir noch aufgefallen, das der externe Kondensator von 1yF am ext-cap Pin fehlt.

Egal welchen Wert den der digitale Potentiometer hat, den der TO verwendet, der Maximalstrom den der Digitalpontentiometer verträgt ist maximal 3mA bzw 2mA. Mit einem LED hast Du den AD5270 bereits kaputgemacht.

Grüße Uwe

Und genau da ist das Problem.
Der TO hat sich vermutlich das Datenblatt nicht angeschaut, sonnst wüsste er, dass die Led so nicht leuchten wird, da der kleinste Wert des Potis 20k beträgt. Da leuchtet keine Led mehr. Ok, ist das Poti am anderen Anschlag, könnte der von dir beschrieben Fehler auftreten.
Ich vermute aber, dass durch die eingebauten Schaltungsfehler, kein Leuchten erfolgen konnte.

diesen Code habe ich verwendet:

Die LED leuchtet, jedoch passiert dort nichts weiter.

Dir ist aber schon klar, dass dies ein komplett anderes Bauteil ist.
Da kannst du nicht einfach Sketch und Schaltung übernehmen.

ja, ich dachte da nur das man das zum ausprobieren mit der spi schnitstelle nutzen kann.

gibt es da noch eine andere möglichkeit zum testen des potis?

Den Tipp hatte ich doch schon gegeben. Auch dafür gibt es passende Libraries.

Der TO schaltet die LED an den Wipe (Schleifer) des (digitalen) Potentiometer. Wenn man den richtigen Wert des Potentiometer Einstellt dann kommen die 5V an den Wipe-Anschluß egal ob es eine 20, 50 oder 100kOhm Version des Potentiometer ist.
Zu sagen ist daß der minimale Innenwiderstand des Wipe Anschlußess zwischen 35 und max 70 Ohm liegt (also nicht 0 Ohm wie bei einem Mechanischen Potentiometer).
Außerdem mit einem Vorwiderstand von 220 OHm und 35 Ohm Innenwiderstand fließen je nach Farbe zwischen 13 mA (rote LED) und 6 mA (blaue oder weisse LED). Beider Extremwerte sind zu hoch. Ich tippe mal daß der Digitale Potentiometer einfach schon kaputt ist.

Grüße Uwe

Das hatte ich hier

auch u.a. schon eingeräumt.
Meine zusätzliche Vermutung trifft da nicht zu, da er ja Dauerleuchten hat.
Zudem verwendet er ja eine falsche Anschaltung.

Ich weiß nicht welchen Wert der AD5270 annimmt, wenn er eingeschaltet (Spannungsversorgung) wird aber keien Ansteuerung kommt.
Im Datenblatt nachgeschaut:
"Wiper position frozen to the last value programmed in the 50-TP memory. The wiper is frozen to midscale if the 50-TP memory has not been previously programme"
Der Schleifer ist beim einschalten in der Position beim letzten AUsschalten bzw das erste mal in Mittelstellung.
Da müßte die LED nicht leuchten (sehr schwach glimmen) mit einem Vorwidestand von 10, 25 oder 50kOHm je nach Modell.

Grüße Uwe

Das war auch meine Vermutung.
Ok, daher sollte der TO erst mal eine funktionierende Ansteuerung aufbauen.
Dann sehen wir weiter.

mit der genannten Beispiel-Libary komme ich soweit nicht weiter. Kann ich das auf den Mikrocontroller laden, oder muss ich extra ein Programm erstellen?

Bei der Überprüfung treten nur Fehlermeldungen auf

Und diese müssen wir jetzt erraten ?

Beides.

mir würde ja erstmal nur ein Beispielprogramm reichen, um den Spannungswert, bzw Widerstandswert anzeigen zu lassen.

Gibt es da was besonderes zu programmieren?

Hast du denn wenigstens den Beitrag in Github mal angesehen ?
Da steht doch alles drin.
Library komplett inkl. Beispielsketch.

hier die Fehlermeldungen

Arduino: 1.8.13 (Windows 10), Board: "ESP32 Dev Module, Disabled, Default 4MB with spiffs (1.2MB APP/1.5MB SPIFFS), 240MHz (WiFi/BT), QIO, 80MHz, 4MB (32Mb), 921600, None"





















In file included from C:\Users\Dell\OneDrive\Desktop\Technikerschule\Jahr 2\TLERW_E\Beispielprogramm\Beispielprogramm.ino:2:0:

C:\Program Files (x86)\Arduino\libraries\Communication/Communication.h:62:4: error: 'AD5270' redeclared as different kind of symbol

    AD5270

    ^

In file included from C:\Users\Dell\OneDrive\Desktop\Technikerschule\Jahr 2\TLERW_E\Beispielprogramm\Beispielprogramm.ino:1:0:

C:\Program Files (x86)\Arduino\libraries\AD5270/AD5270.h:40:20: note: previous declaration 'AD5270class AD5270'

 extern AD5270class AD5270;

                    ^

Beispielprogramm:176:24: error: variable or field 'AD5270_ChangeMode' declared void

 void AD5270_ChangeMode(AD5270Modes_t mode)

                        ^

Beispielprogramm:176:24: error: 'AD5270Modes_t' was not declared in this scope

C:\Users\Dell\OneDrive\Desktop\Technikerschule\Jahr 2\TLERW_E\Beispielprogramm\Beispielprogramm.ino: In function 'uint16_t AD5270_CalcRDAC(float)':

Beispielprogramm:11:37: error: 'MAX_RESISTANCE' was not declared in this scope

    return ((uint16_t)((resistance / MAX_RESISTANCE) * 1024.0));

                                     ^

C:\Users\Dell\OneDrive\Desktop\Technikerschule\Jahr 2\TLERW_E\Beispielprogramm\Beispielprogramm.ino: In function 'float AD5270_WriteRDAC(float)':

Beispielprogramm:27:38: error: 'MAX_RESISTANCE' was not declared in this scope

     RDAC_Value = (float)((RDAC_val * MAX_RESISTANCE) / 1024.0); // inverse operation to get actual resistance in the RDAC

                                      ^

Beispielprogramm:31:49: error: 'RDAC_WRITE_PROTECT' was not declared in this scope

     AD5270_WriteReg(WRITE_CTRL_REG, (setValue | RDAC_WRITE_PROTECT)); // RDAC register write protect -  allow update of wiper position through digital interface

                                                 ^

C:\Users\Dell\OneDrive\Desktop\Technikerschule\Jahr 2\TLERW_E\Beispielprogramm\Beispielprogramm.ino: In function 'float AD5270_ReadRDAC()':

Beispielprogramm:49:34: error: 'MAX_RESISTANCE' was not declared in this scope

     return( ((float)(RDAC_val) * MAX_RESISTANCE) / 1024.0);

                                  ^

C:\Users\Dell\OneDrive\Desktop\Technikerschule\Jahr 2\TLERW_E\Beispielprogramm\Beispielprogramm.ino: In function 'void AD5270_Set_SDO_HiZ()':

Beispielprogramm:58:24: error: 'HI_Zupper' was not declared in this scope

    uint8_t data1[2] = {HI_Zupper, HI_Zlower};

                        ^

Beispielprogramm:58:35: error: 'HI_Zlower' was not declared in this scope

    uint8_t data1[2] = {HI_Zupper, HI_Zlower};

                                   ^

Beispielprogramm:59:24: error: 'NO_OP' was not declared in this scope

    uint8_t data2[2] = {NO_OP, NO_OP};

                        ^

Beispielprogramm:62:30: error: cannot convert 'AD5270class' to 'enChannels' for argument '3' to 'void SPI_Write(unsigned char*, unsigned char, enChannels)'

    SPI_Write(data1, 2, AD5270);

                              ^

Beispielprogramm:63:30: error: cannot convert 'AD5270class' to 'enChannels' for argument '3' to 'void SPI_Write(unsigned char*, unsigned char, enChannels)'

    SPI_Write(data1, 2, AD5270);

                              ^

Beispielprogramm:67:30: error: cannot convert 'AD5270class' to 'enChannels' for argument '3' to 'void SPI_Write(unsigned char*, unsigned char, enChannels)'

    SPI_Write(data2, 2, AD5270);

                              ^

Beispielprogramm:68:30: error: cannot convert 'AD5270class' to 'enChannels' for argument '3' to 'void SPI_Write(unsigned char*, unsigned char, enChannels)'

    SPI_Write(data2, 2, AD5270);

                              ^

C:\Users\Dell\OneDrive\Desktop\Technikerschule\Jahr 2\TLERW_E\Beispielprogramm\Beispielprogramm.ino: In function 'uint16_t AD5270_ReadReg(uint8_t)':

Beispielprogramm:82:28: error: cannot convert 'AD5270class' to 'enChannels' for argument '3' to 'void SPI_Read(unsigned char*, unsigned char, enChannels)'

    SPI_Read(data, 2, AD5270);

                            ^

C:\Users\Dell\OneDrive\Desktop\Technikerschule\Jahr 2\TLERW_E\Beispielprogramm\Beispielprogramm.ino: In function 'void AD5270_Enable_50TP_Programming()':

Beispielprogramm:95:47: error: 'PROGRAM_50TP_ENABLE' was not declared in this scope

     AD5270_WriteReg(WRITE_CTRL_REG, (regVal | PROGRAM_50TP_ENABLE)); // RDAC register write protect -  allow update of wiper position through digital interface

                                               ^

C:\Users\Dell\OneDrive\Desktop\Technikerschule\Jahr 2\TLERW_E\Beispielprogramm\Beispielprogramm.ino: In function 'void AD5270_Store_50TP()':

Beispielprogramm:104:10: error: 'WRITE_OPERATION_50TP_TIMEOUT' was not declared in this scope

    delay(WRITE_OPERATION_50TP_TIMEOUT);

          ^

C:\Users\Dell\OneDrive\Desktop\Technikerschule\Jahr 2\TLERW_E\Beispielprogramm\Beispielprogramm.ino: In function 'void AD5270_Disable_50TP_Programming()':

Beispielprogramm:113:49: error: 'PROGRAM_50TP_ENABLE' was not declared in this scope

     AD5270_WriteReg(WRITE_CTRL_REG, (regVal & (~PROGRAM_50TP_ENABLE)));

                                                 ^

C:\Users\Dell\OneDrive\Desktop\Technikerschule\Jahr 2\TLERW_E\Beispielprogramm\Beispielprogramm.ino: In function 'void AD5270_WriteReg(uint8_t, uint16_t)':

Beispielprogramm:131:31: error: cannot convert 'AD5270class' to 'enChannels' for argument '3' to 'void SPI_Write(unsigned char*, unsigned char, enChannels)'

       SPI_Write(data,2, AD5270);

                               ^

C:\Users\Dell\OneDrive\Desktop\Technikerschule\Jahr 2\TLERW_E\Beispielprogramm\Beispielprogramm.ino: In function 'uint8_t AD5270_Read_50TP_LastAddress()':

Beispielprogramm:143:29: error: 'NO_OP' was not declared in this scope

    ret_val = AD5270_ReadReg(NO_OP);

                             ^

C:\Users\Dell\OneDrive\Desktop\Technikerschule\Jahr 2\TLERW_E\Beispielprogramm\Beispielprogramm.ino: In function 'uint16_t AD5270_Read_50TP_memory(uint8_t)':

Beispielprogramm:158:30: error: 'NO_OP' was not declared in this scope

     ret_val = AD5270_ReadReg(NO_OP);

                              ^

C:\Users\Dell\OneDrive\Desktop\Technikerschule\Jahr 2\TLERW_E\Beispielprogramm\Beispielprogramm.ino: At global scope:

Beispielprogramm:176:24: error: variable or field 'AD5270_ChangeMode' declared void

 void AD5270_ChangeMode(AD5270Modes_t mode)

                        ^

Beispielprogramm:176:24: error: 'AD5270Modes_t' was not declared in this scope

exit status 1

variable or field 'AD5270_ChangeMode' declared void



Dieser Bericht wäre detaillierter, wenn die Option
"Ausführliche Ausgabe während der Kompilierung"
in Datei -> Voreinstellungen aktiviert wäre.