Gibt es irgentwo einen code wie ich einen inkrementalen drehgeber mit 2 spuren über interrupts handlen kann???
Int0 = 1. Spur
Int1 = 2. Spur
Mfg
tobi
Gibt es irgentwo einen code wie ich einen inkrementalen drehgeber mit 2 spuren über interrupts handlen kann???
Int0 = 1. Spur
Int1 = 2. Spur
Mfg
tobi
Hmm geben tuts das sicher irgendwo, die welt ist ja scholießlich groß, und da ich denke dass du das auch bist könntest du ja versuchen dier auch was zu schrieben und wenn du wo nicht weiterkommst, dann gibts hier immer offene Ohren.Gibt es irgentwo einen code wie ich einen inkrementalen drehgeber mit 2 spuren über interrupts handlen kann???
Also sag wo hängts und wir versuchens zu lösen, so ne "habe-fertig"-Lösung bringt dir für dich persönlich eher nix.
öhm... also die ganze Geschichte.
Ich habe einen Drehgeber bei dem ich derzeit nur die A Spur nehme. Leider wackelt das medium sehr. Ergebnis = statt 512 Inkremente habe ich 1231 oder so. Deshalb benötige ich die B Spur um das zu analysieren und auf 512 +-1 zu kommen.
Ich hab mir das Prinzip so gedacht:
2 Interrupteingänge
-Wenn beide null alle hilfsvariablen vergessen
-Wenn erster int kommt bspw. Spur A -> merken
-wenn zweiter int kommt bspw. Spur B -> merken
-die reihenfolge analysieren und dann addieren oder subtrahieren.
leider arbeitet das programm größtenteils mit interrupts dies hat zur folge das die haupt do loop schleife nur jede sekunde ausgelöst wird. Da man bei einem interrupt nur ansteigend oder abfallend detektieren kann, weiß ich leider nicht wie ich meinen gedankenfluß realisieren soll.
Mfg
tobi
ahh ich habe da eine idee
Pseudocode:
Code:A as Bit B as Bit SpurA as INT0 SpurB as INT1 OnSpurA: A = 1 if B = 1 then -1 a = 0 b = 0 end if return OnSpurB: B = 1 if a = 1 then +1 a = 0 b = 0 end if return
Also ich kenne mich jetzt nicht so direkt mit dem Output deines Drehgeber s aus, aber ich denke mal der ist bei dem magnetischen ne sinusartige kurve oder ist das sogar schon digitalisiert?
naja wenns ein Sinus ist, dann würde ich in den Interruptroutinen auf jedenfall mal warten bis der Int-Pin wieder auf Low liegt, um sicherzustellen das er bei einem schlehten signal auch nur ein inc zählt, das dürfte schonmal die genauigkeit heben. Wenn du beide Spuren benutzt würde ich das eher so machen: du schaust in dem Interrupt dert als erstes kommt, ob danach die 2. spur kommt, wenn da aber vorher die selbe spur nochmal kommt kannste den puls getrost übersehen weil es ein fehler ist, das mit dem Subtrahieren und addieren hale ich für zu aufwendig, vlt tuts auch ein smith-trigger am Int-Eingang, oder ein glättungskondensator wirkt manchmal echt wunder hau mal so 10-100nF gegen Graund an die Spuren, das dürfte schon einiges bringen, war bei mir acuhmal so, weil ubder leitungen und so weiter ziehste bei Motoren schnell ordentlichen Signalmüll rein.
Bild hier der ist so aufgebaut wie meiner...
mit meinem pseudoprinzip sollte es doch gehen oder
so wie ich ihn verstanden hab zählt sein µC die Singale nicht richtigmit meinem pseudoprinzip sollte es doch gehen oder
doch aber das rad des drehgebers läuft nicht konstant sondern wackelt ab und zu ein bissel und dann bekomme ich fehlzählungen. deshabl die 2. spur. um diese wieder auszugleichen
anmerkung zum Pseudo-Code:
Wenn man sich einen IRQ-Eingang sparen will, und auf die 2. IR routine auch, dann kann mans auch so machen:
Der Pin an dem SpurB hängt muss kein IR sein, sonder ein normaler Port geht auch, hald als Eingang Config.. Die möglichkeit spart ne "menge" Code und man verplämpert auch nich unnötig Hardware.Code:Interrupt: ( Bei Steigender Flanke SpurA ) IF SpurB = 1 THEN dec Var ELSE inc Var END IF RETURN
In ASM sparste dir dann nochmlas zusätzlich ein paar MIP im vergleich zu BASCOM.
Aso wenn dein Rad wackelt, dann wird auch die SpurB nicht stimmen, weil si sitzt ja am gleichen rad, da solltest du dann lieber mal checken was du da mechanisch ausrichten kannst, weil Programmiertechgnisch wird das viel zu aufwendig.
Mit den 2 interrupts sollte es aber gehen denn wenn ers vorwärts wackelt dann macht er + und wenn es rückwärts wackelt macht er minus = 0. oder hab ich da nen denkfehler drin?
zu deinem code. Stimmt müsste so gehen! super idee
Lesezeichen