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);
}
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.
In void setup() müssen Sie die Zeile ändern
SPI.setDataMode(SPI_MODE2);
hinein
SPI.setDataMode(SPI_MODE0);
uns2012
Algomaschine
uns2012
Algomaschine