Das digitale Poti DS1666 am Arduino betreiben, Teil 2.

Auf Basis des ersten Teils wird das Programm zum DS1666 jetzt erweitert.

Als erstes kommt die Funktion DS1666Min() hinzu um den Wert auf Position 0 ( O Ohm) zu setzen.

void DS1666Min() {
  // auf 0 einstellen
  digitalWrite(CS, LOW);    // DS1666 aktiv
  digitalWrite(UD, LOW);   // Richtung runter vorgeben
  for (int i=0; i < 128; i++) {
    digitalWrite(INC, LOW);   // 1 Schritt machen
    digitalWrite(INC, HIGH);
  }
  digitalWrite(CS, HIGH);
}

Hinweis: Wenn in Zeile 4 UD auf HIGH gesetzt wird kann die Funktion auch den maximalen Wert einstellen.

Als zweites soll ein Widerstand eingestellt werden.

Wenn ich im Programm die kleine und große Schrittweite festlege wie im Datenblatt auf Seite 1 angegeben. Hier für meine 50 kOhm Version.

int deltaR1=122, deltaR2=759;

Dann kann ich mit dieser Funktion long DS1666Wert(long r) den nächstgelegenen Widerstandswert einstellen. Der wirkliche eingestellte Widerstandswert (etwas kleiner oder größer) wird zurückgegeben. Da der Widerstand über 32000 liegen kann werden hier long Variablen verwendet.

long DS1666Wert(long r) {
  // einen Widerstandswert r einstellen
  // der nächstgelegene Widerstandswert wird eingestellt
  long potineu=0, potialt=0;
  DS1666Min();      // Mit 0 starten
  for(int i=0; i < 128; i++) {
    if( potineu >= r) {
      if( abs(potineu-r) < abs(potialt-r) ) { 
        return potineu;
      }
      else {
        DS1666Dec();
        return potialt;
      }
    }
    potialt=potineu;
    DS1666Inc();  
    if(i <= 74) {     // Bis 74 kleinen R hinzuzählen
      potineu += deltaR1;
    }
    else {            // Dann großen R hinzufügen
      potineu += deltaR2;
    }
  }
  return potineu;
}

Hier das komplette Programm zum ausprobieren.

// Digitales Poti bis 0-50 kOhm
// DS1666-50 IC
// Arduino Uno Ansteuerung
//
// von Matthias Busse 14.08.2014 Version 1.1

/* Anschlüsse
DS1666  -  Arduino
U/D (2) -  Pin 3
INC (3) -  Pin 4
CS (4) -  Pin 5
GND (5) - GND
VCC (13) - 5V
VB (12) - GND

Poti Anschlüsse 
zum Testen wird der Spannungswert an A5 eingelesen 
VW (11) - A5
VH (10) - 5V
VL (9) - GND
*/

int UD=3, INC=4, CS=5, wert;
long rx;
int deltaR1=122, deltaR2=759;

void setup() {
  Serial.begin(38400);    // Ausgabe
  pinMode(CS, OUTPUT);    // Pin Funktion festlegen
  digitalWrite(CS, HIGH); // DS1666 nicht aktiv
  pinMode(INC, OUTPUT);
  digitalWrite(INC, HIGH);
  pinMode(UD, OUTPUT);
}

void loop() {
  delay(100);
  rx=DS1666Wert(25000);
  Serial.println(rx);
  wert=analogRead(5);
  Serial.println(wert);
}

void DS1666Min() {
  // auf 0 einstellen
  digitalWrite(CS, LOW);    // DS1666 aktiv
  digitalWrite(UD, LOW);   // Richtung runter vorgeben
  for (int i=0; i < 128; i++) {
    digitalWrite(INC, LOW);   // 1 Schritt machen
    digitalWrite(INC, HIGH);
  }
  digitalWrite(CS, HIGH);
}

long DS1666Wert(long r) {
  // einen Widerstandswert r einstellen
  // der nächstgelegene Widerstandswert wird eingestellt
  long potineu=0, potialt=0;
  DS1666Min();      // Mit 0 starten
  for(int i=0; i<128; i++) {
    if( potineu >= r) {
      if( abs(potineu-r) < abs(potialt-r) ) { 
        return potineu;
      }
      else {
        DS1666Dec();
        return potialt;
      }
    }
    potialt=potineu;
    DS1666Inc();  
    if(i <= 74) {     // Bis 74 kleinen R hinzuzählen
      potineu += deltaR1;
    }
    else {            // Dann großen R hinzufügen
      potineu += deltaR2;
    }
  }
  return potineu;
}

void DS1666Inc(void) {
  // Einen Schritt hoch machen
  digitalWrite(CS, LOW);    // DS1666 aktiv
  digitalWrite(UD, HIGH);   // Richtung hoch vorgeben
  digitalWrite(INC, LOW);   // 1 Schritt machen
  digitalWrite(INC, HIGH);
  digitalWrite(CS, HIGH);
}

void DS1666Dec(void) {
  // Einen Schritt runter machen
  digitalWrite(CS, LOW);    // DS1666 aktiv
  digitalWrite(UD, LOW);   // Richtung runter vorgeben
  digitalWrite(INC, LOW);   // 1 Schritt machen
  digitalWrite(INC, HIGH);
  digitalWrite(CS, HIGH);
}

 

von Matthias Busse

 

 

Ein Gedanke zu „Das digitale Poti DS1666 am Arduino betreiben, Teil 2.

  1. Pingback: Das digitale Poti DS1666 am Arduino betreiben. | Shelvin – Elektronik ausprobiert und erläutert

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.