PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : mehrere encoder an einem µC



Thomas$
27.12.2009, 19:18
ich suche nach einer möglich keit mehre encoder mit einem µC auszuwerten
es geht in ersterlinie nach einer programm struktur dafür. das programm an sich wird dann auf einem arduino oder irgendein atmel µC geschrieben
es sollen erstmal 4 encoder gleichzeitig ausgelesen werden sollte aber bis zu 8 encoder erweiter bar sein.
der unterschied zwischen erster und der zweiten nachfolgenden flanke beträgt 40µS der code unten geht für einen encoder und den code hatte ich im netz gefunden
man könnte zwar das ganze genauso aufbauen wird aber bei 4 oder dann eventuell 6 geplanten encodern bissel stressig


void loop() {
n = digitalRead(encoder0PinA);
if ((encoder0PinALast == LOW) && (n == HIGH)) {

if (digitalRead(encoder0PinB) == LOW) {
encoder0Pos--;
} else {
encoder0Pos++;

}

Serial.print (encoder0Pos);
Serial.print ("/");
}
encoder0PinALast = n;
}

es ist zwar kein richtiger encoder aber es gibt das selbe signalschema aus
bascom bietet zwar ein befehl für encoder kann dieser auch mehrere encoder parallel auswerten? wenn ja wieviele?
mfg thomas

williwilli
05.01.2010, 11:28
Hi Thomas,

Siehe auch https://www.roboternetz.de/phpBB2/viewtopic.php?p=185332 Bascom hat wohl kleinere Schwierigkeiten mit Encodern...
Kommt auf Deine Aufgabenstellung und auf die Encoder an. Wenn Du außer den Encoderabfragen noch etwas anderes im Programm machen möchtest, würde ich bis zu 8 Stück nicht an einen einzelnen µC hängen. Denk doch mal über folgende zweigeteilte Lösungen nach:
- Ein "Vor-µC" wertet die Encoder aus und sendet bei bestimmten Bedingungen ein Signal als Interrupt an den Haupt-µC
- Mit einer diskreten Schaltung je Encoder (Zähler etc.) erzeugst Du eben dieses Signal (nicht so flexibel wie die erste Lösung, aber dann wär's nur ein µC)

PicNick
05.01.2010, 11:39
Wenn du rechnest:
40 µS Bei 8 Encodern bleiben 5 µS je Encoder
das mal µC Quartz (sagen wir 16 MHZ)
hast du für jeden Flanke ~ 80 CPU-Cyclen zum Verarbeiten.
(wenn der Controller sonst nix zu tun hat)
das scheint mir knapp, aber prinzipiell möglich.

Was Bascom mit Encodern treibt, kannst du hier sehen:
http://www.rn-wissen.de/index.php/Bascom_Inside-Code#.28Quadratur-.29_ENCODER

PICture
05.01.2010, 12:02
Hallo!

@Thomas$

Um prellenden Encoder auszuwerten muss man ihn normaleweise zweimal mit bestimmten Zeitabstand (ca. 10 ms) auslesen.

Als nötige Zeit zwischen Auslesungen anstatt leerer Verzögeröngsschleife habe ich immer wiederholend ausführbare Unterprogramme (z.B. Displayausgabe) mit gemessener gesamter Ausfürungszeit um 10 ms verwendet. Ich programmiere aber PICs in ASM und könnte dir bei AVRs leider nicht konkret helfen.

MfG

Thomas$
05.01.2010, 14:15
bei mir prellt hier nichts

edite: ich löse mal das rätsel warum nichts prellt es ist kein richtiger encoder aber ein maussensor ich hab bisher nur eine achse ausgelesen und es ging meine idee war ja mehre mäuse auszulesen nach dem mir das ps2 zeug zu umständlich erschien und ich somit auch an platz sparen kann (noch noch der eine chip und nicht der rest der sonst drum herum dran ist.

Thomas$
13.02.2010, 13:03
hab eine lösung hinbekommen in bascom die arduino lösung kann ich bei bedarf auch reinstellen fals jemand doch ein fehler bei meinem programm findet der sagt es mir bitte auch danke
http://einbeinreicht.blogspot.com/2010/02/encoder.html

Besserwessi
13.02.2010, 13:46
Wie Schnelle man den Encoder auslesen muß hängt von der Drehzahl und Auflösung ab. Wegen Prellen und verschleiß kann es bei mechanischen Encodern ja nicht so schnell gehen. Da reicht es in der Regel aus alle 10 ms oder so ähnlich auszulesen. Das ist reichlich Zeit, auch für 10 Encoder oder mehr.

Die einfachen Lichtschraken in einer Maus können auch nur endlich schnell gehen. So bei etwa 20-50 kHz sollte Schluß sein. Da muß man sich da aber schon etwas anstrengen mehr als 2 Encoder immer schnell genug auszulesen. Wenn man natürlich nicht so schnell dreht, geht es da auch ohne problem langsamer und mit mehr kanälen.

Thomas$
13.02.2010, 13:58
ich wollte das für den OM02 nutzen das ist ein optischer maussensor der gibt das signal auch so aus wenn ich das datenblatt richtig verstanden hab.
bei meinen jetzigen versuchen hab ich eine doppelichschranke und eine encoder scheibe auf folie ausgedruckt. das ganze stellt eine lego uhr (mechanisch ;-)) die ziel position wird durch die zeit immer weiter verschoben

Besserwessi
13.02.2010, 17:03
Die Auswertung wird schon so ähnlich wie im Programm ganz oben laufen. Grob geschätzt ist die Laufzeit pro Decoder und Durchlauf etwa 100 Zyklen, eher etwas schneller. Man sollte für einen Schritt den der Decoder macht wenigstens 4 Durchläufe der decoderroutine haben.

Wenn man das ganze in eine Timer ISR legen will, sollte man aber den ganzen Code in eins haben ohne Funktionsaufruf. Die alternative wäre es die Decoderroutine nur bei einer Änderung, z.B. über den Pinchange interupt aufzurufen.

screwdriver
13.02.2010, 17:44
...Grob geschätzt ist die Laufzeit pro Decoder und Durchlauf etwa 100 Zyklen, eher etwas schneller.
Ich habs gerade im Simulator durchexerziert:
275 Takte ohne Drehung am Encoder
288 Takte für eine Rastung weiter

Dabei habe ich allerdings die Portansteuerungen und die Wartezeit (die mir in den Augen wehtut!) auskommentiert.


Man sollte für einen Schritt den der Decoder macht wenigstens 4 Durchläufe der decoderroutine haben.
Wozu? Sein Encoder prellt angeblich doch nicht und "rastet" pro Bitwechsel ein.

Mfg
screwdriver

Thomas$
13.02.2010, 18:01
es ist kein mechanishcer encoder sondern ein optischer oder in dem zu erstgedachten anwendungs fall ein chip(maussensor OM02)
vielen dank das du das durch den simulator gejagt hast bei mir macht der nur die ersten paar zeilen dann schicht im schacht.
die portansteuerung war dazu da das ich was sehe wenn sich was bewegt weil ich kein ausgabe möglichkeit habe. wiso tut dir die Portansteuerung in den augen weh? mir tut es nur weh wenn die ultrahellenleds in die augen blitzen.
darum hab ich das programm auch nochmal für den arduino geschrieben

screwdriver
13.02.2010, 18:26
es ist kein mechanishcer encoder sondern ein optischer...
Ja, ich weiß. Deshalb das "rastet" auch in Anführungszeichen. Ich wollte damit ausdrücken, das es bei jedem Weiterdrehen nur einen Bitwechsel gibt und deshalb m.E. die Routine auch nur einmal pro Weiterdrehen abgearbeitet werden muß.


vielen dank das du das durch den simulator gejagt hast bei mir macht der nur die ersten paar zeilen dann schicht im schacht.
Der Simulator läuft sich in den Wait-Befehlen zu Tode. Siehe $SIM.


wiso tut dir die Portansteuerung in den augen weh?
Nicht die Portansteuerungen tun meinen Augen weh, sondern die Wait-Befehle. Ein anständiger Code braucht die nicht, oder "prellen" deine Lichtschranken etwa doch ein wenig?

MfG
screwdriver

Thomas$
13.02.2010, 19:20
wenn die led nur ein oder auch zwei takte an ist seh ich nichts davon weil der puls zu kurz ist. es war dazu da das ich was zur ausgabe habe.
ich hatte bloß das "angeblich" etwas anders verstanden und wollt klarheit schaffen. das der simulator sich in den wait fest läuft weis ich trotzdem macht er nur die ersten 20zeilen hab vieleicht was verstellt keine ahnung

darxon69
14.04.2010, 10:01
hallo thomas$
Besorg dir einen LS7366R. Das ist quasi die Hadrwarelösung für das Problem.
Davon kannst du für jeden Encode reinen nehmen und ganz einfach und schnell per SPI auslesen. Der Vorteil ist der, daß der Baustein selbständig arbeitet und Du keine Sorgen bezüglich der Prozessorgeschwindigkeit haben musst. Damit hast Du nie wieder Sorgen.

Thomas$
14.04.2010, 14:16
ich hab es auch so hinbekommen