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ß
@ 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
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.
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.
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.
@ 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
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.
@ 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
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".
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...
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 )
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
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.