-         

Ergebnis 1 bis 4 von 4

Thema: Ultraschallsensor & Servos - Messfehler

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    17.05.2005
    Ort
    Buxtehude
    Alter
    30
    Beiträge
    14

    Ultraschallsensor & Servos - Messfehler

    Anzeige

    Hallo,

    ich verwende den SRF05 und 2 Servos an einem ATMEGA8 (mit 8Mhz internem Quarz). Ausserdem ist ein 16*2 LCD-Display angeschlossen, plus 3 Schalter.

    Im Prinzip läuft mein Programm, das ich verwenden möchte, jedoch habe ich das Problem, dass die Messwerte des US-Sensors halbiert werden, sobald ich die Servos initialisiere.

    Die Servos werden so initialisiert (funktionieren auch!)
    Code:
    Config Servos = 2 , Servo1 = Portb.1 , Servo2 = Portb.0 , Reload = 10
    Config Pinb.1 = Output
    Config Pinb.0 = Output
    Die US-Sensor-Steuerung läuft so:
    Code:
    Config Pinb.5 = Output
    
    Portb.5 = 0                                             'Port Low
    Pulseout Portb , 5 , 40                                 'Min. 10uS Impuls senden
    Pulsein Zeitmessung , Pinb , 5 , 1
    Zeitmessung = Zeitmessung * 10                          'mal 10 da Pulsein in 10uS Einheiten Ergebnis ermittelt
    Entfernung = Zeitmessung / 58                           'Umrechnen in Zentimeter
    Waitms 100
    Unabhängig voneinander funktioniert beides bestens. Doch zusammen spuckt der US-Sensor immer nur die halbe Entfernung aus.

    Ich schätze, es hängt mit den Timern und dem "Reload" des Servos zusammen. Leider kenne ich mich dafür noch nicht gut genug aus. Ich habe das jetzt so gelöst, dass ich für umrechnen in cm halt durch 29 teile. Das funktioniert zwar, ist ja aber eigentlich unschön. Außerdem würde ich gerne verstehen, warum dieser Fehler auftritt.

    LG,
    David

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.791
    Außerdem würde ich gerne verstehen, warum dieser Fehler auftritt.
    Es wäre möglich, dass der Timer0 (der für die Servo-ISR) die Pulsein-Messung stört.

    Probier mal, vor jeder Messung des US-Sensors Disable Timer0 und danach wieder Enable Timer0.

    Gruß Dirk

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    10.06.2006
    Ort
    Duisburg-Rheinhausen
    Alter
    71
    Beiträge
    80
    Hallo hier mal ein denkanstoß,dieses Programm ist noch nicht fertig,
    und noch nicht dokomentiert,da ich nicht glaube das es im endefekt so bleibt.
    Bin selber erst in Roboter steuerung eingestiegen.
    Print deshalb weil ein Atmega 8 die Motorsteuerung macht.
    Ich hoffe das es Dir hilft.
    Gruß raggy
    Code:
    $regfile = "M32DEF.DAT"
    
    $baud = 19200
    
    $hwstack = 288
    
    $swstack = 288
    
    $framesize = 288
    
    $crystal = 16000000                                         '7372800                                          ' it is neceserry to use an external crystal with excectly these frequency
    
    
    
    $lib "S108_KL.lbx"
    
    
    
    Config Graphlcd = 128 * 64sed , Dataport = Portc , Controlport = Portb , Ce = 0 , Ce2 = 1 , Cd = 4 , Rd = 3 , Reset = 2 , Enable = 5
    
    Cls
    
    Wait 2
    
    Setfont Font8x8
    
    Wait 1
    
    Lcdat 1 , 25 , "BALOU II"
    
    
    
    Config Servos = 1 , Servo1 = Portd.7 , Reload = 10
    
    
    
    
    
    
    
    Config Adc = Single , Prescaler = Auto , Reference = Avcc
    
    'Start Adc
    
     Enable Interrupts
    
     Servo(1) = 80
    
    Config Portd.7 = Output
    
    Config Portd.2 = Output
    
    
    
    
    
    Declare Sub Servo_ultra()
    
    Declare Sub Messen()
    
    
    
    
    
    
    
    Dim I As Byte
    
    Dim Mitte As Word
    
    Dim H_links As Word
    
    Dim H_rechts As Word
    
    Dim Links As Word
    
    Dim Rechts As Word
    
    Dim Zeitmessung As Word
    
    Dim Entfernung As Word
    
    
    
    Dim Befehl As String * 6
    
    
    
    
    
    Portd.2 = 0
    
    Portd.7 = 0
    
    Wait 2
    
    
    
    Servo(1) = 120
    
    
    
    Wait 15
    
    
    
    Do
    
      Call Servo_ultra()
    
    
    
    
    
    Loop
    
    '*******************************************************************************
    
    '*******************************************************************************
    
    Sub Servo_ultra()
    
        For I = 80 To 160
    
         Servo(1) = I
    
         If I = 80 Then Call Messen()
    
         If I = 100 Then Call Messen()
    
         If I = 120 Then Call Messen()
    
         If I = 140 Then Call Messen()
    
         If I = 160 Then Call Messen()
    
         Waitms 8
    
         Next I
    
            For I = 160 To 80 Step -1
    
         Servo(1) = I
    
         If I = 100 Then Call Messen()
    
         If I = 120 Then Call Messen()
    
         If I = 140 Then Call Messen()
    
         Waitms 8
    
         Next I
    
    End Sub
    
    '*******************************************************************************
    
    Sub Messen()
    
          Pulseout Portd , 2 , 40
    
          Pulsein Zeitmessung , Pind , 2 , 1
    
          Zeitmessung = Zeitmessung * 10                        'mal 10 da Pulsein in 10uS
    
          'Einheiten Ergebnis Ermittelt
    
          Entfernung = Zeitmessung / 58
    
    '-------------------------------------------------------------------------------
    
          If I = 80 Or I = 100 And Entfernung < 18 Then Print "M_Rech";
    
    
    
          If I = 120 And Entfernung > 25 Then Print "M_Grad";
    
          If I = 120 And Entfernung > 40 Then Print "M_Schn";
    
          If I = 120 And Entfernung > 30 Then Print "M_Mite";
    
    
    
          If I = 140 Or I = 160 And Entfernung < 18 Then Print "M_Link";
    
    
    
          If Entfernung < 10 Then Print "M_Ruec";
    
    '-------------------------------------------------------------------------------
    
       End Sub
    
    '*******************************************************************************
    
    $include "font8x8.font"

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    10.06.2006
    Ort
    Duisburg-Rheinhausen
    Alter
    71
    Beiträge
    80
    Hallo hier noch ein zusatz zum obigen Programm,das übrigens bei mir Funktioniert.
    Das Waitms 8 ist damit das servo mit geringer Lautstaerke laeuft.
    Hier noch was fuer die 5 Euro Servo von C.
    Code:
     Sub Servo_ultra()
        For I = 70 To 150
         Servo(1) = I
         If I = 70 Then Call Messen()
         If I = 90 Then Call Messen()
         If I = 110 Then Call Messen()
         If I = 130 Then Call Messen()
         If I = 150 Then Call Messen()
         Waitms 8
         Next I
            For I = 150 To 70 Step -1
         Servo(1) = I
         If I = 90 Then Call Messen()
         If I = 110 Then Call Messen()
         If I = 130 Then Call Messen()
         Waitms 8
         Next I
    End Sub
    Oben ist bei 120 die Mitte und hier 110 die Mitte.

    nochwas ich würde nicht ohne not den Internen Quarz nehmen er ist nicht genau und bei Temperatur schwankungen steigert es sich.
    Gruß raggy

Berechtigungen

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