mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Reedschalter stromlos abfragen


Autor: tom (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo
Ich möchte mir einen Drehzahlmesser mit einem Reedschalter + Magnet 
bauen, in der Art eines Fahrradcomputers. Klassisch würde ich das wie im 
Schaltbild machen. Das hat allerdings den Nachteil, dass wenn mein 
Reedschalter angezogen hat immer Strom über den Widerstand fliesst - was 
ich zwecks Stromverbrauch/Batteriebetrieb nicht möchte. Da das Gerät die 
meiste Zeit nix macht, möchte ich hier den Controller schlafen legen und 
über einen Portinterrupt vom Reedschalter wieder aufwecken.
Hat jemand eine Idee wie man den Reedschalter mit dem Controller 
verkuddelt damit kein Strom (I<100nA) benötigt wird. Den Widerstand 
möchte ich auch nicht zu hoch (>1M) auslegen wegen Störempfindlichkeit 
(ESD Luftentladung).

Danke und Gruß

Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja also um nen Pull-Up/Down kommste ja nicht herum...selbst, wenn du die 
internen im Controller verwendest.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  tom (Gast)

>Reedschalter angezogen hat immer Strom über den Widerstand fliesst - was
>ich zwecks Stromverbrauch/Batteriebetrieb nicht möchte.

Dann schalte den Pull-Up aus. Genauer, schalte einen externen Pull-Up 
mittels eines zweiten IO Pins. Dann fliesst kein Strom. Auch nicht bei 
1K. ;-)

MFG
Falk

Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das hab ich grad auch schon überlegt, aber wie bnekommst du den Eingang 
wieder "leer", wenn der Schalter wieder öffnet?

Autor: Pothead (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Leer? Du meinst die Streukapazitäten? Dadurch, dass du R periodisch kurz 
auf Masse ziehst um Veränderungen zu detektieren erledigt sich das von 
selbst. Oder was meinst du?

So:

 v
 |
  /
 |    |
 +----|
 R    |  uC
 +----|
      |

Hinweis: Clamp-Dioden an den Pins beachten für den Fall, dass der 
Reedschalter an einer höheren Spannung (v) hängt als der uC.

Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mhh, so noch nicht drüber nachgedacht...muss ich mir auch mal angucken 
;-)

Autor: Pothead (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder so - wie Falk es wohl meint - ist es noch günstiger:

       |
  +----|
  |    |
   /   | uC
  |    |
  +----|
  |    |
  R
  |
 ---

Autor: Spezi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder den Reedkontakt an GND und Portpin und den Widerstand an einen 
zweiten Portpin (also wie bei Pothead's letztem Post, nur Bauteile 
vertauschen).

So hängt der Reed immer mit einem Pin an GND, und man könnte auch 
geschirmte Anschluss-Leitung zum Controller verwenden (Schirm an GND). 
Wenn der Pullup gross oder aus ist, verhindert man so Stör- 
Einstreuungen auf der Leitung zum Eingangs-Pin des Controllers.

Autor: tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das mit dem Pull-Up an einem Port hab ich mir auch schon überlegt. Dann 
muss der Controller allerdings periodisch immer wieder den Port abfragen 
ob sich was geändert hat. Wenn nun die Pulsfrequenz gleich der 
Abfragefrequenz sind bekomme ich dort ggf. ein Problem. Genauso bekomme 
ich durch die periodische Abfrage eine gewisse Ungenauigkeit, zumindest 
bei den ersten Pulsen. Währe halt schon wenn erst durch einen externen 
Interrupt vom Reedschalter der Controller aufgeweckt wird.
Hatte auch schon an einen Reedschalter mit Wechsler gedacht, NO/NC an 
VCC/GND und C an den Port.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  tom (Gast)

>ob sich was geändert hat. Wenn nun die Pulsfrequenz gleich der
>Abfragefrequenz sind bekomme ich dort ggf. ein Problem.

Ja, muss man halt schneller abfragen.

> Genauso bekomme
>ich durch die periodische Abfrage eine gewisse Ungenauigkeit, zumindest
>bei den ersten Pulsen. Währe halt schon wenn erst durch einen externen
>Interrupt vom Reedschalter der Controller aufgeweckt wird.

Man kann nicht alles haben. Ist ja auch unlogisch, wenn der Reedschalter 
mit dauerhaft LOW stehen bleieben kann. Dann geht dein uC nie schlafen.

MFG
Falk

Autor: Kalli L. (knl)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Schalte doch mit dem Reedschalter ein RC-Glied (in Reihe).
Der Impuls der beim Schalten erzeugt wird dann per Interrupt auswerten.
Ist der Schalter dann dauerhaft greschlossen sorgt der Kondensator 
dafür, dass kein dauerhafter Strom fliest.

Autor: Joachim K. (minifloat)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
[code]
Pothead schrieb:
> So:
>
>  v
>  |
>   /
>  |    |
>  +----|
>  R    |  uC
>  +----|
>       |

Pothead schrieb:
> Oder so[...]
>
>        |
>   +----|
>   |    |
>    /   | uC
>   |    |
>   +----|
>   |    |
>   R
>   |
>  ---

oder so:
         ____
    v---|----+
        |    |
        |     / <-
        |µC  |  <-  schaltbarer interner Pullup
        |    R  <-
        |    |
   +----|----+
   |    |_______
    /
   |
  ---

Autor: tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Falk: Bei Dauerhaftem Low kann sich der uC genauso schlafen legen. 
Aufwachen tut er als Flankengetriggerter Interrupt.

@ Knut: Bei deinem Serien RC-Glied liegt der R aber auch gegen Masse. 
Wenn der Schalter geschlossen ist fliesst eben der nicht erwünschte 
Dauerstrom über den Schalter und den R.

Ich werde das ganze noch ein bischen überdenken und dann mal einige 
Versuche fahren welches die stromsparenste Variante ist (Dauerstrom über 
R zulassen, Zeitliches Abfragen, Reed-Wechsler, ...???). Danke erstmal 
für alle Beiträge.

tom

Autor: Tommi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oder so:

(+)
 |
 |
  /
 |
 |       |
 +---R---| PortPin
 |       |
 +-------| Int
 |       |
 C
 |
(-)


Der Kondensator hält dein Pegel bei offenem Kontakt zuverlässig auf 
Null, kurzzeitige Impulse kann er Puffern und durch Selbstentladung 
abführen.
Mit dem PortPin entlädst du den Kondensator nach einem Interrupt. Ohne 
den Widerstand gäbe es einen Kurzen, solange der Kontakt geschlossen 
wäre. Deswegen seperaten "Reset".

Autor: Tommi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nachtrag: Beim Fallen der Flanke müsstest du den Kondensator nochmals 
entleeren.

Autor: Nakka (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie wäre es denn mit einem Reed umschalter? Dann könntest Du die 
Versorgungsspannung des Controllers mit dem Reed Kontakt anschalten - 
falls der Controller zu langsam ist, bzw. mehr zeit braucht, nimm einen 
FET hinzu und schalte ihn parallel zum reed-schalter. Den gate des FET 
verbindest Du dann mit einem output pin des controllers - auf die Art 
kann der controller sich nach getaner Arbeit selbst wieder 
ausschalten...

Autor: Horst Hahn (horha)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

warum nicht einfach statt eines Reed-Relais' eine Spule plazieren.
Die wird dann beim vorbeisausen des Magneten Spannungsimpulse erzeugen, 
die sich, mit etwas Schutzbeschaltung, als pin change interrupt 
auswerten und den Controller aufwachen und zählen lassen können.
//Eventuell sogar, um die Spannungsversorgung damit zu 
unterstützen/laden.
Aber mal was anderes.
Wie misst Du die Zeit, "während du schliefst"
Ala Atmega48PA Timer2 und 32,768 khz Quarz ( power save supply 0,9 µA @ 
3V/25°) und alle 0,5 Sekunden eine Berechnung mit den gezählten Impulse 
und deren Ausgabe?
Dann könntest Du bei längerer Zeit ohne Spannungsimpulse den Timer 2 
ausschalten und nur wenn Impulse kommen diesen wieder einschalten, um 
wieder eine Zeitbasis zu haben.

Oder nutzt Du CLK-impulse (1,1 µA bei 32,768 kHz) oder Interrupt-Impulse 
eines externen RTC-Chips, wie  RV 8564-C2,RV 2123-C2 (wegen der 160 nA )

Autor: tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie ich die Impulse pro Zeit messe hab ich mir noch nicht überlegt. 
Entweder die Impulse pro Sek (0.5s) messen oder die Zeit zwischen zwei 
Impulsen und dann umrechnen.
Da nach Vorgabe das Gerät 22h pro Tag inaktiv ist möchte ich den 
Controller hierbei soweit wie möglich runterfahren und dann erst mit 
einen Impuls = ext. Interrupt wieder aufwachen. Das war die Überlegung.

tom

Autor: Horst Hahn (horha)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

wäre dann nicht ein Schmitttrigger angesagt zum Beispiel mit CD4093 fast 
stromlos:
http://www.datasheetcatalog.org/datasheets/270/109356_DS.pdf 
Stromaufnahme typisch 20 nA
Eingangsstrom typisch:  10pA
Diesen möglichst direkt am Reedrelais, der nach 3-Volt schaltet, 
anbringen sehr hochohmig den Eingangspin gegen Masse, z.B 10MOhm , 
betreiben und auslösen->formt den Impulse und löst Int0 aus.
Vielleicht funktionieren ja auch 100 MOhm.
Aber 3 Volt sind nötig.

Hauptsache "kann" aufwecken, kann aber schon wach sein.
Der externe Uhreninterrupt als pinchangeinterrupt, den man abstellen 
kann.
Skizze eines Ablaufes.

Startzustand:
1
Atmega ist im power-down-modus
Der Uhrbaustein läuft, gibt keine Impulse nach aussen.
Int0 ist gesetzt/enabled um aufzuwachen Interruptvektor steht auf 
"Uhr_Impulse_einschalten"
pin change Interupt der Uhr ist eingeschaltet

2
Jetzt rollt das Fahrrad und es gibt einen Impuls vom ReedRelais.
Der Atmega erwacht in 6 Taktzyklen mit internem RC-Oscillator als 
Taktquelle- 128 khz, weil der sparsamer ist, als der 8Mhz.
(Quarz braucht 16k Takte, da hat man sich schon längt wieder schlafen 
gelegt)
Int0_Interrupt ausführen
->Uhr_impulse_einschalten dort:
-->Uhr Impulse einschalten -SPI oder I2C
-->Int0-Vetor auf "Impulse_zaehlen" umbiegen
-->Diesen Impuls nicht zaehlen
-->power down

3
Beim jedem Reedrelais Impuls -> Interrupt Int0
Beim jedem Uhr Impuls -> Interrupt PCI
Nach jedem dieser Routinen geht es in den power down Modus

Beim Uhr_Impuls_Interrupt wird ein Zähler/Countdown geführt, der die 
Anzahl aufeinanderfolgender 0-Impulse zählt.
Das ist dann der Ersatz für einen retriggerbaren Monoflop.
Sollte zum Beispiel für 8 Sekunden, oder passend zur Reifengröße für 1 
km/h oder so in der Art, keine Impulse mehr gezählt worden sein dann 
werden die Uhr Impulse wieder ausgeschaltet, Int0-Vektor wieder auf 
Uhr_impulse_einschalten umprogrammiert-> Es geht mit 1 weiter.

Die Uhr-Impulse müssen wahrscheinlich alle 1/256 Sekunden oder so 
kommen.
Sonst bekommt man keine vernüfigen Berechnungen hin.
1 Impuls/Umdrehung in einer Sekunde sind bei 28" 8 km/h.
Dann zählt man einfach die Zeiteinheiten zwischen zwei Impulsen und 
vielleicht noch einen Ringbuffer über die Zeiten von 8/16 Impulsen, 
damit darüber einen Durchschnitt rechnen kann.

Da der Impuls Interrupt seltener kommt, sollten die Berechnungen dort 
stattfinden.Falls die Zeit zwischen den Impulse zu klein, 2 
Zeiteinheiten sind 10 ms -> Prellen diese ignorieren.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.