PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Gp1a038 Rncontrol Rnkeylcd



asunn
19.06.2008, 17:24
8-[
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



'################################################# #########################
'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

asunn
19.06.2008, 17:34
Sorry, die Zeichnung ist falsch bezeichnet es muß heißen" GP1A038RBK".

Andreas

asunn
19.06.2008, 19:41
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.

Michael
19.06.2008, 20:12
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

asunn
19.06.2008, 21:13
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

JonnyP
20.06.2008, 08:10
Wenn Port D2 auf gnd gelegt ist und du 800 Impulse "misst", dann muss etwas an deinem Programm faul sein. Da solltest du anfangen.

asunn
20.06.2008, 10:09
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

Jaecko
20.06.2008, 10:17
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)

asunn
20.06.2008, 10:55
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

Jaecko
20.06.2008, 10:59
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

asunn
20.06.2008, 12:01
Hallo

Das mit Wait ist nur mal ein Test, um falsche Interupt's auszublenden. Die Zeit ist erstmal unkritisch. Mir geht es darum die Anzahl der Umrehung genau zu bestimmen, um später Positionierungen vornehmen zu können. Aber wenn die Meßung schon nicht klappt. Naja
Ich werde jetzt doch noch einmal den Vorwiderstand der Leuchtdiode ändern.

Andreas

asunn
20.06.2008, 16:25
Da bin ich wieder !

Wichtig! Die Codescheibe war beim probieren verrutscht, sie muß genau ausgerichtet sein, sonst wird nur Müll angezeigt.

Nun zum Thema Vorwiderstand. Ich habe bei 2 Solldrehzahlen und unterschiedlichen Positionen der Codescheibe gemessen.


Solldr....580 Ohm ..........680 Ohm .........820 Ohm...........990 Ohm
U/min... POS 1.....POS 2.POS 1...POS 2..POS 1...POS 2....POS 1...POS 2
57..........57..........61...... 51.........57........30........56........21....... ..51

97...............................................9 7...................95

Die besten Werten habe ich mit 680 Ohm Vorwiderstand in POS 2 erreicht.
Nach dem Kaffee trinken war die Drehzahl bei gleicher Motorspannung aber schon wieder 2 U/min höher. Läuft der Motor länger steigt die Drehzahl auch um 2 dis 3 Umdrehungen. Das kann ich mir ja vielleich noch erklären, da der Motor wärmer wird und die mech. Widerstand ev. geringer werden. Ich denke als nächste Schritt ist eine andere Codescheibe angesagt.

Hat eigentlich schon einer was zu den 1,7 mm Strichbreite herrausgefunden s.o.

Andreas

asunn
24.06.2008, 21:28
Hallo,

ich habe nochmal 2 Fragen.

1. Wenn keine Codescheibe in Sensor steckt, muß VOA und VOB auf High liegen? Bei mir ist VOB auf Low. Ich denke den Kanal werde ich wieder abgeraucht haben?

2. Kann mir jemand sagen wie die Fotodioden ( PD1.. PD4 )im Sensor angeordnet sind? Das wäre wichtig, um bei der Fehlersuche die Funktion nachvollziehen zu können.

Andreas

asunn
25.06.2008, 21:26
Das Zum Thema GP1A ! 8-[

Das Ding hat ganz schön genervt und ich werde mich nach einem andern Sensor umsehen. Das Grundproblem bleibt, daß ständig mehr Impulse gezählt werden, als eigentlich auftreten dürften.
Für die Geschwindigkeitsmessung und Drehrichtungsauswertung mit groben Ansprüchen ist er wohl brauchbar, besonders wenn über die Software Ausreißerwerte eliminiert werden oder Mittelwerte gebildet werden. Um Positionierungen durchzuführen denke ich nicht. Beim Einsatz kommt es besonders auf die genaue Ausrichtung der Codescheibe und den Wert des Vorwiderstandes der Fotodiode an.
Für alle die, die den Sensor einsetzen wollen, die Codescheibe selber bauen braucht man nicht. Das einzige was klappen könnte, währe Overheadfolie plus Laserdrucker, daß habe ich noch nicht probiert. Unten im Bild S1 - S5 sind die Versuche zu sehen. ( nicht Lachen )

S1 Folienverpackung ca. 0,3 mm 2x mit Papiercodescheibe dazwischen
S2 Quarkdeckel ohne Striche - über 100 Impulse pro Sec
S3 Innenteil einer CD, erst sehr gut am nächsten Tag hatte sie plötzlich
Risse ( Materialspannung von der Bearbeitung)
S4 Overheadfolie 0,1 mm ohne Strich 0 Impulse
S5 Overheadfolie 0,1 mm mit 1mm Strich und ca. 0,30 Strich
1mm Strich 1 - 2 Impulse pro Sensordurchlauf, 0,30 Strich 5 - 8
Impulse pro Sensordurchlauf

Ganz unten ist noch ein Excelprogramm angefügt. Mit dem habe ich versucht die Funktion des Sensors, bei in Reihe angeordneten Fotodioden nachzubilden. Es sind 2 Makros enthalten mit denen man die Codescheibe bewegen kann (STRG + y, STRG + x). Bei 0000011111 können Fehlstellen eingebaut werden. Die Schaltzustände werden unter VOB, VOA angezeigt. Auch andere Teilungen sollten leicht machbar sein.

Ach übrigens, meine Frage von oben nach den Schaltzuständen bei leeren Sensor hat sich geklärt. Die 10 kOhm Widerstände aus dem Schaltbild sind scheinbar nicht vorhanden. Nach der Außenbeschaltung funktionierte alles.

Tschüß Andreas

mare_crisium
26.06.2008, 12:43
Asunn,

ich mache meine Gray-Scheiben aus photobeschichtetem Pertinax und lese sie mit 2 CNY70 aus. Geht sehr gut. Pertinax ist für IR-Licht durchsichtig; deshalb könnte so eine Scheibe auch mit Deiner Gabellichtschranke funktionieren.

Das Foto zeigt die fertig belichtete und geätzte Scheibe nach dem Heraustrennen aus der Platine. Die M3-Schraube dient beim Heraustrennen als Welle; das Werkzeug ist ein Schleifer (Durchmesser ca. 5mm) meiner Proxxon. Auf die zentrale Kupferfläche liesse sich sehr leicht eine Achsbuchse auflöten.

Ciao,

mare_crisium

asunn
26.06.2008, 19:48
Hallo mare_crisium,

die Scheibe sieht wirklich gut aus.

Ich habe inzwischen einen Gp1A23 angeschloßen. Mit Scheibe S6 die gleichen Probleme, war zu erwarten. Dann habe ich einfach in einen schwarzen Papstreifen mal 5 Schlitze geschnitten und per Hand durch den Sensorgezogen. Fast ! immer 5. Ich muß wohl noch mal auf den Rat von JonnyP zurückkommen und mir das Programm noch mal ansehen.
Ein's habe ich schon gesehen. Wenn es in der Do .. LOOP Schleife zu einem Timer 1 Interrupt kommt kann es zu Fehlberechnungen kommen.

Frage: Was passiert, wenn während der I2C Routine ( Übertragung an RNkeylcd ) ein Interrupt auftritt.

Andreas