Forum: Mikrocontroller und Digitale Elektronik Hilfe - PWM von PIC, Servo dreht nur in groben Stufen!


von Rudi H. (rubberdog)


Lesenswert?

Hallo Community,

habe ein analoges Modellbau-Servo an meinen PIC angehängt. Funktioniert 
zwar, aber die Drehbewegung ist ruckartig und springt in etwa 7 
Grad-Schritten. Das kann ich nicht gebrauchen; ich möchte einen 
"weichen" Servolauf über die vollen 90 Grad (Bahnschranken).

Das Problem dabei ist:

Das Servo verarbeitet ja nur 50Hz (20 ms)-PWM mit einer Dutyrate 
zwischen 1 und 2 ms. Der PIC gibt mir am PWM-Ausgang einen Vollkreis in 
256 Schritte aufgelöst. Da ich nur 90 Grad brauchen kann, bleiben 256:4 
= 64 Schritte übrig.

Diese 64 Schritte müßte ich jetzt in dem PWM-Puls unterbringen, der ja 
zwischen 1 ms und 2 ms breit ist. Das ergibt folgende Parameter:
PWM1_Set_Duty(13) = 1 ms, die Nullstellung, also 0 Grad.
PWM1_Set_Duty(19) = 1.5 ms, das sind 45 Grad.
PWM1_Set_Duty(25) = 2 ms, also 90 Grad.
Den Parameter im PWM1_Set_Duty(xx)-Befehl kann ich nur als "unsigned 
short" (ja, ist ABSI-C) übergeben.
Damit ergeben sich 12 Schritte für die 90 Grad und das ist sehr sehr 
grob.

Habt Ihr irgendeine Idee, wie ich da was verbessern kann? Wird's mit 
einer Assembler-Routine statt des PWM1_Set_Duty(xx)-Befehls (aus der 
C-Library meines Entwicklungssystems) feiner abstufbar?
Damit der PIC überhaupt 50Hz am PWM-Pin hergibt, hab ich den internen 
Oszillator mit 500kHz aktiviert und da bekomm ich eben die 8 Bit 
Auflösung, 256 Stufen und nicht mehr.

Bin ja ein ziemlicher Neuling auf dem Gebiet und rauf mich da durch; 
vielleicht geht das Ganze doch etwas eleganter??

Vielen Dank vorab für Eure Tipps, Kritik und Meinungen
und noch viel Spaß am Löten

Rudi aus Wien

ps: technische Details zu den Servos siehe 
"http://www.rn-wissen.de/index.php/Servos";

von Benjamin R. (shooter_benny)


Lesenswert?

Welcher PIC? Typenbezeichnung bitte.
Taktfreuquenz?

Gruß Benny

von Klaus (Gast)


Lesenswert?

Benjamin R. schrieb:
> Welcher PIC? Typenbezeichnung bitte.
> Taktfreuquenz?

Diese Fragen klingen schlau, sind aber unerheblich. Eine PWM mit 8 Bit:

Rudi Herwig schrieb:
> in 256 Schritte aufgelöst

liefert genau das beschriebene, egal auf welchem Prozessor. Auch eine 
dedizierte Hardware kann aus 8 Bit nicht mehr herausholen. Und wenn die 
20 ms stimmen, ist der Takt schon richtig. Eine bessere Auflösung 
erfordert eine PWM mit mehr als 8 Bit.

MfG Klaus

von Mike (Gast)


Lesenswert?

Klaus schrieb:
> Eine bessere Auflösung erfordert eine PWM mit mehr als 8 Bit.

Oder man greift da ein bisschen mit Software ein. Eine Möglichkeit ist, 
nur die Pulsdauer mit dem Timer zu erzeugen, d.h. 2 ms entsprechen 256 
Steps. Die 20 ms sind schließlich relativ unkritisch, d.h. die kann man 
ungefähr erzeugen, indem man den Timer ein paar Mal rund laufen läßt und 
dann für den High-Puls per PreSet oder Compare, was auch immer der PIC 
(welcher?) hat, einen wohl definiertes Intervall erzeugt.

von Klaus (Gast)


Lesenswert?

Mike schrieb:
> Oder man greift da ein bisschen mit Software ein

Da das "Servosignal" gar keine wirkliche PWM ist, ist das der richtige 
Weg. Es hat sich aber wohl so festgesetzt, daß man das mit dem PWM Modul 
macht, das ich etwas anderes garnicht erwähnt habe.

MfG Klaus

von Rudi H. (rubberdog)


Lesenswert?

@Klaus

Hallo Klaus,
das ist eine Spitzen Idee! Super, da wär ich nicht drauf gekommen. Hab 
sowieso noch einen Interrupt frei und da kann ich das leicht 
realisieren.
Was täte ich ohne Euch und das Forum  ;-))

Vielen Dank auch an Mike!!

lg Rudi

von Kein Name (Gast)


Lesenswert?

Normalerweise benutzt man für Servos den Compare Mode.

Gibt eine Strategie, die in der ISR zwischen Mode 1000 und 1001 
umschaltet. Ergibt perfekte Signale, ohne Jitter. Aber einfach den Pin 
in der ISR setzen ist auch gut genug.

von Hans Peter (Gast)


Lesenswert?

Hallo Leute,

es ist nicht ganz richtig, was Ihr da schreibt.
Man kann sehr wohl einen PWM-Puls feiner auflösen als mit 256 bit.
1.:
Man nehme einen PIC mit PWM-Unterstützung. Dessen PWM hat eine Auflösung 
von 10 bit, ist aber wegen der zusätzlichen 2 bit etwas schwer zu 
handhaben. Geht aber.
2.:
Man benutze den Timer1 für die Darstellung der Pulsbreite. Timer1 hat 
eine Auflösung von 16 bit. Diese können natürlich nicht voll ausgenutzt 
werden. Wenn der Timer1 mit der Prozessor-Taktfrequenz angestoßen wird 
(z.B. mit 1 µs), dann ist die Auflösung der Pulsbreite tatsächlich 1 µs! 
Damit dürfte der Servo nicht mehr ruckeln.

Die andere Frage ist die nach der Stellgeschwindigkeit. Bei 20 ms 
Wiederholtakt sind natürlich nur 50 Änderungen je Sekunde möglich.
Die 20 ms sind kein unbedingtes Muss. Probiert es aus, ob Euer Servo 
auch mit 10 ms Wiederholtakt noch richtig läuft. Wenn das klappt, habt 
Ihr schon gewonnen. Dann sind es 100 Änderungen je Sekunde, und jeder 
step darf dann nur halb so groß sein wie bei den 20 ms. Das Ruckeln 
müßte dann wesentlich weniger werden.

Ich selber will einen kleinen Kran per Servo drehen lassen, bin aber 
über das Gedankliche noch nicht hinausgekommen.

Viel Erfolg beim Ausprobieren!

von Thomas W. (Gast)


Lesenswert?

Hi

PIC PWM ist für Servos ungeeignet.
Man nimmt dafür die CCP Funktion.

With a CCP module, set the pin high manually at the beginning of your 
pulse, then use the Compare mode to turn it off at the end of your 
period.  That way you can go off and do other things with your micro.

Alles klar ;-)

Gruß
Thomas

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.