Forum: Mikrocontroller und Digitale Elektronik Inkrementalgebersignal erzeugen mit AVR


von Christoph (Gast)


Lesenswert?

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

von Matthias L. (Gast)


Lesenswert?

>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.

von bascom-looser (Gast)


Lesenswert?

Für bascom fragen biste hier im falschem Forum.

von Christoph (Gast)


Lesenswert?

"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

von Matthias L. (Gast)


Lesenswert?

Soll ich meinen VOrschlag wieder löschen?
Zumal dort noch was fehlt..

;-)

von Christoph (Gast)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?

@ 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

von Axel (Gast)


Lesenswert?

"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

von Matthias L. (Gast)


Lesenswert?

>Zumal dort noch was fehlt..

Beachtet das! Eine Sache ist bei meinem VOrschlag noch nicht (ganz) 
berücksichtigt.

von Roger S. (edge)


Lesenswert?

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

von Unbekannter (Gast)


Lesenswert?

> 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).

von Peter D. (peda)


Lesenswert?

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

von bascomer (Gast)


Lesenswert?

> "Für bascom fragen biste hier im falschem Forum."
> Ist das hier nicht der allgemeine Bereich?

http://www.bascom-forum.de

von Christoph (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.