Hi, mein erster Beitrag hier. Vorwegnehmen möchte ich, dass ich die Sufu schon (erfolglos) genutzt habe. Ich möchte aus CLK/DIR-Signalen wie sie üblicherweise für Schrittmotoranwendungen verwendet werden, ein Signal (bzw. eine Signalspur) erzeugen, wie es von Inkrementalgebern "verursacht" wird. Also zwei Rechtecksignale mit 90° Phasenversatz. Das Ganze möchte ich am liebsten mit einem AVR (Tiny, Mega....) erzeugen, Software am besten unter Bascom (erste Gehversuche erfolgreich abgeschlossen). Wie bekomme ich das softwaremäßig hin, dass bei DIR-Signal low, das Ausgangssignal B um 90° versetzt zu Ausgangsel A kommt? Bzw. bei DIR-Signal high, Ausgangssignal A um 90° versetzt zu Ausgangsel B kommt? Das Ganze soll von 0 Hz bis ca. 50 kHz laufen. Gibt es dort schon Lösungsansätze? Gruß Christoph
>en unter Bascom (erst
Oh mein Gott..
Ich würde das wohl so lösen:
(pseudo-c-code)
1 | const uint8_t tabelle[4] = { 0b00000000, 0b10000000, 0b11000000, 0b01000000 }; |
2 | ...
|
3 | // ISR INT0 zB als CLK eingang.
|
4 | ISR ( welche denn) |
5 | {
|
6 | static uint8_t variable = 0x00; |
7 | if ( Pin_dir == 1 ) // dir-pin auf high? |
8 | {
|
9 | variable++; |
10 | }
|
11 | else
|
12 | {
|
13 | variable--; |
14 | }
|
15 | variable &= 0x03; |
16 | PORT_irgendeiner = tabelle [ variable ]; |
17 | }
|
Die Ausgabe von A/B-Spur erfolgt hier auf den höchsten beiden Portpins des Ports_irgendeiner.
"unter Bascom (erst Oh mein Gott.." Bascom sollte dafür eigentlich reichen, zumal ich bei C durch die ganzen Klammern etc. ein wenig verwirrt werde. ;-) Mir geht es nicht darum, eine vorgekaute Lösung zu bekommen, sondern einen Ansatz zur Lösung. Natürlich kann ich bei einem CLK-Signal per ISR erst den einen Ausgang toggeln und mit XX µs Verzögerung den zweiten Ausgang hinterherschieben. Bei anliegendem DIR-Signal nur in anderer Reihenfolge (A-B/ B-A). Ich weiß nur nicht, wie genau dieser 90° Phasenversatz sein muß. Ist der normalerweise nur da, weil es durch die Hardware kommt (Glasrasterscheibe im Inkrementalgeber), oder muß das zweite Signal wirklich um 1/4 der Signaldauer des ersten Signals verzögert kommen? Bei 10 Hz und 50% Tastverhältnis des Rechtecksignals wäre es eine Verzögerung von 12,5 ms, bei 10 kHz nur noch 12,5 µs. Ferner die Frage, ob eine kleiner Atmel, z.B. Tiny 13, das leisten kann. "Für bascom fragen biste hier im falschem Forum." Ist das hier nicht der allgemeine Bereich? Gruß Christoph
Soll ich meinen VOrschlag wieder löschen? Zumal dort noch was fehlt.. ;-)
Löschen gilt nicht ;-) Ich deute den "Vorschlag" so, dass du eine Tabelle erzeugst, in der die 4 verschiedenen Zustände der zwei Ausgänge abgelegt sind. in dieser Tabelle springst du vor/ zurück in Abhängigkeit des DIR-Signals und weist den Ausgängen den Inhalt der Tabelle zu. Soweit so gut. 2. Frage: Kann das ein Attiny 13 bei 50 kHz leisten? Gruß Christoph
@ Christoph (Gast) >2. Frage: >Kann das ein Attiny 13 bei 50 kHz leisten? In Assembler sicherlich. C wirds auch tun. BASCOM? Kaum. (Bestenfalls Inline Assembler). MFG Falk
"Ich weiß nur nicht, wie genau dieser 90° Phasenversatz sein muß. Ist der normalerweise nur da, weil es durch die Hardware kommt (Glasrasterscheibe im Inkrementalgeber), oder muß das zweite Signal wirklich um 1/4 der Signaldauer des ersten Signals verzögert kommen?" Das hängt wohl vor allem davon ab, was Du für eine Auswerteschaltung dran hast. Bei denen, die ich mal gebaut habe, wäre das egal, die Signale werden mit dem internen Clk abgetastet, solange die Signale noch so weit auseinander sind, dass die beim Eintakten mit dem internen Clk noch auseinanderzuhalten sind (also mindestens einen Takt dazwischen) sollte das egal sein. Gruss Axel
>Zumal dort noch was fehlt..
Beachtet das! Eine Sache ist bei meinem VOrschlag noch nicht (ganz)
berücksichtigt.
Christoph wrote: > Natürlich kann ich bei einem CLK-Signal per ISR erst den einen Ausgang > toggeln und mit XX µs Verzögerung den zweiten Ausgang hinterherschieben. > Bei anliegendem DIR-Signal nur in anderer Reihenfolge (A-B/ B-A). Ein CLK muss nur EINE Aenderung von A ODER B bewirken (abhaengig von dem Signal DIR). Also nix mit nach XX us was hinterherschieben. > Ich weiß nur nicht, wie genau dieser 90° Phasenversatz sein muß. der kommt implizit zustande. Cheers, Roger
> Ferner die Frage, ob eine kleiner Atmel, z.B. Tiny 13, > das leisten kann. Ja. > Das Ganze soll von 0 Hz bis ca. 50 kHz laufen. > Bascom sollte dafür eigentlich reichen Nein (zu lahm).
Unbekannter wrote: >> Das Ganze soll von 0 Hz bis ca. 50 kHz laufen. >> Bascom sollte dafür eigentlich reichen > > Nein (zu lahm). Bei 9,6MHz sind das 192 Zyklen, sollte sogar Bascom schaffen Allerdings nicht als Interrupt, sondern mit Polling. Dann entfällt die elend lange PUSH/POP-Arie (Interruptbit löschen durch Bit setzen beachten). Peter
> "Für bascom fragen biste hier im falschem Forum." > Ist das hier nicht der allgemeine Bereich? http://www.bascom-forum.de
Besten Dank an alle, ich habe vorerst genug Input zum Testen und Probieren. Von der "Auswerteschaltung" weiß ich nur, dass 500 kHz die maximale Eingangsfrequenz ist. Ich werde mal berichten, ob und wie ich das Ziel erreicht habe. Gruß
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.