Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] Hallsensor schwingt?
plastikboot
04.09.2012, 22:48
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
Ich sehe da kein Problem in der Software, wohl aber in der Hardware.
Wie langsam dreht die Scheibe und wie weit sind die Sensoren auseinander. Welche Magnete hast du verbaut.
Möglich wäre, dass die Sensoren bei einer bestimmten Stellung auf beide Magnete ansprechen und somit "flackern".
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"?
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-kompendium.de/dse-faq.htm#F.29 oder hier http://http://www.mikrocontroller.net/articles/Drehgeber
Eine wirkliche kurze Zusammenfassung des Codes sei hier mal kopiert:
Von: 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;
MfG Klebwax
plastikboot
05.09.2012, 10:49
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
leider brauch ich jetzt wahrscheinlich wieder einen Prozessor mehr, weil der voll mit dem Drehgeber beschäftigt ist ;)
Das ist mir nicht klar. Die drei Zeilen C-Code im Interrupthandler macht doch jeder Prozessor ohne das du das merkst. Andere lassen ein halbes Dutzend und mehr Drehgeber im Hintergrund laufen.
MfG Klebwax
plastikboot
05.09.2012, 17:29
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.
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 ;)
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
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.