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.
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
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.
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
von Matthias Busse





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