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
Lesezeichen