PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Interrupt zählt doppelt...



linuxer7
14.06.2012, 10:58
Hallo Leute.

Ich habe mir einen kleinen Roboter gebaut um etwas mit der Hardware und Software (Bascom) zu spielen.

Die Hardware besteht im wesentlichen aus 2 Conrad Gleichstrommotoren mit 1:50 Untersetzung und einem Atmega16 der mit 16Mhz getaktet wird.

Die Dreherkennung der Räder erfolgt über eine Gabellichtschranke und einem Lochrad auf der Achse der Räder.

Nachdem ich anfangs das ganze über eine Prozedur abgefragt hatte (Schleife) bin ich nun dazu übergegangen die Impulse der "Odometer" auf Int0 und Int1 zu legen und eine variable hoch zu zählen die dann aus dem ganzen Programm abgefragt werden kann.

Das ganze funktioniert auch soweit bis auf einen Kleinigkeit. Links wird doppelt gezählt aber nur dann wenn "beide" Motoren laufen.
Drehe ich die Motoren von Hand, oder steuere ich sie einzeln an dann funktioniert es ohne Probleme und beide zähler zeigen den gleichen Wert an.

Beide Motoren laufen auch synchron. Frage ich den rechten Zähler ab und stoppe die Motoren nach 16 Impulsen dann ist das genau eine Umdrehung mit beiden Motoren. Der rechte Zähler zeigt 16 an während der linke 32 anzeigt.

Die Auswertung des Interrupts der Ports erfolgt mit fallender Flanke.
Einen Verdrahtungsfehler am Port (Brücke) liegt nicht vor sonst würde der Zähler auch im Handbetrieb doppelt zählen Die Hardware funktioniert soweit.
Ein Oszi habe ich leider nicht um eventuelle Störungen im Signal zu verfolgen.

Ich habe absolut keine Ahnung woran das liegen kann das der Linke doppelt zählt.

Vielleicht findet jemand von euch den Fehler. Ich beschäftige mich zu ersten mal mit Interrupts und habe möglicherweise irgendwo einen Fehler gemacht.

In der "Sub Prog_test()" Routine befindet sich die Auswertung der Impulse.

Ich habe als Anhang das Testprogramm angehängt.
Das Testprogramm ist eine abgespeckte Version des Hauptprogrammes. Folglich liegen noch ein paar variablen herum die ich nicht entsorgt habe.

Und, ja ich weiss man kann es besser machen :)

Hoffende Grüße
Thomas

PICture
14.06.2012, 11:05
Hallo!

Für mich ist die doppelte Zählung durch EMV Störungen vom Motorstrom verursacht (Abschirmung von Leitungen ? ). ;)

linuxer7
14.06.2012, 11:09
Hi.
Die Leitungen sind zwar nicht geschirmt liegen aber gesondert von den Versorgungsleitungen der Motoren. Müsste dann nicht auch der Rechte doppelt zählen wenn beide Motoren laufen?

PICture
14.06.2012, 11:15
Es könnte auch sein, dass der Widerstand von Masseleitungen zu gross ist. Hifreich beim Suchen könnte umstecken der Motoren sein, ob die Störung mit bestimmtem Motor zusammenhängt.

linuxer7
14.06.2012, 13:35
Hi Picture,

Du scheinst recht zu haben. Es muss an den Störungen liegen.
Wenn ich die Motoren nur mit 30 PWM ansteuere dann bekomme ich nicht nur auf der linken Seite doppelte Impulse, sondern das fast 5 Fache. Auch die rechte "Zickt" nun rum. :)
Je kürzer die Impulse für die Steuerung der Motoren desto mehr Müll scheint auf den Leitungen zu sein.
Ein Oszi wäre jetzt genau das richtige.

Danke für den Hinweis.

Gruß
Thomas

PICture
14.06.2012, 13:56
Dann würde ich, falls möglich, noch versuchen die Stromspitzen zu verringern durch z.B. die PWM für Motoren glättende LC Tiefpässe. Es ist auch möglich, das die Störungen sich an den steuernden µC per Versorgungsspannung (VCC) übertragen, dann sollte eine Diode (für geringen Spannungsabfall Schottky) dagegen helfen (siehe Skizze).



D

Antrieb <-----+->|-+-----> µC
(Motoren) | |+
- ===
Akku --- /-\
| |
=== ===
GND GND

(created by AACircuit v1.28.6 beta 04/19/05 www.tech-chat.de)