- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 10 von 13

Thema: ADC Sharp Ir Problem

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter Genie Avatar von BMS
    Registriert seit
    21.06.2006
    Ort
    TT,KA
    Alter
    34
    Beiträge
    1.192
    Kannst du die "Rohwerte" vom AD-Wandler irgendwie ausgeben?
    Also z.B. über Display anzeigen oder über serielle Schnittstelle an PC übertragen?
    Wenn du die Sensoren aussteckst, liegen die Analogeingänge in der Luft,
    der kann dann irgendwelche Werte ausgeben.
    Aber die LED an sich lässt sich ein- und ausschalten?
    Also z.B. per Programm blinken lassen geht?

    Ansonsten: Bist du dir sicher, dass deine Konstanten passen?
    Grüße, Bernhard

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    27.09.2009
    Alter
    30
    Beiträge
    661
    Also das UART hat schon ne schnittstelle aber die software ist noch nicht fertig
    die LED kann ich ein und ausschalten
    Und die Sensoren sind dann komplett abgetrennt
    Und die Konstanten stimmen ich habe mal via multimeter nach gerechnet und es würde stimmen.
    MfG Martinius

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    27.09.2009
    Alter
    30
    Beiträge
    661
    Hat den niemand eine idee was verkehrt sein könnt?
    MfG Martinius

  4. #4
    Erfahrener Benutzer Roboter Genie Avatar von BMS
    Registriert seit
    21.06.2006
    Ort
    TT,KA
    Alter
    34
    Beiträge
    1.192
    Wie gesagt, schau mal, dass du irgendwie die Werte angezeigt kriegst. UART geht relativ zügig.
    Auf dem PC braucht man dann nur ein Terminal und sieht alles was der AVR geschickt hat.
    Sonst ist das nicht nachvollziehbar was da genau läuft, da fischt man zu lange im Trüben.
    Notfalls die LED blinken lassen und die Blinkfrequenz abhängig vom gemessenen Abstand machen.
    Dann sieht man überhaupt mal, ob sich die Werte auch ändern.
    Die Analogeingänge an sich funktionieren, oder?
    Schon mal etwas anderes angeschlossen als einen Sharp-Sensor?
    Grüße, Bernhard

  5. #5
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.698
    ... dass du irgendwie die Werte angezeigt ...
    In ähnlichen Fällen, aber GENAU bei meinen ersten Sharp-Distanzsensor-Erfahrungen, hatte ich nen Servo als "Zeigerinstrument" vom Sharp aus gesteuert. Wenn ich ne 8-Bit-Wandlung nehme, kann ich den Servo ziemlich easy direkt bedienen. Ich messe allerdings nicht selten mit dem DMM oder Oskar nach, ob die analoge Ausgabe des Sharps glaubhaft ist . . . .
    Ciao sagt der JoeamBerg

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    27.09.2009
    Alter
    30
    Beiträge
    661
    Ich bekomme das UART einfach nicht zum laufen hier ist mal der Code:

    Code:
      /*
      * SMARTINIUS.c
      *
      * Created: 26.07.2011 00:17:22
      *  Author: Martinius
      */ 
     #define F_CPU 16000000
    #define BAUD 9600UL      // Baudrate
    #define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
    #define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
    #define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
     
    #if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
      #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch! 
    #endif 
    
     #include <avr/io.h>
     #include <util/delay.h>
     #include <avr/interrupt.h> 
      char s[7];
     const int FWD = 1; // Definition der Richtungswerte
    const int STOP = 0;
    const int BWD = 2;
    const int ON = 1; //andere Werte
    const int OFF = 0;
    const int Left = 2;
    const int Right = 1;
    const int Enable = 1;
    const int Disable = 0;
    const int Reset = 2;
    const float A = 11.925;
    const float BL = 0.660;
    const float BR = 0.610;
    const float ADCconst = 00.04883;
     
     void Setup(void){ // Stellt den Controller für das nachfolgende Programm ein
                         // muss immer als erstes aufgerufen werden.
      UBRRH = UBRR_VAL >> 8;
      UBRRL = UBRR_VAL & 0xFF;
     
      UCSRB |= (1<<TXEN);  // UART TX einschalten
      UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);  // Asynchron 8N1 
    
     DDRC |= (1<<PC7); // Status LED
     DDRB |= (1<<PB0); // IR_Eable
     DDRA &= ~(1<<PA0); // IR_Left
     DDRA &= ~(1<<PA1); // IR_Right
     ADMUX |= (1<<REFS0);//Reverrenzspannungsquelle des ADC wird festgelegt
     ADCSRA = (1<<ADPS1) | (1<<ADPS2);     // Frequenzvorteiler
     ADCSRA |= (1<<ADEN);                  // ADC aktivieren
     ADCSRA |= (1<<ADSC);                  // eine ADC-Wandlung
     while (ADCSRA & (1<<ADSC) ) {}        // auf Abschluss der Konvertierung warten 
     }
     
     void Status_LED(uint8_t Status){
     if(Status == 1){
     PORTC |= (1<<PC7);
     }
     if(Status == 0){
     PORTC &= ~(1<<PC7);
     }
     }
    int uart_putc(unsigned char c)
    {
        while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich */
        {
        }                             
     
        UDR = c;                      /* sende Zeichen */
        return 0;
    }
    void uart_puts (char *s)
    {
        while (*s)
        {   /* so lange *s != '\0' also ungleich dem "String-Endezeichen(Terminator)" */
            uart_putc(*s);
            s++;
        }
    }
     uint16_t get_Ir_Distance (uint8_t Dir){ // Distance in mm
     if(Dir==1){//Right
       float x;
       ADMUX = (ADMUX & ~(0x1F)) | (1 & 0x1F);
       ADCSRA |= (1<<ADSC);            // eine Wandlung "single conversion"
       while (ADCSRA & (1<<ADSC) ) {}  // auf Abschluss der Konvertierung warten
       x = ADCW;
       x = x*ADCconst;
       x = x-BL;
       x = A/x;
       x = x*10
      uart_puts( itoa( x, s, 10 ) );
       return x;                    // ADC auslesen und zurückgeben
     }
     
     if(Dir==2){//Left
       float x;
       ADMUX = (ADMUX & ~(0x1F)) | (0 & 0x1F);
       ADCSRA |= (1<<ADSC);            // eine Wandlung "single conversion"
       while (ADCSRA & (1<<ADSC) ) {}  // auf Abschluss der Konvertierung warten
       x = ADCW;
       x = x*ADCconst;
       x = x-BL;
       x = A/x;
       x = x*10;
      uart_puts( itoa( x, s, 10 ) );
       return x;
       
     }
    return 0;
     }
     void Ir_Enable(uint8_t Status){
     if (Status == 1){
     PORTB |= (1<<PB0);
     }
     if(Status == 0){
     PORTB &= ~(1<<PB0);
     }
     }
     int main(void)
     {
     Setup();
     
     Ir_Enable(ON);
     
         while(1){
         drive_ahead();
         if(get_Ir_Distance(Right)<2000){
         Status_LED(ON);
         }
         if(get_Ir_Distance(Left)< 2000){
         Status_LED(ON);
         }
         }
     }
    MfG Martinius

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    27.09.2009
    Alter
    30
    Beiträge
    661
    Ich habe das Problem gefunden da ich den Sensor immer erst eingeschaltet habe beim reset gab es immer einen sehr kleine spannungs einbruch den
    das Programm nätürlich sofort erkant hat.
    MfG Martinius

Ähnliche Themen

  1. Problem mit Sharp Sensor 2Y0A02
    Von juergen009 im Forum Sensoren / Sensorik
    Antworten: 5
    Letzter Beitrag: 01.10.2010, 13:26
  2. IR Sensor SHARP GP1U52 40KHz Problem!
    Von Oliver Preußger im Forum Sensoren / Sensorik
    Antworten: 2
    Letzter Beitrag: 27.02.2006, 22:40
  3. Unterschied SHARP GP2D12 zu SHARP GP2Y0A21YK
    Von java-robotik im Forum Sensoren / Sensorik
    Antworten: 2
    Letzter Beitrag: 25.02.2006, 09:30
  4. Problem mit Sharp Sensor GP2d120
    Von patti16 im Forum Elektronik
    Antworten: 5
    Letzter Beitrag: 12.02.2006, 17:51
  5. Unterschied zwischen SHARP GP2D12 und SHARP GP2Y0A21YK
    Von Foooob im Forum Sensoren / Sensorik
    Antworten: 11
    Letzter Beitrag: 15.05.2005, 20:43

Berechtigungen

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

Labornetzteil AliExpress