Hallo und gleich danke für jede Hilfe.
Ich habe in einem Drehgeber (Selbstbau) zwei Hallsensoren vom Typ Siemens TLE 4905L verbaut. Es geht um die langsame Drehung einer Scheibe.
Leider gibt es jetzt Stellungen der Drehscheibe, die ein "Flackern" des Hallsensors auslösen - d.h. der Interrupt springt massiv an und zählt wie verrückt nach oben.
Ich kann leider nur mit "Change" arbeiten, damit ich die Drehrichtung mit 2 Sensoren sicher ermitteln kann. Kennt jemand eine Möglichkeit den Hallsensor zu "beruhigen"?
Hallsensor1 Alias Porte.4 ' Hallsensor 1 definieren an PortE4 JP1Pin6 Int4
Config Hallsensor1 = Input
On Int4 Hallsensor1change ' Bei Change auf Routine Hallsensor1change springen
Hallsensor1 = 1
Config Int4 = Change ' Change um beide Flanken zu erkennen!!!!
Enable Int4
Verzweifelter Gruß
Plastikboot
Meine Blogs: Mein Leben in China - Roboter selbst gebaut
Mein Favorit unter den Robotern ist natürlich R2D2
Das ist ein "klassisches" Problem. Es läßt sich aber lösen, wobei ein Interrupt bei Flankenwechsel nicht die Lösung ist, sondern eher zur Vergrößerung des Problems beiträgt.
Lösungen findet man hier http://http://dse-faq.elektronik-kom...e-faq.htm#F.29 oder hier http://http://www.mikrocontroller.ne...cles/Drehgeber
Eine wirkliche kurze Zusammenfassung des Codes sei hier mal kopiert:
MfG KlebwaxVon: MaWin 25.7.2001
Am einfachsten realisiert man das mit einer state machine als Tabelle. In C sieht das so aus.
int table[4][4]={{0,1,-1,0},{-1,0,0,1},{1,0,0,-1},{0,-1,1,0}};
int position=0; // zaehlen wir mal die absolute Position
volatile int quadrature_input; // bit 0 und bit 1 sind Quadratureingaenge
int new_quadrature_value, last_quadrature_value=quadrature_input;
Folgenden Code ausreichend oft wiederholen (in der Programm Hauptscheife oder einer Zeitgeber gesteuerten Interrupt Routine):
new_quadrature_value=quadrature_input;
position+=table[last_quadrature_value][new_quadrature_value];
last_quadrature_value=new_quadrature_value;
Strom fließt auch durch krumme Drähte !
Hallo Lumi und Klebwax,
@lumi: es liegt wohl nicht an einem doppelten Ansprechen durch zwei Magnete, sondern um den Punkt an dem ein Magnet gleichzeitig auslöst und auch wieder nicht auslöst. Die Interrupts können dann nicht auswerten, weil dieser Wechsel zu schnell von statten geht. Durch Deinen Hinweis bin ich aber ein gutes Stück weiter gekommen - oft ist man ja betriebsblind...
@klebwax: das war dann der Durchbruch: vom Interruptgesteuerten Abfragen zu einem timergesteuerten Interrupt für die Abfrage - ich rechne mir noch die maximale Geschwindigkeit aus und kann dann einfach damit weitermachen .... leider brauch ich jetzt wahrscheinlich wieder einen Prozessor mehr, weil der voll mit dem Drehgeber beschäftigt ist
Gruß und Dank
plastikboot
Hi Klebwax,
bin halt nur ein kleiner Bascomer - da wird es schnell langsam - und der Atmega soll noch ein paar andere zeitkritische Sachen machen...
Im Augenblick klappt es eh noch nicht so ganz - aber durchbeissen macht wenigstens satt
Gut zu wissen, dass du eine Lösung gefunden hast und dass es nicht nur an der Anordnung der Magnete liegt.
Meine Blogs: Mein Leben in China - Roboter selbst gebaut
Mein Favorit unter den Robotern ist natürlich R2D2
Bascom ist ja doch auch ein Compiler und der Code sollte auch nicht schlechter sein, als ein aus C erzeugter. Probleme bei zeitkritischen liegen eher im Systemdesign als in der Wahl der Programmiersprache.
MfG Klebwax
Strom fließt auch durch krumme Drähte !
Lesezeichen