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