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