Ich baue gerade ein Mikroprocessor gesteurtes kreizlauf womit ich 6 servos steurn kann. Alles funktioniert im princip.... wo der Processor (PIC16F874) alle Servos mit ein PCM signal füttert.
1 ms = links
1.5 ms = mitte
2 ms = retchs
Leider har der Processor so viel so tun dass der 80 ms braucht um die neuen pulsen senden zu kõnnen. Dies ist zu lange für die Futaba 3002 Servos, denn bei jeder bewegung zittern die 2 sekunden lang. Habe dass original PCM signal gemessen und dies kommt mit 18 ms wiederholung.
Ist es mõglich dass es andere servoes gibt (digital-servo) die gut funktionieren wõrde mit 80 ms wiederholungs takt?
Der 16F874 kann doch 200ns cycle, das sollte einklich schnell genug sein. Der OP muß da irgendwas langsames machen, das kann nicht die Generierung der PWM sein. Notfalls sollte man halt die Berechnung neuer Werte von der Ausgabe der PWM entkoppeln.
Bernd, Interruptroutinen und Echtzeitfähigkeit liebend
Es gibt zumindest Digitalservos, die sich so einstellen lassen, daß sie bei Ausfall des Pulses die Position halten. Sowas bräuchtest Du dann. Ich vermute, daß das die Standardeinstellung der meisten Digitalservos ist und eine Failsafe-Position nur bei programmierbaren Servos angesteuert wird. Am besten testen.
Die Frage wird sein, wie komplex seine software ist. Moderne PC-Prozessoren haben 3,oGHz und mehr, trotzdem sind pcs heute langsamer als mein C-64 damals ... ;-) (ab hier bricht jetzt bestimmt ein OT-Sturm der Entrüstung los ob meines Äpfel und Birnen-Vergleiches ;-))
"Martin Schoenbeck" skrev i en meddelelse news: snipped-for-privacy@Schoenbeck.de...
Hi Martin
Ich habe immer gedaht dass dieser failsafe i empfãnger ist und nicht im servo. Muss ich ausprobieren denn Preis spielt keine rolle, es soll nur funktionieren.
Ich benutze keine interrupt routinen, denn der processor braucht die lange zeit um 6 mahl eine A/D konvertierung zu machen und da liegt das problem, den ich MUSS ja einfach jedes mahl erneut die analogen eingãnge lãsen. Der processor braucht auch ein bissen zeit um ein par floating point berechnungen zu machen. PWM ist nicht mõglich denn dann brauchte ich 6 stuck PWM generatoren.
"Normale" Servos, also auch Digitalservos, werden aber über ein PWM-Signal angesteuert. PCM bzw. PPM wird _nur_ als Übertragung zwischen Sender und Empfänger benutzt.
Also _ich_ würde das Programm folgendermaßen strukturieren (in fiktivem C):
#include #define MAX_CHANNEL 6
static volatile int channel[MAX_CHANNEL]; static volatile act;
Halten zwischen zwei Pulsen tun die eigentlich alle. Das ist ja gerade der Vorteil von Digitalservos. Die Frage ist nur, was sie tun, wenn sie überdurchschnittlich lange keine neuen Pulse bekommen. Ich vermute einfach mal, daß die meisten stumpf weiter halten. Was sollen sie sonst sinnvoll machen?
Das gleiche, was die analogen tun ;-) Spaß beiseite: Der eingehende Sollwert ist analog (PWM-Signal), der Ist-Wert wird analog über ein Poti abgegriffen ... der Rest dazwischen ist digital ... gilt für die meisten, vielleicht nicht alle. Weswegen ich jetzt mal unterstelle, daß die wenigsten Servos beim Ausfall des Signals bzw. dessen längeren ausbleibens korrekt in Toms Sinne reagieren. Dann zumindest hätt er ein Problem weniger.
1000 mahl danke, Ich werde deine idé mit interrupt jede 20 ms verwenden. Hast vollig recht dass es egal ist ob der A/D wandler etwas lãngere zeit bruache, wichtig ist nur dass die pulse jede 20 ms gesendet werden. Hier ist dass program ohne interrupt.
mfg Tom
#include #include #include #include #include
bank1 unsigned char text [20]; // Array til tekst på diplay
Du musst nur etwas anders denken, dann wird die Sache klar. Im Prinzip baust Du Multitasking und verwendest preemptives Scheduling nach Priorität, oberste Prio hat der 20ms-Timer, zweite der Impulstimer. Niedrigste Prio das Lesen der ADC und das Bereitstellen neuer Werte.
Hinweise:
So eine Software ist _viel_ komplexer zu debuggen, da Du nicht einfach irgendwo anhalten kannst. Daher zunächst einmal den 20ms-Timer mit Interrupt realisieren, dann die Servopulse per Interrupt. Dazu musst Du einen passenden Timer starten, also wieder die Berechnung mit Taktfrequenz, Vorteiler etc um den Registerwert zu errechnen. Dies kannst Du alles ohne die Hauptschleife mit ADC testen, indem Du feste Werte für die Kanäle nimmst.
Der "Witz" ist, daß Du, einmal implementiert, die Servoansteuerung für alle weiteren Projekte vollkommen unabhängig einbinden kannst, da sich da prinzipiell nichts ändert.
Hier kannst Du int-Arithmetik verwenden. Mit PICs selber habe ich noch nichts gemacht, aber bei passendem Wertebereich (der PIC hat als RISC doch gar keinen Multiplizier-Befehl, oder?) kann dies als
long temp1 = ((long)ch1 * 50000) / 1023;
gerechnet werden. Dabei wird zunächst in Richtung großer Zahlen gerechnet, um die Rundung zu umgehen.
Ein PWM-Signal würde ich eigentlich eher als digital bezeichnen. Klar kann ich es einfach mit einem RC-Glied (am besten wohl mit vorgeschaltetem Schmitt-Trigger) analog machen, aber dann brauche ich ja einen AD-Wandler, um es wieder zu digitalisieren. Warum sollte man dann nicht einfach die Impulsbreite messen? Sofern der Mikroconroller sowieso einen AD-Wandler hat, könnte man das sogar noch kombinieren, und über den Wertebereich einen "echten" Impuls von Rauschen unterscheiden.
PolyTech Forum website is not affiliated with any of the manufacturers or service providers discussed here.
All logos and trade names are the property of their respective owners.