![]()
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







Zitieren
Lesezeichen