Hallo
Was ein Interrupt ist weist du? falls nicht hier die Kurzfassung.
Wenn der Sketch läuft kann es vorkommen das er ein Signal übersehen tut wenn er gerade einen Teil des Sketches durchläuft wo zum Beispiel eine Signaländerung stattfindet. Um das zu vermeiden kann man für einige Pins eine Interrupt Überwachung einschalten. Findet jetzt eine Signaländerung statt wird ein Interrupt ausgelöst. Dieser Interrupt sorgt dafür das das eigentliche Programm kurz unterbrochen wird und in einen Unterprogramm z.B ein Zähler hochgezählt wird. Wenn er das gemacht hat wird mit dem eigentlichen Programm an der unterbrochenen Stelle fortgefahren. Das sorgt dann dafür das alle Impulse erfasst werden.
Der Nachteil dabei ist das das eigentliche Programm dadurch langsamer wird und Auswirkungen auf den Programmablauf und der Geschwindigkeit hat.
Deswegen ist man bemüht nicht so viele Interrupts zu erzeugen.
Unser
Motor erzeugt ca 1060 Impulse pro Umdrehung. Bei 2 Motoren wären das 2120 Interrupts pro Umdrehungen in einer Zeit von ca 2-3 Sekunden die eine Radumdrehung benötigt. Man kann sich vorstellen das der Prozessor damit eine Menge Arbeit hat.
Der Mega hat Schwierigkeiten beim Due ist es schon besser weil da der Prozessor eine höhere Leistung hat.
Daher ist man bemüht nicht zu viele Interrupts zu erzeugen damit der eigentliche Sketch noch flüssig verarbeitet werden kann.
Daher haben wir uns entschlossen ein Hardware Teiler auf die Platine mit aufzubauen um den Prozessor damit zu entlasten. Das ist nichts anderes als ein einstellbarer Hardware Teiler.
Das haben wir für die 2 Antriebsmotoren gemacht und für die Geschwindigkeitsüberwachung des Drehtellers.
Bei unseren Radmotoren haben wir ca 1060 Impulse pro Umdrehung. Wenn wir jetzt die 1 Brücke schließen ist ein Teiler von 2 Aktiv. Das heißt das der
Arduino jetzt nur noch pro Radumdrehung 530 Impulse bekommt.
ursprüngliche Impulse / Teiler = ausgehende Impulse
Schließt man die Brücke 2 wäre der Teiler 3. 1024/3=341 Impulse.
usw......
Es darf aber immer nur eine Brücke geschlossen sein.
Bei Bedarf kann man sich dort auch ein Dilschalter im Rastermaß 1,27 aufsetzen.
Die Impulse haben ein Pegel von 5V. Wenn ein Duo verwendet wird, wird
automatisch von der Platine das 5V Signal nach 3,3V angepasst durch ein Levelschifter der auf der Platine vorhanden mit ist.
Das einzige worauf man noch achten muss ist das der Sketch angepasst werden muss damit das Programm immer weiß wie viel Impulse eine Radumdrehung sind damit die Berechnungen korrekt ausgeführt werden.
Dafür gibt es in der Mower.cpp Datei folgende Einstellung zu ändern.
Code:
#if defined (PCB_1_3)
#define DIVIDER_DIP_SWITCH 2 // sets used PCB odometry divider (2=DIV/2, 4=DIV/4, 8=DIV/8, etc.)
odometryTicksPerRevolution /= DIVIDER_DIP_SWITCH; // encoder ticks per one full resolution
#endif
odometryTicksPerCm = ((float)odometryTicksPerRevolution) / (((float)wheelDiameter)/10.0) / (3.1415); // computes encoder ticks per cm (do not change)
Dip Switsch 2 entspricht der 1 Brücke - und Dip Switsch 3 entspricht der 2 Brücke.
Dip Switsch entspricht nicht der Nummer der Brücke sondern entspricht den eingestellten Teiler.
(Siehe Tabelle auf der Platine)
Gruß
Uwe