Interner Pullup <-> externe Beschaltung beim DHT22 o.ä.

Hi,

Ich hab an einem UNO einen DHT22 hängen. Den Data-Pin hab ich extern hoch mit einem 4k7 an 5V hochgezogen. Läuft prima!

Jetzt hab ich aber wieder nachgedacht, und würde gern etwas mit euch diskutieren:

Der UNO kann ja auch einen als Input definierten PIN mit einem internen Pullup hochziehen. Könnte ich mir da nicht die externe Beschaltung sparen? Gut, der interne Pullup ist lt. Beschreibung zwischen 20k und 50k. Wäre ja m.E. auch noch in Ordnung.

Jetzt hab ich noch in der DHT22-Lib nachgeschaut:

void DHT::begin(void) {
  // set up the pins!
  pinMode(_pin, INPUT);
  digitalWrite(_pin, HIGH);
  _lastreadtime = 0;
}

Die setzen den Pin ja auf High, was IMHO das Zuschalten des Pullup bedeutet. Allerdings steht noch folgendes in der Reference:

There are 20K pullup resistors built into the Atmega chip that can be accessed from software. 
These built-in pullup resistors are accessed by setting the pinMode() as INPUT_PULLUP. 
....
Prior to Arduino 1.0.1, it was possible to configure the internal pull-ups in the following manner:
pinMode(pin, INPUT);           // set pin to input
digitalWrite(pin, HIGH);       // turn on pullup resistors
.....

Ich hab atm IDE 1.0.5. Was macht dann das " digitalWrite(_pin, HIGH)" überhaupt noch, wenn der pinMode nur als INPUT und nicht als INPUT_PULLUP definiert ist?

Was meint ihr dazu?

Den internen Pullupwidertsand aktivierst Du entweder mit

 pinMode(_pin, INPUT);
 digitalWrite(_pin, HIGH);

oder mit

 pinMode(_pin, INPUT_PULLUP);

Beides macht genau das gleiche.

Grüße Uwe

Ach so, verstehe, bei "INPUT_PULLUP" brauch ich das "digitalwrite High" gar nicht mehr. 8)

Jetzt bleibt noch die Frage, ob ich bei dem Code in der Lib eigentlich noch extern beschalten muss? Habe mir allerdings die DHT.cpp noch etwas weiter angeschaut. Der PIN wird ja als Ein- und Ausgang genutzt.

hk007: Habe mir allerdings die DHT.cpp noch etwas weiter angeschaut. Der PIN wird ja als Ein- und Ausgang genutzt.

Ja und???

Jetzt bleibt noch die Frage, ob ich bei dem Code in der Lib eigentlich noch extern beschalten muss?

Ich habe keine Erfahrung mit dem DHT22 aber die Sache wird ähnlich dem I2C Pullup sein. Der Sensor und Arduino haben als Ausgang einen Open Collektor/Open Drain. Der kann die Leitung nur auf Masse ziehen. Für HIGH Signal muß die Signalleitung mittels Pullupwiderstand auf +Versorgungspannung gezogen werden. Nach jedem LOW muß der Pullupwiderstand die Kapazität der Signalleitung und die Eingänge laden. Die Zeiten für die H und L Signale sind zwischen 75 und 120µS. Laut Datenblatt ist mit vorgteschlagenen 5,1kOhm 30 m bei 5V Versorgungsspannung erreichbar. Ein zweites Datenblatt nennt 1kOhm und 100m. Antwort bei längeren Verbindungskabeln braucht es einen externen Pullupwiderstand.

Grüße Uwe

OK,

aber dann macht es doch immer noch einen Unterschied, ob man den internen dazuschaltet oder nicht. Dann hab ich ja einmal eine Parallelschaltung von 2 Widerständen und ohne internen Pullup nur den externen. Ich hab nämich in noch keinem Datenblatt gelesen, ob man dem internen Pullup Beachtung schenken muss.

Na gut, hab mal schnell nachgerechnet: 20k(intern) || 5k(extern) -> 4k. Ist jetzt nicht so weit weg von 5k

Fazit: Ich hab ~10m Leitungslänge. Dann spendier ich meiner Schaltung die 5k.

hk007:
Fazit: Ich hab ~10m Leitungslänge. Dann spendier ich meiner Schaltung die 5k.

Weise Entscheidung.
Wegen der Streuung des Internen Pullupwiderstandes (zwischen 20 und 50kOhm) ist Dein errechneter Wert der Minimalwert. Ein 4,7 kOhm Widerstand ist leichter zu finden als ein 5,1kOhm.
Die Werte streuen bei einem 4,7kOhm von 4,7kOhm (ohne internen Pullup) 4,3kOhm bis 3,8kOhm.
Dein Projekt müßte mit all diesen Werten funktionieren.

Grüße Uwe

Hallo,

ich bin eher hardwareaffin. Bei Preisen für den Pullup von ca. 1 Cent ist es müßig, darüber nachzudenken, wie ich die noch einsparen könnte. Freizeit und Lebenszeit sind mir dafür zu wertvoll ;) Ich habe vor langer Zeit mir mal bei Pollin ein 1000'er Widerstandssortimet bestellt, wo 25'er Gurtabschnitte quer Beet drin sind. Darunter auch viele exotische "krumme" Werte der E24'er Reihe. Für einen Pullup kann ich auch ohne weiteres z.B. einen 4,35K Widerstand "verheizen". An 1,1K störe ich mich auch nicht, wenn ich 1K brauche. Früher hatten die Widerstände 20% Toleranz und die Schaltungen funktionierten auch. Da braucht man mit 1% Metallschicht nicht so einen Aufriss machen. Es gibt nur ganz wenige Stellen, wo es auf diese Genauigkeit wirklich ankommt. Hauptsächlich, wenns analog wird. Spannungsteiler, wo mittels AD-Wandler was gemessen wird, Spannugsteiler für justierbare Spannungsregler, Operationsverstärkerschaltungen, wo es auf den genauen verstärkungsfaktor ankommt, weil danach etwas per AD-Wandler gemessen wird. Wenn man das unterscheiden kann, hat man etliche Freiheiten.

Gruß Gerald

hk007: Fazit: Ich hab ~10m Leitungslänge. Dann spendier ich meiner Schaltung die 5k.

Hier siehst du wie sich bei I2C verschiedene Pullups auf das Signal auswirken (das erste sind gleich die internen Pullups): http://www.gammon.com.au/forum/?id=10896&reply=5#reply5

Niedrigere Pullups sind gerade bei langen Leitungen besser, da die Kabel auch eine Kapazität haben, wodurch die Flanken mit zunehmender Leitungslänge wieder mehr die wie Ladekurven eines Kondensators aussehen.

I2C ist nicht das gleiche wie die OneWire-ähnliche Schnittstelle hier, aber rein elektrisch wird das praktisch das gleiche sein.