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

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

A/D-Wandler vorschalten?

Gruß Hajo

Reply to
Hajo Giegerich

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.