www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik rechteck signal aus sinus


Autor: lisa (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Andreas K. (ergoproxy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: gast (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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:
#include <avr/io.h>
#include <avr/interrupt.h>

#define  XTAL    16e6      // 16MHz

#define PHASE_A    (PINA & 1<<PB1)
#define PHASE_B    (PINA & 1<<PB3)

#define LEDS_DDR  DDRC
#define  LEDS    PORTC      // LEDs against VCC


int8_t enc_delta;        // -128 ... 127


void encode_init( void )
{
  TCNT0 = 5;          //Set Timer/counter
  TCCR0 = 1<<WGM01^0<<CS01^1<<CS00;    // CTC, XTAL / 1024
  TIFR |= (1<<TOV0);    //interrupt starts with each overflow  
  TIMSK |= (1<<TOIE0);    //Enable Timer/counter0 overflow interrupt
}

ISR( TIMER0_COMP_vect )        // 1ms for manual movement
{
  static int8_t last;
  int8_t new, diff;

  new = 0;
  if( PHASE_A )
    new = 3;
  if( PHASE_B )
    new ^= 1;          // convert gray to binary
  diff = last - new;        // difference last - new
  if( diff & 1 ){        // bit 0 = value (1)
    last = new;          // store new as next last
    enc_delta += (diff & 2) - 1;    // bit 1 = direction (+/-)
  }
}


int8_t encode_read1( void )      // read single step encoders
{
  int8_t val;

  cli();
  val = enc_delta;
  enc_delta = 0;
  sei();
  return val;          // counts since last call
}

int main( void )
{
  int32_t val = 0;

  LEDS_DDR = 0xFF;
  encode_init();
  sei();

  for(;;){
    val += encode_read1();      // read a single step encoder
    LEDS = val;
  }
}


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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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...

Autor: Soeren A. (abraxa)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da du Peter Dannegger zitierst, gehe ich davon aus, dass du 
http://www.mikrocontroller.net/articles/Drehgeber gelesen hast. Ist dem 
so?

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Christian Berndt (chrisbe3)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@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

Autor: Nick Müller (muellernick)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>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 
;).

Autor: Martin Sche (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.