- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 4 von 4

Thema: CNY70 mit Operationsverstärker sinnig?

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Benutzer Stammmitglied
    Registriert seit
    24.11.2008
    Ort
    Freiburg
    Alter
    31
    Beiträge
    49

    CNY70 mit Operationsverstärker sinnig?

    Hallo,

    ich bin gerade dabei meinen ersten Roboter zu bauen.
    Dieser soll einmal einer Linie folgen und vielleicht auch Hindernisseverfolgen können (gleichzeitig!?).

    Damit die Linie gut verfolgt werden kann und damit er auch scharfe Kurven registriert wollte ich ca 6-8 CNY70 dafür verwenden. Da ich noch anfänger bin und die AD wandlung per Software nicht verstehe habe ich überlegt einen Operationsverstärker zu verwenden wie es auf der seite http://www.kreatives-chaos.com/artik...nsor-mit-cny70
    vorgestelt wird.

    Meine Frage ist nun ob das bei mehreren CNY70 überhaupt geht bzw. ob es sinn ergibt und wie er sich dann verhalten würde wenn er in einen Tunnel fährt.

  2. #2
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Man könnte auch mehrere der CNY70 mit je einem OP (als Komperator) anschließen. Besonders sinnvoll ist das allerdings schon bei einem Kanal nicht. Für einen Kanal haben die µC fast immern einen Komperator intern, den könnte man einfacher nehmen. Die Digitale auswertung kann man bei den Atmel AVRs auch direkt an den IO Pins ohne extra OP machen. Man muß dann nur den Widerstand passend wählen.
    Sonst ist die Auswertung per AD Wandler in der Regel besser, man kriegt mehr Information und könnte mit weniger Sensoren auskommen. Es ist vermultich einfacher sich in die Programmierung des AD Wandlers einzulesen als 8 Operationsverstärker zu verkabeln.

    Für den Anfang würde ich 4 Sensoren für die Line und die Auswertung per AD-wandler vorschlagen. 2 für das direkte folgen der linie und 2 fürs erkennen von scharfen kurven.

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    24.11.2008
    Ort
    Freiburg
    Alter
    31
    Beiträge
    49
    Ok dann werde ich mir nun wohl noch ein weiteres mal das AD wandler kapitel im GCC Tutorial durchlesen müssen

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    24.11.2008
    Ort
    Freiburg
    Alter
    31
    Beiträge
    49
    Also ich habe mir jetzt ca. 10 mal ein ADC Tutorial durchgelesen und glaube ich habe es verstanden (wenn ja dann ist das ja gar nicht soo schwer )

    Code:
    uint16_t ReadChannel(uint8_t mux)
    {
      uint8_t i;
      uint16_t result;
     
      ADMUX = mux;                      // Kanal waehlen
      ADMUX |= (1<<REFS1) | (1<<REFS0); // interne Referenzspannung nutzen
     
      ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0);    // Frequenzvorteiler 
                                   // setzen auf 8 (1) und ADC aktivieren (1)
     
      /* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man liest
         also einen Wert und verwirft diesen, um den ADC "warmlaufen zu lassen" */
      ADCSRA |= (1<<ADSC);              // eine ADC-Wandlung 
      while ( ADCSRA & (1<<ADSC) ) {
         ;     // auf Abschluss der Konvertierung warten 
      }
      result = ADCW;  // ADCW muss einmal gelesen werden,
                      // sonst wird Ergebnis der nächsten Wandlung
                      // nicht übernommen.
     
      /* Eigentliche Messung - Mittelwert aus 4 aufeinanderfolgenden Wandlungen */
      result = 0; 
      for( i=0; i<4; i++ )
      {
        ADCSRA |= (1<<ADSC);            // eine Wandlung "single conversion"
        while ( ADCSRA & (1<<ADSC) ) {
          ;   // auf Abschluss der Konvertierung warten
        }
        result += ADCW;		    // Wandlungsergebnisse aufaddieren
      }
      ADCSRA &= ~(1<<ADEN);             // ADC deaktivieren (2)
     
      result /= 4;                     // Summe durch vier teilen = arithm. Mittelwert
     
      return result;
    }
     
    ...
     
    /* Beispielaufrufe: */
     
    void foo(void)
    {
      uint16_t adcval;
     
      adcval = ReadChannel(0); /* MUX-Bits auf 0b0000 -> Channel 0 */
      ...
      adcval = ReadChannel(2); /* MUX-Bits auf 0b0010 -> Channel 2 */
      ...
    }

    So in etwa könnte das dann auch in mein Programm eingebaut werden um die werte der Liniensensoren auszulesen .
    Statt ReadChannel würde ich die Funktion z.B. Linie nennen
    und die Werte von Linie(0) Linie(1) Linie(2) Linie(3) messen und verarbeiten (Reglung...)

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test