Digital servo?

Hi
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?
Reply to
Tom
Loading thread data ...
Im Modellbau übliche Servos werden mit einem PWM-Signal vom Empfänger gefüttert. Wobei das Eingangssignal natürlich PCM sein kann.
-> Nimm einen schnelleren PIC
Gruß Hajo
Reply to
Hajo Giegerich
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
Reply to
Bernd Laengerich
Hallo Tom,
Tom schrieb:
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.
Gruß Martin
Reply to
Martin Schoenbeck
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 ;-))
Gruß Hajo
Reply to
Hajo Giegerich
"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.
Reply to
Tom
"Bernd Laengerich" skrev i en meddelelse news:c12mul$1dqges$ snipped-for-privacy@ID-71528.news.uni-berl>
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.
Reply to
Tom
Es gibt beides, aber nur recht wenige Servos können das! Ich weis nicht, mal welche, sorry.
Gruß Hajo
Reply to
Hajo Giegerich
Nun, ich glaube, dass mein BC107 im Schrank noch schneller ist...
Reply to
Patrick Kibies
Nein.
Siehe unten.
"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;
void main() { init(); while (1) { readADCs(); } }
void init() { readADCs(); setTimer(1, pwmout, TIMER_20MS, MODE_FREE_RUNNING); }
void readADCs() { for (int i=0; i
Reply to
Bernd Laengerich
"Tom" :
Floatingpoint? Was rechnest du da?
Reply to
Peter Stegemann
Passende Skalierung und int-Arithmetik und/oder Table-Lookup sollten reichen.
Bernd
Reply to
Bernd Laengerich
Hallo Hajo,
Hajo Giegerich schrieb:
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?
Gruß Martin
Reply to
Martin Schoenbeck
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.
Gruß Hajo
Reply to
Hajo Giegerich
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
int temp; double temp1 ,temp2;
void lcd() { int i; for (i=0; i
Reply to
Tom
Bernd Laengerich :
Das waere mein Satz gewesen.
Reply to
Peter Stegemann
Gern geschehen.
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.
Deine Rechnung: ch1 = 0 -> temp1 = 0 ch1 = 5 -> temp1 = 0,0244 ch1 = 255 -> temp1 = 1,2463
Meine Rechnung: ch1 = 0 -> temp1 = 0 ch1 = 5 -> temp1 = 244 ch1 = 255 -> temp1 = 12463
Dito, passenden Wertebereich wählen, dann fällt float weg.
Bernd
Reply to
Bernd Laengerich
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.
Reply to
Rolf Magnus
Naja, mein P2-400 kann unter Linux mit VICE einen C-64 inklusive Floppy und aller Spezial-Chips vollstaendig emulieren. Bei doppelter Aufloesung.
Scheint mir schneller geworden zu sein :-)
gert
Reply to
Gert Doering

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.