bei meinem aktuellen Projekt habe ich ein kleines Problem ...
Ich nutze einen Servo. Dieser Servo wird über einen Taster gesteuert. Er soll je nachdem, welcher Taster aktiv ist, eine Stellung anfahren. Das funktioniert auch einwandfrei. Bei meiner Anwendung wäre es aber gut, wenn er kurz nach dem Erreichen, das Servo Signal nicht mehr raus gibt. Also das Servo nicht mehr unter "Last" steht. Ich habe das nun mal durch den Befehl "Enable Interrupts" versucht. Am Anfang funktioniert das auch einwandfrei. Ich schalte die Spannung ein, das Servo fährt auf die Position und der Impuls ist weg. Sobald ich das aber nun mit den Tasterabfragen in Verbindung bringe, klappt das nicht mehr. Der Servoimpuls ist immer da.
Vielleicht kann ja mal jemand von euch einen Blick drüber werfen. Hier ist das Programm:
' Servo aus Stellung 66 fahren Servo(1) = 66 ' Ampel auf Grün Rot = 1 Gruen = 0
Waitms 100 ' 100 ms warten ' Interrupts aus, damit Servo nicht unter Last Disable Interrupts
Taster_abfrage_zu: Do If Taster_auf = 0 Then 'Ist Taster_auf betätigt, wenn Ja Enable Interrupts 'schalte Interrupts ein Servo(1) = 66 ' Fahre Servo auf Stellung 66 Waitms 100 ' 100 ms warten Disable Interrupts ' Interrupts aus, damit Servo nicht unter Last Rot = 1 ' Ampel Gruen Gruen = 0 Else ' Ansonsten Goto Taster_abfrage_auf ' Gehe Zu "Taster_abfrage_auf" End If
Loop
Taster_abfrage_auf: Do If Taster_zu = 0 Then ' Ist Taster_zu betätigt, wenn Ja Enable Interrupts ' schalte Interrupts ein Servo(1) = 95 ' Fahre Servo auf Stellung 95 Waitms 100 ' 100 ms warten Disable Interrupts ' Interrupts aus, damit Servo nicht unter Last Rot = 0 ' Ampel rot Gruen = 1 Else ' Ansonsten Goto Taster_abfrage_zu ' Gehe zu Taster_abfrage_zu End If Loop
Habe es mal versucht zu kommentieren. Hoffe ihr werdet schlau daraus. Wie gesagt, ich bräuchte einfach nur das Servo Signal nach erreichen des Punktes nicht mehr. Habe auch schon versucht, es mit Stop Timer0 zu machen. Dann wacht er jedoch nicht mehr auf ...
Moin Sven, so ganz verstehe ich Dein Problem nicht. Ist das nicht so, daß wenn das Servo kein Impuls-Signal bekommt, es wieder in Grundstellung fährt? Habe ich noch nicht ausprobiert. Aber selbst wenn das funktioniert, warum soll das Servo keine Impulse mehr kriegen? Es ist ja nicht wie bei einem Schrittmotor der dauerhaft Strom zieht. Gruß, Martin
das ganze ist für eine Kiesverladung. Hier ist nun das Problem, dass mittels Servo eine Luke geschlossen wird. Ist aber nun ein kleines Steinchen dazwischen, erreicht das Servo nicht 100 %ig die Stellung, die es anfahren soll und brummt die ganze Zeit. Daher wäre es gut, wenn der Servoimpuls weg wäre.
Der Servoimpuls ist mit der Servoroutine immer da. Das kannst du ganz einfach testen: Wenn du das Servo im eingeschalteten Zustand bewegen kannst, ist der Impuls weg. "Wehrt" sich das Servo und möchte in der Stellung bleiben, ist der Impuls da. Das ist mit der normalen Bascom Routine immer der Fall. Da die Routine den Timer0 benutzt, war meine Idee, diesen so lange auszuschalten, bis er wieder gebraucht wird. Das funktioniert aber leider nicht so, wie ich das gerne hätte.
Das Problem an der Sache ist, das der µC ja nicht weis WANN die Servoposition erreicht wird. Von daher beruht das gesamte Konzept der Interruptgesteuerten Servoroutinen darauf stets und ständig das gewählte PWM Signal am dafür vorgesehenen Port auszugeben und das Servo anzusteuern.
Das ganze hat sogar noch einen zweiten Nachteil nämlich das Servozittern. Will sagen, wenn man die Ausgabe des Servoimpulses nicht unterbricht, dann wird das Servo vermutlich sogar zappeln, obwohl es in seiner Endstellung ist.
Nun gut, das begrenzt du indem du dem Servo eine bestimmmte Zeit zugestehst in der es in die Stellung fahren soll. (Enable, Disable Interrupt + Waitms) und das scheint mir auch die beste Lösung zu sein.
Ich würde einfach mal die Zeit messen die es von A nach B braucht und diese Zeit, plus ein klitzekleinesbischen, als Wert einsetzen. Anders bekommt man es ohne Mehraufwand wohl kaum hin.
Alternativen wären: Erfassung der Servo-Endpositionen durch Sensoren oder Strommessung (oder Spannungsmessung) des Servomotors um blockieren zu erfassen oder Anfahren der Position solange man eine Taste betätigt.
Davon mal ganz abgesehen finde ich den gesamten Aufbau des Programms etwas "ulkig", aber das nur am Rande...liegt vielleicht daran das es noch in der Konzeptphase ist.
Enable / Disable interrupt + Waitms. Jedoch funktioniert es so nicht. Bei ersten Anfahren der Servoposition funktioniert das:
' Servo aus Stellung 66 fahren Servo(1) = 66 ' Ampel auf Grün Rot = 1 Gruen = 0
Waitms 100 ' 100 ms warten ' Interrupts aus, damit Servo nicht unter Last Disable Interrupts
Danach jedoch nicht mehr. Das Servo bekommt dann nach wie vor einen Impuls.
Was den Aufbau des Programms angeht: Ich denke du kannst 20 verschiedene Leute nehmen und jeder macht es anders. Das höre und lese ich immer wieder - auch bei anderen. Ich denke mal wenn ich mir ein Programm von dir anschauen, wird es mir wahrscheinlich genauso gehen ...
Du meinst hier sicher "disable". Ohne es jetzt getestet zu haben, sollte dies eigentlich das Signal schon abschalten. Häng doch mal eine LED an den Servo-Ausgang. Dann siehst Du ob tatsächlich noch was rauskommt.
Aber warum baust Du die mechanische Ansteuerung der Luke nicht so, daß es dem Servo nichts ausmacht, wenn die Luke nicht ganz zu geht. Vielleicht mit einer Feder. Hier mal der erste Treffer von Google der zeigt wie ich meine:
Gruß Gerhard
------------------------------------------------------------------------------------------- hier mein aktueller TinyKatalog
schalte doch einfach die Stromversorgung des Servos per Transistor aus. Dann kann es Dir egal sein ob noch ein Signal rauskommt oder was das Servo ohne Signal anstellt.
Gruß Gerhard
------------------------------------------------------------------------------------------- hier mein aktueller TinyKatalog
Hallo Gerhard, das könnte je nach Servo aber auch wieder ein Problem darstellen. Ich habe ein Servo, der dreht sich wenn er eingeschaltet wird kurz ein wenig nach rechts und links.. Dann würde der Schieber vielleicht ein wenig geöffnet werden.
die Idee betrachte ich mal als Notlösung, wenn ich es gar nicht hin bekomme. Mich würde nur mal interessieren, warum das so nicht klappt. Was mich persönlich wundert, ist dass es bei Start des Programmes ja funktioniert. Sobald die Tasterabfrage eingebunden ist, funktioniert es nicht mehr.
So, nachdem ich nun nochmal zig Versuch gemacht habe, die leider alle ohne Erfolg waren, wollte ich nun die Lösung von Gerhard versuchen - mit einem Transistor die Spannung abschalten. Aber auch hier gibt's wieder ein Problem. Ich habe keinen Pin mehr frei. Außer PB5 ( Reset Pin ). Den wollte ich nicht unbedingt benutzen...
Es kann doch nicht sein, dass man das Servosignal nicht per Software einfach ausschalten kann.