Hallo, Ich möchte aus einem 16MHz Sinus einen Rechteck erzeugen. Was für Schmitt-Trigger gibt es für diese Frequenz? Oder wie würded ihr das Problem lösen? MFG lisa
Wie ist denn der Pegel des Sinus ? Außerdem wie soll das Tastverhältniss aussehen ? Andere Frage wäre das nicht ne 1A Verwendungsmöglichkeit für nen Quarzoszilator ? Oder hat das Signal irgendwelche Informationen die behalten werden müssen ? Gruß ErgoProxy
Hallo, Ich habe einen Drehgeber (s. Anhang). Ich bin seit geraumer Zeit dran für meinen Drehgeber eine Routine zu schreiben mit welcher ich die Drehrichtung bestimmen kann. Doch ich habe einfach keinen Erfolg. Der Drehgeber besitzt zwei Ausgangssignale, wobei das erste Signal ausgelöst wird sobald die Optik auf der inkrementscheibe von schwarz auf weiss oder weiss auf schwarz wechselt, das zweite signal folgt dem ersten mit 90° Phasenverschiebung. Mit diese Informationen muss es "anscheinend" möglich sein die Richtung zu bestimmen. Zuerst probierte ich die einfachste copy /paste von peter dannegger:
1 | #include <avr/io.h> |
2 | #include <avr/interrupt.h> |
3 | |
4 | #define XTAL 16e6 // 16MHz
|
5 | |
6 | #define PHASE_A (PINA & 1<<PB1)
|
7 | #define PHASE_B (PINA & 1<<PB3)
|
8 | |
9 | #define LEDS_DDR DDRC
|
10 | #define LEDS PORTC // LEDs against VCC
|
11 | |
12 | |
13 | int8_t enc_delta; // -128 ... 127 |
14 | |
15 | |
16 | void encode_init( void ) |
17 | {
|
18 | TCNT0 = 5; //Set Timer/counter |
19 | TCCR0 = 1<<WGM01^0<<CS01^1<<CS00; // CTC, XTAL / 1024 |
20 | TIFR |= (1<<TOV0); //interrupt starts with each overflow |
21 | TIMSK |= (1<<TOIE0); //Enable Timer/counter0 overflow interrupt |
22 | }
|
23 | |
24 | ISR( TIMER0_COMP_vect ) // 1ms for manual movement |
25 | {
|
26 | static int8_t last; |
27 | int8_t new, diff; |
28 | |
29 | new = 0; |
30 | if( PHASE_A ) |
31 | new = 3; |
32 | if( PHASE_B ) |
33 | new ^= 1; // convert gray to binary |
34 | diff = last - new; // difference last - new |
35 | if( diff & 1 ){ // bit 0 = value (1) |
36 | last = new; // store new as next last |
37 | enc_delta += (diff & 2) - 1; // bit 1 = direction (+/-) |
38 | }
|
39 | }
|
40 | |
41 | |
42 | int8_t encode_read1( void ) // read single step encoders |
43 | {
|
44 | int8_t val; |
45 | |
46 | cli(); |
47 | val = enc_delta; |
48 | enc_delta = 0; |
49 | sei(); |
50 | return val; // counts since last call |
51 | }
|
52 | |
53 | int main( void ) |
54 | {
|
55 | int32_t val = 0; |
56 | |
57 | LEDS_DDR = 0xFF; |
58 | encode_init(); |
59 | sei(); |
60 | |
61 | for(;;){ |
62 | val += encode_read1(); // read a single step encoder |
63 | LEDS = val; |
64 | }
|
65 | }
|
Ich bemerkte aber schon bald das sich dieses Verfahren bei leichtem hin und herbewegen des Drehgebers nicht bewährt. Ich habe nun schon unzählige Möglichkeiten probiert und theoretisch aufgezeichnet doch funktioiern tut alles nicht. Also habe ich mir dann gedacht die Signale zu prüfen um die Drehrichtung und Phasenlage der GeberSignal herauszufinden. leider kriege ich am Oszi. nur sinusformige signal deswegen frage ich dann wie ich diese Sinus signale in der Rechteckförmigen Gebersignal umformen kann. Weiss jemand wie man die Signale auswerten muss (Wahrheitstabelle), dass die Richtung immer und ohne Zweifel bestimmt werden kann? Vielen Dank lisa
> ISR( TIMER0_COMP_vect ) // 1ms for manual movement
1 ms Abtastintervall ist für einen Drehgeber, der 1000 Impulse pro
Umdrehung macht, deutlich zu langsam...
Da du Peter Dannegger zitierst, gehe ich davon aus, dass du http://www.mikrocontroller.net/articles/Drehgeber gelesen hast. Ist dem so?
Vilen Dank für die schnelle Anworten >Da du Peter Dannegger zitierst, gehe ich davon aus, dass du >http://www.mikrocontroller.net/articles/Drehgeber gelesen hast. Ist dem >so? ja und sogar mehr mals und genau das verstehe ich nicht so ganz gut was er damit meint?! >Die Abtastfrequenz muss so hoch sein, dass bei maximaler Drehzahl zwischen >zwei Codewechseln mindestens 1 Abtastung erfolgt, besser jedoch mehr. @Lothar Miller >1 ms Abtastintervall ist für einen Drehgeber, der 1000 Impulse pro >Umdrehung macht, deutlich zu langsam... und wenn 1 ms zu lagsam für meinem Fall ist, will es damit sagen dass ich anstatt timer INT0 und INT1 benutzen muss gruß lisa
@lisa das Problem mit der Anpassung habe ich auch bei einem Heidenhain LinearScale. Wie ich das Signal in ein TTL Signal wandle, weiss ich auch noch nicht. Hab das Teil erst seit 2 Stunden :-) Wegen deiner Drehgeberauswertung: Ich habe an meiner Maschine einen Drehgeber mit 1024 Strichen und der dreht max. 2840 U/min. Für eine auswertung nach P. Danegger ist das zu schnell. Der bringt bei max. Geschwindigkeit einen Signalabstand von 0,02 ms. Wenn du die Drehrichtung nicht brauchst, dann Zähle die Striche über eine Periode oder du findest etwas, was schnell genug ist. Gruß Christian
> Wie ich das Signal in ein TTL Signal wandle, weiss ich auch noch nicht.
Linear Scale mit Drehzahl? Eher ein Drehgeber. Ein ROD wenn er von HH
ist.
Man kann natürlich die analoge Information wegwerfen. Einfach durch
einen Komparator schicken.
Zähler für Quadratur-Encoderausgänge gibts wimre bei IC-Haus. Die lassen
sich über einen serielle Bus ansprechen und werten auch den Index aus.
Gehen bis paar MHz.
Nick
>Mit diese Informationen muss es "anscheinend" möglich sein die Richtung >zu bestimmen. "Anscheinend" würde die Möglichkeit ausschließen, dass es möglich ist damit die Richtung zu bestimmen. Richtig wäre "scheinbar" gewesen. Grund hierfür: Bei 90° Phasenverschiebung ist es möglich die Drehrichtung zu bestimmen. Die Signale sehen ja so aus: Signal1: 000011110000111100001111 Signal2: 110000111100001111000011 Und jetzt einfach mal durch gehen, es macht einen eindeutigen Unterschied ob man von links nach rechts geht oder von rechts nach links ;).
Wenn du Komparatoren gefunden hast die die Frequenz mitmachen schickst du die beiden Rechteck-Signale durch ein D-Flip-Flop. Ein Signal am Eingang das andre als Clock.Und schon zeigt dir der Ausgang des Flip-Flop die Richtung an
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.