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
Pingback: Das digitale Poti DS1666 am Arduino betreiben. | Shelvin – Elektronik ausprobiert und erläutert