Quadraturencodersignal erzeugen

#815526
Lesenswert?

Zu Testzwecken benötige ich ein Quadraturencodersignal (also das mit den 
2 um 90° verschobenen Rechtecksignalen) von 1 bis 10kHz. Bislang habe 
ich das recht aufwändig mit einem AVR und Timeroverflow bei 1/4 der 
Gesamtfrequenz gelöst, die Lösung lastet aber je nach Geschwindigkeit 
den AVR voll aus und die Auflösung ist auch nicht ganz das was ich mir 
wünschen würde...
Gibt es eigene ICs die sowas erzeugen?
Gast #816066
Lesenswert?

Andere AVR-Lösung (nicht getestet, deswegen keine Garantie):

Ein Timer/Counter im Non-PWM-Mode, zwei Compare-Matches auf diesem
Timer als Toggle-on-Match konfiguriert. Die Compare-Werte werden so
festgelegt, dass sie die Hälfte des Zählermaximums auseinanderliegen.
Ab da läuft alles ohne weiteren Softwareeingriff, auch mit Frequenzen
deutlich über 10 kHz.
Gast #816626
Lesenswert?

@Lukas Slz:

> Kann man denn 2 Compare-Matches auf einen Timer machen? War mir
> nicht bekannt, wäre aber natürlich ideal...

Jeder AVR mit mehr als 8 Beinchen hat einen 16-Bit-Timer mit zwei
Output-Compares (OC1A und OC1B).


@spess53:

> Man kann natürlich auch mit Kanonen nach Spatzen schießen. Auch wenn
> es manche hier nicht wahrhaben wollen: es gibt noch Elektronik
> jenseits von AVR, ARM, DSP....

Auch ich bin ein Freund einfacher Lösungen. So gefällt mir die
Schaltung von Helmut Lenzen mit einem 7474 sehr gut. Allerdings
braucht man hier noch den Takt. Dieser soll, wenn ich Lukas richtig
verstanden habe, auch noch variabel und vielleicht sogar über einen PC
o.ä. einstellbar sein. Möglicherweise soll auch die Drehrichtung des
simulierten Encoders im Betrieb geändert werden können. Da er sowieso
schon einen AVR einsetzt, ist es doch das einfachste, diesen
weiterzuverwenden und die Software etwas zu optimieren. Als Ergebnis
hat man alle o.g. Funktionen in einem einzigen IC vereinigt, das nicht
einmal arg viel kostet.
Gast #817267
Lesenswert?

Dazu ein kleine Stück Software:
1
DDRA = 255;
2
DDRB = 127;
3

4

5
int main(void) { 
6
   while (1) {
7
      if ((PINA & (1<<PA0)) && (PINA & (1<<PA1))) 
8
         PORTB |= (1<<1);
9
      else
10
         PORTB &= ~(1<<1);
11

12
      if ((PINA & (1<<PA2)) && (PINA & (1<<PA3))) 
13
         PORTB |= (1<<2);
14
      else
15
         PORTB &= ~(1<<2);
16

17
      if ((PINA & (1<<PA4)) && (PINA & (1<<PA5))) 
18
         PORTB |= (1<<3);
19
      else
20
         PORTB &= ~(1<<3);
21

22
      if ((PINA & (1<<PA6)) && (PINA & (1<<PA7))) 
23
         PORTB |= (1<<4);
24
      else
25
         PORTB &= ~(1<<4);
26
   }
27
}

7400 war gestern :-))

Gruss
Andy

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren