Forum: Mikrocontroller und Digitale Elektronik AVR Strom Sparen trotz Encoder-WakeUp


von Christian (dragony)


Lesenswert?

Hallo zusammen,

ich habe einen AVR attiny4313, welcher im Power-Down Sleep-Mode ist. 
Daran hängt auch noch ein Encoder mit 3 Pins, A B und GND. Die Pins am 
AVR sind alle auf Pull-Up.

Wenn man am Encoder dreht, wacht der AVR wie geplant auf (Pin-Change 
Interrupt). Allerdings kennt der Encoder drei verschiedene 
Logic-Positionen:

AB
00
10
11

Problem: Wenn während des Sleeps der Encoder zufällig auf 00 steht (was 
man von aussen ja nicht sehen kann), ist der Stromverbrauch quasi 0. 
Sobald er aber auf 10 oder sogar 11 steht, fliesst ja durchgehend ein 
Strom vom Pull-Up nach Masse. Ich habe 250uA gemessen und die müssen 
weg, da es eine batteriebetriebene Anwendung ist.

Leider kann ich keine anderen Elemente, wie z.B. Knöpfe einbauen. Hat 
jemand eine Idee?

: Bearbeitet durch User
von IUnknown (Gast)


Lesenswert?

Externe hochohmigere Pullups.

von Christian (dragony)


Lesenswert?

Ah, dachte ich es mir doch, dass es eine einfache Lösung gibt :)
Ich habe jetzt 1 MOhm genommen und es funktioniert sehr gut. Danke!

Was bestimmt denn die Obergrenze des Widerstandwertes der Pull-Ups? Ich 
kann ja bestimmt nicht sowas wie 100 MOhm nehmen?

: Bearbeitet durch User
von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Christian S. schrieb:
> Was bestimmt denn die Obergrenze des Widerstandwertes der Pull-Ups? Ich
> kann ja bestimmt nicht sowas wie 100 MOhm nehmen?

Zum einen die Leckströme des AVR Eingangs. Wenn der Widerstand zu hoch 
ist, reicht der Querstrom durch den Pullup nicht mehr, um die Pins noch 
auf High zu ziehen.

Zum zweiten bildet der Pullup mit der Eingangkapazität des AVR einen 
Tiefpass, der beim Wechsel von Low auf High für langsameres Laden sorgt, 
je höher der R wird.
Als nächstes ist der Aufbau von Bedeutung. Ein wenig Feuchtigkeit am 
Encoder bildet ja auch einen Widerstand, der dann vom sehr hochohmigen 
Pullup nicht mehr überwunden werden kann. Es gilt also so hoch wie 
möglich, aber so niedrig wie nötig.

von Falk B. (falk)


Lesenswert?

@ Christian S. (dragony)

>Wenn man am Encoder dreht, wacht der AVR wie geplant auf (Pin-Change
>Interrupt).

Naja, grenzwertig. Funktioniert einigermaßen, ist aber nicht unbedingt 
die sauberste Art der Auswertung.

> Allerdings kennt der Encoder drei verschiedene
>Logic-Positionen:

>AB
>00
>10
>11

Warum nur drei? Es sollten entweder 2 oder 4 sein.

>Problem: Wenn während des Sleeps der Encoder zufällig auf 00 steht (was
>man von aussen ja nicht sehen kann), ist der Stromverbrauch quasi 0.
>Sobald er aber auf 10 oder sogar 11 steht, fliesst ja durchgehend ein
>Strom vom Pull-Up nach Masse.

Ist es nicht eher anders herum?

>Ich habe 250uA gemessen und die müssen
>weg, da es eine batteriebetriebene Anwendung ist.

Hmm, schwierig.

Ein Möglichkeit sind geschaltete Pull-Ups. D.h. man wertet den Encoder 
ganz solide mittels Timer-Interrupt aus. In der periodischen Abfrage 
schaltet man die Pull-Ups nur kurz ein, lies die Port Pin und schaltet 
wieder aus. Das kostet halt etwas Strom für die CPU, die periodisch 
aufwachen muss, ausserdem muss ein Low Power Oszillator immer laufen. 
Muss man mal probieren, wieviel Strom das kostet.

Oder eine hybride Lösung. Während langer Perioden des nichts tun nutzt 
man nur einen sehr hochohmigen, externen Pull-Up. Wenn dann einmal 
gedreht wird, schaltet man auf die Timer-Auswertung mit geschalteten 
Pull-Ups um. Nach einem Timeout von ???s, wenn keine Eingaben mehr 
erfolgen, schaltet man wieder zurück auf Power Down und Pin Change 
Interrupt. Auf diese Weise kann man während der aktiven Phase mit 
niederohmigeren Pull-Ups arbeiten und somit die Störfestigkeit erhöhen. 
Ist aber ein wenig aufwendig.

>Ah, dachte ich es mir doch, dass es eine einfache Lösung gibt :)
>Ich habe jetzt 1 MOhm genommen und es funktioniert sehr gut. Danke!

Auf deinem Basteltisch bei Sonnenschein.

>Was bestimmt denn die Obergrenze des Widerstandwertes der Pull-Ups?

Leckströme durch Temperaturerhöhung, Verschmutzung und Betauung.

> Ich
>kann ja bestimmt nicht sowas wie 100 MOhm nehmen?

Nein, denn dan reagiert den Encoder auf kleinsts Störeinkopplungen. 
Selbst bei 1M hätte ich da schon Bedenken.

Wenn, dann sollte man es so machen wie hier gezeigt.

https://www.mikrocontroller.net/articles/Entprellung#Einfacher_Taster

Der R1 = 1M, danach noch ein RC-Tiefpass. Damit wird die Sache nochmal 
DEUTLICH besser bezüglich EMV. 10k/100n sind so ein Standardwert für 
R2/C1.

Edit: 100n sind natürlich bei 1M Pull-Up zuviel! Eher so 1n, macht dann 
1ms Zeitkonstante.

: Bearbeitet durch User
von John (Gast)


Angehängte Dateien:

Lesenswert?

Wenn man die Pullup-Widerstände zu hochohmig wählt, besteht die Gefahr, 
dass die Schalter nicht mehr zuverlässig schalten. Schalter benötigen 
einen Mindeststrom um zuverlässig zu schalten.

Hier hatte ich das gleiche Problem:
Beitrag "Re: Zeigt her eure Kunstwerke (2015)"

Bei dem Timer verwende ich einen Encoder der pro Umdrehung gleich viele 
Impulse wie Rasterungen hat.
http://www.reichelt.de/Drehimpulsgeber/STEC12E05/3/index.html?ACTION=3&GROUPID=3714&ARTICLE=73921&SEARCH=Drehimpulsgeber&OFFSET=16&WKID=0&;
An den Rastpositionen ist Kontakt A immer geöffnet. Hier ist der Pullup 
gegen Plus für wakeup. Der Pullup für Kontakt B wird bei Bedarf über 
einen Portpin zugeschaltet.

Allerdings ist es möglich den Encoder zwischen zwei Rasterungen 
einzustellen und dort stehen zu lassen. Dann fließt ständig Strom über 
den Pullup.
Den ersten Timer hatte ich meiner Mutter geschenkt. Der wird seit ca. 2 
Jahren, fast täglich, benutzt. Bisher gab es kein Probleme.

Gruß
John

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.