Hallo,
ich habe mal wieder ein Problem.
Mein erster Roboter macht soweit ganz gute Vortschritte. Er basiert auf der RN-Control 1.4
bisher funktioniert soweit alles bis auf die Drehzahlmessung bzw. daraus resultierende Drehzahlregelung.
Programmierung tu ich mit BASCOM.
Irgendwie bekomm ich keine Drehzahl raus. Im Fahrgestell sind direkt am Motor Drehgeber angebracht die ein Rechtecksignal rausgeben sollten.
Die Drehgeber habe ich Testweise auch mal an nen Oszi drangehalten. Dort geben sie ein Signal raus. Allerdings ist es bei dem einen Drehgeber kein genaues Rechtecksignal
hier mal der Screenshot:
Aber dennoch müsste doch zumindestens die eine Drehzahlerfassung funktionieren oder?
Irgendwas scheint also im Code etwas nicht zu stimmen.
Hier mal der Code als Ausschnitt:
Hoffe jemand kann mir helfen.Code:....... 'Interrupt für Inkrementalgeber 'Inkrementalgeber 1 an Port D2 Rechts Config Pind.2 = Input Portd.2 = 1 'PullUp ein 'Der Interrupt INT0 wird ausgelöst wenn der Pin PD2 gegen GND gezogen wird. 'Also beim Übergang von HIGH nach LOW. Der Interrupt wird nicht ausgelöst, wenn 'der Pin bereits gegen GND zieht. Config Int0 = Falling 'fallende Flanke Low Level 'Wenn der Interrupt INT0 auftritt, dann springe zum Label On_int0 On Int0 Irq0 'Int0 Einschalten Enable Int0 '********************************* 'Inkrementalgeber 2 an Port D3 Links Config Pind.3 = Input Portd.3 = 1 'PullUp ein 'Der Interrupt INT1 wird ausgelöst wenn der Pin PD3 gegen GND gezogen wird. 'Also beim Übergang von HIGH nach LOW. Der Interrupt wird nicht ausgelöst, wenn 'der Pin bereits gegen GND zieht. Config Int1 = Falling 'fallende Flanke Low Level 'Wenn der Interrupt INT0 auftritt, dann springe zum Label On_int0 On Int1 Irq1 'Int1 Einschalten Enable Int1 Config Timer2 = Timer , Prescale = 1024 'Für Geschwindigkeitsmessung On Timer2 Timer_irq2 Enable Timer2 'Interrupts global einschalten. Das ist der Hauptschalter für alle Interrupts Enable Interrupts ............ Sub Inkrementgeberabfrage() 'Drehzahl der Räder ermitteln. Umdrehungen pro sekunde 'Prüfen welche Zeit abgelaufen ist, Prüfen wie viel Impulse am Rad entstanden sind. Berechnen der Drehzahl Rad hat 8 Impulse pro Umdrehung 'Bei 8Bit Timer, 16Mhz und einem Prescaler von 1024 hätte man nach einer Sekunde Timerdurchlauf=61,035 Interrups Local Hilfsvariable As Word 'Formel: Umdrehungen [s^-1] = (Zählerirq/8) * (61,0352/Timerdurchlauf) Hilfsvariable = Zaehlerirql / 8 Hilfsvariable = Hilfsvariable * Timerdurchlauf Drehzahllinks = Hilfsvariable / 61.0352 Hilfsvariable = Zaehlerirqr / 8 Hilfsvariable = Hilfsvariable * Timerdurchlauf Drehzahlrechts = Hilfsvariable / 61.0352 Print "Drehzahl Links [1/s]: " ; Drehzahllinks ; " Drehzahl Rechts [1/s]: " ; Drehzahlrechts Zaehlerirqr = 0 Zaehlerirql = 0 Timerdurchlauf = 0 End Sub ............ 'Interrupt und Timer Routinen: '************************************************* ************************************************** ***************************** 'Interrupt Int0 Unterprogramm. Wird gestertt wenn Signal an Int0 anliegt Irq0: Incr Zaehlerirqr Return Irq1: Incr Zaehlerirql Return 'Timer 2 Timer_irq2: Incr Timerdurchlauf Return
Danke schonmal.
Ach hab auch mal das komplette Programm beigefügt.
Edit: hier mal nen kurzes Video:








Zitieren


Lesezeichen