Senden Sie mehr als einen Wert über SPI/Arduino, MAX5483, 10-Bit-Digi-Poti

Mit Hilfe von efox29 habe ich ausgearbeitet, um das MAX5483, 10-Bit-Digitalpotentiometer (Datenblatt hier ) mit einem Arduino mit SPI zu steuern. Wie kann ich nun mehr als einen Wert triggern?

Ich habe versucht, das mit einer einfachen for-Schleife zu tun, aber es funktioniert nicht. Genau genommen erzeugt es einen seltsamen Widerstandswert (68 Ohm). Und selbst eine Verzögerung scheint die gleichen Probleme zu verursachen.

Zum Beispiel

digitalPotWrite(197); //  
delay(10000); 
digitalPotWrite(60); //  
delay(10000); 

Sollte sich der Widerstand zwischen 2,1k Ohm und 688 Ohm ändern. Ich vermute das, da gerade durchsetzen

digitalPotWrite(197);

oder

digitalPotWrite(60); 

allein ohne Verzögerung (10000); Ich kann diese Werte mit meinem Multimeter zwischen Pin 10 und 11 von MAX5483 messen. Aber wenn ich alles zusammenfüge, wie ich es oben versucht habe, messe ich seltsamerweise nur 65-68 Ohm. Dies ändert sich nicht, indem Sie nur die folgenden Zeilen einfügen:

digitalPotWrite(197); //  
delay(10000);

Hier ist der gemessene Wert (zwischen Pin 10 und 11) immer noch 68 Ohm.. Hier ist der vollständige Code:

#include <SPI.h> 
const int csPin = 3;
const int selPin = 2;  

void setup() {

 SPI.begin();
 SPI.setBitOrder(MSBFIRST); //We know this from the Data Sheet
 SPI.setDataMode(SPI_MODE2);

 pinMode(csPin,OUTPUT); 
 digitalWrite(csPin, LOW);

 pinMode(selPin,OUTPUT);
 digitalWrite(selPin, HIGH); 

}

void loop()
{     
    //"sweep" small range (from 1.7 to 2.1 KOhm)
    // 158 to 197
//    
//    for (int i=158; i < 211; i++){
//    delay(1000);
//    digitalPotWrite(i); //  
//   } 

digitalPotWrite(197); //  
delay(100); // seems to cause issues.. without this line it works

}

void digitalPotWrite(int value) {
digitalWrite(csPin, LOW);
delay(1);
byte command=0x0;
byte byte0 = (value & 0x03) << 6;
byte byte1 = (value & 0x3FC) >> 2;
SPI.transfer(command);
SPI.transfer(byte1);
SPI.transfer(byte0);
delay(1);
digitalWrite(csPin, HIGH);
}
Genauere Angaben zu "funktioniert nicht" und "scheint Probleme zu verursachen" wären gut.
Ich habe ein wenig bearbeitet und die Frage präzisiert. Danke!
Haben Sie versucht, die Widerstandsänderungen über externe Interrupts (z. B. Tastendruck) statt über den Verzögerungstimer auszulösen? [Ich kann mir nicht vorstellen, warum das einen Unterschied machen würde, aber ich denke, es ist einen Versuch wert.] Außerdem, wie messen Sie diese Werte? Es ist leicht, mit Ihren Sonden auszurutschen (und möglicherweise etwas kurzzuschließen, das nicht kurzgeschlossen werden sollte), wenn Sie Standard-DMM-Sonden auf kleinen SMD-Gehäusen verwenden ...
Das Multimeter funktioniert mit einem ICL7106/7 petervis.com/electronics%20guides/ICL7106%20and%20ICL7107/…

Antworten (2)

Das schießt im Dunkeln, weil ich nicht weiß, was "funktioniert nicht" bedeutet.

Aber wenn ich raten müsste, würde ich sagen, dass es funktioniert. Wenn Sie eine Skizze mit einem festen Wert laden können und den Widerstand wie erwartet sehen, dann scheint es ein Problem mit Ihrer Verzögerung zu sein - was bedeutet, dass es zu schnell ist. Mit der Verzögerung (100) ändert sich der Widerstand im Wesentlichen alle 100 ms. Kann dein Messgerät das gut erfassen? Können deine Augen das gut erkennen?

Ändern Sie Ihre Verzögerung (100) in Verzögerung (10000), was Ihnen ein 10-Sekunden-Fenster geben würde, um den Widerstand zu überprüfen. Wenn Sie mehr wollen, versuchen Sie einen höheren ms-Wert für Ihre Verzögerungsfunktion.

Wenn Sie weitere Informationen bereitstellen, können wir Ihnen möglicherweise einen besseren Einblick geben, warum etwas „nicht funktioniert“.

aus zusätzlichen Informationen bearbeiten

Vielleicht ist der SPI-Modus falsch.

Aus dem Datenblatt

Treiben Sie CS auf einen niedrigen Pegel, um die Daten bei DIN(U/D) synchron in das Schieberegister bei jeder ansteigenden Flanke von SCLK(INC) zu laden.

Es scheint, dass SPI.setDataMode(SPI_MODE2) falsch ist. Da MODE 2 die Basis des Takts hoch ist und Daten an der fallenden Flanke erfasst werden.

Ändern Sie Ihren SPI.setDataMode(SPI_MODE2) in SPI.setDataMode(SPI_MODE3) und prüfen Sie, ob Sie bessere Ergebnisse erzielen.

Ich habe die Frage bearbeitet. Also jetzt ist es klarer. Ich habe auch versucht, Delay (10000) einzustellen, ändert aber nichts an dem seltsamen Wert von nur 68 Ohm.
Haben Sie etwas anderes an Pin 10 und Pin 11 angeschlossen oder sind sie nicht angeschlossen und Sie messen den Widerstand direkt an den Pins, ohne dass etwas anderes angeschlossen ist?
Ich habe den Modus von 2 auf 3 geändert, aber die gleichen Ergebnisse. Ich messe den Widerstand direkt an den Pins, ohne dass etwas anderes angeschlossen ist.
Ich habe es! Es funktioniert mit SPI.setDataMode(SPI_MODE0); Ich kann nicht erklären warum, aber es funktioniert!
froh das zu hören.

In void setup() müssen Sie die Zeile ändern

SPI.setDataMode(SPI_MODE2); 

hinein

SPI.setDataMode(SPI_MODE0);