Das digitale Poti DS1666 am Arduino betreiben.

Das digital einstellbare Potentiometer IC DS1666-50 soll vom Arduino angesteuert werden. Hier das Datenblatt DS1666. Ich habe die Version -50 mit 50 kOhm Einstellbereich hier.

Als erstes wird die Schaltung aufgebaut.

DS1666 Pinbelegung

DS1666 Pinbelegung

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

Die Poti Anschlüsse
Zum Testen wird der Spannungswert an A5 eingelesen.
VW (11) – A5
VH (10) – 5V
VL (9) – GND

ds1666-4-1000

Dann werden diese Pins in der Arduino Software eingetragen und die Pins werden als Ausgang geschaltet.

int UD=3, INC=4, CS=5;

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

Das Timing Diagramm zeigt wie hoch und runter gezahlt wird, also der Poti Abgriff VW einen Schritt hoch zu VH oder runter zu VL verstellt wird.

DS1666 Timing

DS1666 Timing

Die Zeiten sind dabei angegeben mit mindestens 100ns bis 1us. Wenn digitalWrite() eingesetzt wird benötigt es ca. 3,3 us, es werden also alle Zeiten weit überschritten.

Wenn allerdings die Ports direkt angesprochen werden sollen ist das in ca. 2 Taktzyklen möglich, was bei 16MHz Takt dann 125 ns sind. Dann muss auf das Timing geachtet werden und ggf. müssen NOP (1 Takt warten) Anweisungen eingefügt werden. Ich verwende hier digitalWrite() das vereinfacht die Sache.

Um den Abgriff zu verstellen sind hier die 2 Funktionen:
DS1666Inc() geht hoch
DS1666Dec() geht runter

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);
}

Wenn der Poti mit VH an 5V und mit VL an GND gelegt wird, dann steht am Abgriff VW die Spannung nach dem Spannungsteiler Verhältnis zur Verfügung und kann am analogen AD Eingang A5 des Arduino eingelesen werden. Danach wird sie im Terminalprogramm ausgegeben.

wert=analogRead(5);
Serial.println(wert);

Es sind Werte zwischen 0 (0V) und 1023 (VCC ca. 5V) möglich.

In einer Schleife soll der Poti jetzt schrittweise (100ms pro Schritt) hoch und runter laufen bis zu den Grenzen 0 und 1023. An der Grenze soll die Richtung dann umgekehrt werden.

void loop() {
  delay(100);
  wert=analogRead(5);
  Serial.println(wert);
  if(wert==0) hoch=1;    // Nach 0 wieder hoch gehen
  if(wert==1023) hoch=0; // Nach 1023 (max) wieder runter gehen
  if(hoch==1) DS1666Inc();
  else DS1666Dec();
}

Und hier nun das komplette Programm.

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

/* 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, hoch;

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);
  wert=analogRead(5);
  Serial.println(wert);
  if(wert==0) hoch=1;    // Nach 0 wieder hoch gehen
  if(wert==1023) hoch=0; // Nach 1023 (max) wieder runter gehen
  if(hoch==1) DS1666Inc();
  else DS1666Dec();
}

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);
}

Im Terminal gibt es dann diese Ausgabe

ds1666-3

von Matthias Busse

Weiter zum Teil 2

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

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

Schreibe einen Kommentar

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

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.