-
        

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 16

Thema: Gp1a038 Rncontrol Rnkeylcd

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    03.12.2007
    Beiträge
    19

    Gp1a038 Rncontrol Rnkeylcd

    Anzeige


    Hallo

    Ich möchte hier noch einmal das Thema Gabellichtschranke mit Codescheibe aufgreifen und die Probleme die ich damit habe. Weiter unten ist das Programm ( Musterprogramm geändert für I2C Bus zur Anzeige auf RNkeylcd), die Schaltung und der Aufbau abgebildet.
    Ich nutze folgende Hardware..

    RNControl 1.4 + Rnkeylcd + GP1A038RBK ( Conrad 185377) + Codescheibe 120 Striche.(robotikhardware.de)
    - die gelieferte Gabellichtschranke von robotikhardware.de habe ich beim experimentieren durchgeschossen, deshalb die von Conrad, die Probleme waren aber dieselben.

    Der Motor dreht bei ca. 60 Umdrehungen pro Minuten. Die angezeigten Werte schwanken von 55 bis 67 von absoluten Ausreißern mal abgesehen. Wenn ich die Motorwelle leicht anhebe ( ca. 1 mm) steigen die Werte ( 100 -150), drückt ich die Welle nach unten sinken die Werte ( 5 – 20). Bei Erschütterungen oder Lageänderungen Schwanken die Werte. Bei abdunkeln des Sensors steigen die Werte meißt. Wenn ich die Codescheibe entferne und eine Checkkarte durchschiebe werden Werte von 1 bis 3 angezeigt. Manchmal auch beim rausziehen. Wenn ich PortD.2 kurz auf Masse lege werden Werte bis 800 „IMPUSE PRO SECUNDE „ angezeigt und beim öffnen wieder.

    Nur noch mal zur Funktion, damit ich nicht auf dem Holzweg bin.
    Beispiel:
    Codescheibe dreht--> schwarzer Stich dunkelt erste Fotodiode ab --> VoA geht auf Low --> Interrupt Int0 wird ausgelößt --> schwarzer Stich verlässt erste Fotodiode --> VoA geht auf high --> nächster schwarzer Stich dunkelt erste Fotodiode ab --> VoA geht auf low --> Interrupt Int0 wird ausgelößt ……usw. oder hat die zweite Fotodiode in dieser Beschaltung auch noch eine Funktion.

    Bleibt nur noch die Frage, was kann die Messergebnisse verbessern ?

    - Codescheibe genauer ausrichten
    - Vorwiderstand Leuchdiode ändern
    - anderes Meßprinzip nutzen

    Andreas

    Code:
    '##########################################################################
    'Drehzahlabfrage1.BAS
    '
    'Test  19.06.08
    '##########################################################################`
    
    ' ---------------  RN-Control Anweisungen   -------------------
    
    $regfile = "m32def.dat"
    $hwstack = 128
    $framesize = 128
    $swstack = 128
    $crystal = 16000000       'Quarzfrequenz
    $baud = 9600
    
    ' ---------------  RN-Control Hardwareconfiguration  ----------
    Config Scl = Portc.0       'Ports fuer IIC-Bus
    Config Sda = Portc.1
    
    Config Int0 = Falling       ' Interupt0 für fallend Flanke def.
    Config Timer1 = Timer , Prescale = 256       ' Vorteiler vom Timer1 wird auf 256 gestellt
    
    ' ---------------------  Variablendeklaration  ----------------
    
    Dim Impulseprominute As Long
    Dim Impulseprosekunde As Integer
    Dim K As Integer
    Dim Le As Byte
    Dim Rnkeylcd_befehl As String * 4
    Dim Text As String * 80
    Dim Umdrehungenprominute As Integer
    Dim Zaehlerirq0 As Integer
    
    ' ---------------------  Konstantendeklarationn  --------------
    
    Const Markierungenproscheibe = 120       'Scheibe für GP1A038 hat 120 Markierungen
    Const Rnkeylcd_slaveid_write = &H40       'I2C SlaveAdresse
    Const Rnkeylcd_slaveid_read = &H41
    Const Timervorgabe = 3036       'Timervoreinstellung um bei Vorteiler 256 und Takt 16 MHz
    
    'Config Pind.2 = Input       'Für Tastenabfrage
    Portd.2 = 1       'Pullup Widerstand ein
    
    
    ' -------------------- I2cbus init ----------------------------
    
    Wait 1       'Warte bis LCD bereit
    I2cinit       'I2C bus init
    
    ' ---------------------- Routinendeklaration ------------------
    
    Declare Sub Rnkeylcd_cursorpos(byval Spalte As Byte , Byval Zeile As Byte)
    Declare Sub Rnkeylcd_lcd_ausgabe()
    Declare Sub Rnkeylcd_lcd_licht_ein_aus()
    Declare Sub Rnkeylcd_scanmodus(byval Ein As Byte)       'Tastenscanmodus ein und ausschalten
    Declare Function Rnkeylcd_getscan() As Word
    
    
    ' ---------------------- Hauptprogramm ------------------------
    
    Zaehlerirq0 = 0       'Zähler für Striche auf der Codescheibe auf 0
    On Int0 Irq0       ' bei INTO Routine Irg0 aufrufen
    Enable Int0       'Interupt INT0 einschalten
    
    On Timer1 Timer_irq       ' wenn Timer1 interrupt auslöst Routine Timer_irq aufrufen
    Enable Timer1       'Timer1 ein
    
    Enable Interrupts       ' alle Interrupts einschalten
    
     Do
       Text = "    "
       Rnkeylcd_cursorpos 16 , 1
       Rnkeylcd_lcd_ausgabe       ' Anzeige Löschen
       Rnkeylcd_cursorpos 16 , 2
       Rnkeylcd_lcd_ausgabe       ' Anzeige Löschen
       Text = "Impulse Sek: " + Str(impulseprosekunde)
       Rnkeylcd_cursorpos 4 , 1
       Rnkeylcd_lcd_ausgabe
       Impulseprominute = Impulseprosekunde * 60
       Umdrehungenprominute = Impulseprominute / Markierungenproscheibe
       Text = "Umdreh. Min: " + Str(umdrehungenprominute)
       Rnkeylcd_cursorpos 4 , 2
       Rnkeylcd_lcd_ausgabe
    
       For K = 0 To 30
         Waitms 30
       Next K
     Loop
    
    End
    
    ' ----------------------------------------------------------------------------
    
    Sub Rnkeylcd_lcd_ausgabe()
      Le = Len(text)
      I2csend Rnkeylcd_slaveid_write , Text , Le
    End Sub
    
    Sub Rnkeylcd_cursorpos(byval Spalte As Byte , Byval Zeile As Bit Byte)       ' Cursor auf Pos
      Rnkeylcd_befehl = Chr(27) + Chr(79) + Chr(spalte) + Chr(zeile)
      I2csend Rnkeylcd_slaveid_write , Rnkeylcd_befehl , 4
    End Sub
    
    ' ---------------------- Interruptroutinen -------------------------------
    
    Irq0:       'Pro Impuls (Markierung auf Scheibe) ein Aufruf
     Incr Zaehlerirq0
    Return
    
    Timer_irq:       'Pro Sekunde ein Aufruf
      Timer1 = Timervorgabe
      Impulseprosekunde = Zaehlerirq0
      Zaehlerirq0 = 0
    Return
    
    'programmlänge 1728 dec
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken motor_u_gp1a038.jpg   gp1a038rkb_schaltung_.jpg  

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    03.12.2007
    Beiträge
    19
    Sorry, die Zeichnung ist falsch bezeichnet es muß heißen" GP1A038RBK".

    Andreas

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    03.12.2007
    Beiträge
    19

    Ausrichtun GP1a038

    So das zuim Thema Ausrichten

    Die Werte sind wesentlich stabiler. Bei ca. 60 Umdrehungen pro Minute schwankt der Wert zwischen 107 und 109. Das Maß Z hat auch noch einen Einfluß, ich habe es schon einmal irgenwo gelesen, aber wo. Das Hauptproblem aber bleibt 109 sind keine 60 Umdrehungen.
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken ausrichtung_gp1a038.jpg  

  4. #4
    Erfahrener Benutzer Roboter Genie Avatar von Michael
    Registriert seit
    17.01.2004
    Ort
    Karlstadt
    Alter
    48
    Beiträge
    1.254
    Hallo asunn,

    Das Hauptproblem aber bleibt 109 sind keine 60 Umdrehungen.
    was erwartest du von einem Getriebemotor? Ein Wert von 109 entspricht 54,5 Umdrehungen pro Minute.
    Du schreibst ja selbst:
    Der Motor dreht bei ca. 60 Umdrehungen pro Minuten.
    Gruß, Michael

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    03.12.2007
    Beiträge
    19
    Hallo,

    der Abstand der Codescheibe von dem Gabelstück in dem sich die Fotodioden befinden soll bei Gp1A030 0,3 mm betragen. Ich habe 1 Minute die die Umdrehungen gezählt = 55, Abstand zum Gabelstück auf fast Null eingestellt. Die Angezeigt Drehzahl war 80 Umfrehungen pro Minute, schwanken. Meßfehler 45%. [-X

    Die Rechnung von Michael kann ich nicht nachvollziehen.

    Andreas

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    07.07.2006
    Ort
    Mannheim
    Beiträge
    454
    Wenn Port D2 auf gnd gelegt ist und du 800 Impulse "misst", dann muss etwas an deinem Programm faul sein. Da solltest du anfangen.

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    03.12.2007
    Beiträge
    19
    Hallo

    Ich habe gelesen das Interupt's wären des Wait Befehls nicht ausgeführt werden, sondern danach nachgeholt werden.

    a) stimmt das ?
    b) wie kann ich aufgelaufene Interupt's löschen ?

    Irq0: 'Pro Impuls (Markierung auf Scheibe) ein Aufruf
    Disable Int0
    Incr Zaehlerirq0
    Waitmms 10
    Aufgelaufene Interup's löschen
    Enable Int0
    Return

    Soll ich Versuch sein um den Fehler einzugrenzen, für ein genaues Meßergebnis ist es sich nicht hilfreich.

    Andreas

  8. #8
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    35
    Beiträge
    1.987
    Mit Interrups während Wait hab ich auch schon öfter Probleme gehabt. Scheint, als würde das wirklich nicht gehen

    Zum Löschen müsstest du das Request-Flag löschen; also das Bit im Register, in dem der INT0 seinen Request reinpackt.
    Müsste mit "GIFR = GIFR OR 64" machbar sein (Bit 6 von GIFR setzen um das Flag zu löschen)
    #ifndef MfG
    #define MfG

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    03.12.2007
    Beiträge
    19
    Danke Jaecko

    nach dem einfügen von,

    Irq0: 'Pro Impuls (Markierung auf Scheibe) ein Aufruf
    Disable Int0
    Incr Zaehlerirq0
    Waitms 4
    GIFR = GIFR OR 64
    Enable Int0
    Return

    stimmt die Drehzahl, sie schwankt auch weniger. Aber bei höheren Drehzahl gehen sicher Impuls verloren. Das ganze deutet für mich darauf hin, das mehr als ein Impulse pro Strich vom Sensor mit dieser Codescheibe erzeugt werden. Einen Ossi zum Messen habe leider nicht.
    In der Doku von Sharp steht für den Sensor GP1A038RBK eine Stichweite von 1,7 mm (Gap Width : 1.7mm). Wenn ich die Codescheibe bei 24 mm Druchmesser abtaste ergibt eine Strichweite von 24 x 3,14 : 120 : 2 =0,3 mm. Kann das einer erklären ?

    Andreas

  10. #10
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    35
    Beiträge
    1.987
    Achja weil ichs grad noch seh: Was macht der Wait-Befehl in der ISR? Macht man normalerweise nicht...

    Und Nachtrag 2: Wenn die ISR in ihrer Ursprungsform nur aus dem INCR-Befehl besteht, kannst du mal versuchen, die Deklaration (CONFIG INT0....) mit "NOSAVE" zu ergänzen; damit wird Zeit gespart, da die Register nicht gesichert werden. Kann (muss aber nicht) nen Geschwindigkeitsvorteil bringen => mehr erfasste Pulse
    #ifndef MfG
    #define MfG

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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