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

Thema: Abstandsmessung ähnlich wie IR-Schnittstelle des asuro

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    29.05.2005
    Beiträge
    1.018
    Hallo oberallgeier,
    gerade wollte ich auf deinen ersten Beitrag antworten.
    Nun macht es aber Sinn eher auf den aktuellen zu antworten.

    1) Deine Auswertung, vor allem die mit dem Übersprechen auch mit Schrumpfschlauch, ist sehr hilfreich. Nun, da auch noch die Rückseite abgeschottet ist, scheint von der Seite nun kein Problem mehr zu kommen. Man muss es nur mal von dir vorgemacht bekommen.

    2) Die Unterschiede zwischen Tageslicht / Kunstlicht / .. und bei unterschiedlichen Reflektoreigenschaften wurde hier ja schon vorausgesagt. Dies habe ich auch schon 'empirisch' selber nachvollziehen können/müssen. Da müsste man mal versuchen, ob man auch hier durch eine Dunkle-/Hellmessung eine Differenz ermitteln kann, an der man die Umgebungshelligkeit abschätzen kann.

    3) So schlimm sieht deine Programmierkunst nun doch nicht aus. Bis auf ein paar winzig Kleinigkeiten ist das doch bestens.
    In Cäh schreibt man i = i + 1; In C kann man das mit i++; abkürzen.
    Das geht auch am Ende einer for (xxx; yyyy; n++)-Klammer.
    In C kannst du i -= 6; schreiben, wenn du i = i - 6; meinst.
    Das geht schon mal mit allen +-*/ - Zeichen: x *= 3; <=> x = x * 3;

    4) Nun aber ein Problem in meinem Kopf:
    Deine Konstruktion zum warten auf n Pulse will mir nicht so recht einleuchten. Ist sauber in C geschrieben, ich meine den Sinn dieser Warterei.
    Du wartest mit der Schleife doch auf ein n-faches Pulsen vom Empfängersignal. Dieses Signal aber ist, so wie ich es sehe, schon vom SFH5110 am Ausgang geliefert worden. ****Hier kann mein Denkfehler sein, dass du am PINB1 nicht den Ausgang, sondern etwas anders misst****
    Wenn der SFH5110 aber dein Datenlieferant ist, dann benötigst du an dieser Stelle keine Pulse mehr. So wie ich das Datenblatt interpretiere, hat sich da nämlich schon der Baustein drum gekümmert.
    Als Datenblatt habe ich immer gerne die Infineon-Datenblätter, da die häufig Deutsch- und Englischsprachig sind. (Ist für mich zum üben der Deutschen äh ne, der englischen Sprache perfekt.)
    Hier mal das Dingsda: SFH5110.pdf
    Unten im Bild habe ich den Ausschnitt zum Thema 6 Pulse rausgeholt.

    Ich bin mir sicher, dass die Pulse nicht von der Software bearbeitet werden müssen.
    Hier wird meiner Meinung nach nur mitgeteilt, dass die Bit-Länge eine gewisse Anzahl von Pulsen aufweisen muss. Und somit ergibt sich daraus die maximale Datenübertragungsrate.
    Min. 6 Pulse bei 36 kHz für ein Bit sind dann irgendwelche ms oder us. Und das ist dann eben die Obergrenze der Bitgeschwindigkeit.

    Ich hoffe, dass ich daneben liege, und du nicht gefrustest bist.
    Auf alle Fälle hänge ich hier deine Programmstücke aber mal so dran, wie ich sie schreiben würde. Evl. hilft das beim Übergang von Cäh nach C.

    Code:
    /* ======================================================================== */
    /* ==  PWM-Routinen zur IRLED-ansteuerung auf OC1A/PB1    ================= */
    
    
    /*----------------------------------------------------------------------------
      Init Timer/Counter 1, PWM-Signal für Servo hin-her
      normale PWM aktivieren (nicht invertiert)
    ----------------------------------------------------------------------------*/
            void      TC1SRV_init (
            void)
    {
      TCCR1A |= (1<<COM1A1);              // Clear/set OC1A on Compare Match, doc S132.
                                          // also Port PB3, vgl. auch PWM-routine unten
      TCCR1B |= (1<<CS10);                // cs10 <=> clk/1 => no prescaling  doc S 134
      TCCR1B |= (1<<WGM13);               // PWM, Phase+Frequency correct     doc S 134
      ICR1    = 270;                      // =>PWM-Frequenz 20MHz/(2*nn) => 37,0kHz
      TIMSK1 &= ~(1<<OCIE1A)|(1<<OCIE1B); // Tmr/Cntr1 Oput CompA/B Mtch intrrpt disab
      TIMSK1 &= ~(1<<TOIE1);              // Tmr/Cntr1 Overflow interrupt disabled
    }
    
    
    
    /*----------------------------------------------------------------------------
      Relative Pulslaenge auf OC1A/PB1
    ----------------------------------------------------------------------------*/
            void      setSRV1 (
            uint16_t  speed1)
    {
      OCR1A = speed1;                     //  z.B. für SFH5110 oder Servo
    }
    
    
    
    /*----------------------------------------------------------------------------
      Relative Distanz Messung, Rückgabewert = Wert der PWM-Ansteuerung
    ----------------------------------------------------------------------------*/
            int       ReDiM (
            void)
    {
            uint8_t   mpwm  = 0;          // mpwm ist der jeweis aktuelle "PWM-
                                          // Stellwert" bzw. endgueltiger Messwert
            uint8_t   tmp  = 0;           // temporaerer Wert
            uint8_t   n;
    
    
      tmp   = PINB;                       // Test, ob ein Signal anliegt
      mpwm  = 1;                          // Sicherheitshalber PWM ganz klein
      setSRV1 (mpwm);                     // Ansteuerung der PWM auf
    
      /*
        Es wird die LED auf n Pulse geprueft. Warten, bis irLED dunkler/heller wird.
        Im Datenblatt des SFH5110 sind sechs Pulse je burst als Minimum gewuenscht.
        Bei 36 kHz dann ca. 6*26 µs bis zum naechsten Test
      */
      for (n = 1; n <= 6; n++)            // Warte n Pulse der irLED ab
      {                                   
        while (! (PINB & (1<<PINB1)))     // Bit 1 (0..7) geloescht? <==> irLED aus
          ;
        while (PINB & (1<<PINB1))         // Bit 1 (0..7) gesetzt?   <==> irLED an
          ;
      }
    
      for (mpwm = 128; mpwm >= 2; mpwm--)
      {
        if (mpwm > 6)
          mpwm -= 1;
        if (mpwm > 20)
          mpwm -= 2;
        if (mpwm > 40)
          mpwm -= 6;
    
        setSRV1 (mpwm);                   // PWM fuer irLED ansteuern
    
        for (n = 1; n <= 7; n++)          // Warte n Pulse der irLED ab
        {                                 
          while (! (PINB & (1<<PINB1)))   // Bit 1 (0..7) geloescht? <==> irLED aus
            ;
          while (PINB & (1<<PINB1))       // Bit 1 (0..7) gesetzt?   <==> irLED an
            ;
        }
    
        tmp = PINB;                       // Der Empfaenger muesste jetzt korrekt schalten
        if (tmp & 0x08)                   // Bit 4 gesetzt? Input high? Freistrahl?
          break;                          // Bit ist high = frei, PWM verstellen
      }
      return mpwm;
    }
    
    
    
    /* ======================================================================== */
    
    
    /* ======================================================================== */
    // Aufruf, z.B. aus main mit
         
        mecho  = ReDiM();
    
    /* ======================================================================== */
    Gruß Sternthaler
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken ir-puls-signal.jpg  
    Lieber Asuro programieren als arbeiten gehen.

Berechtigungen

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

Labornetzteil AliExpress