Forum: Mikrocontroller und Digitale Elektronik Code für Servomotor


von Johannes (Gast)


Lesenswert?

Hallo

Ich bin neu in der Mikrocontrollertechnik. Muss mich da aber jetzt 
reinfuchsen. Ich möchte gerne einen Servomotor mit PWM ansteuern. Habe 
dafür auch schon folgenden Code geschrieben.

...
    PTCONbits.PTEN  = 1;
    PTCONbits.PTCKPS = 2;      //Prescaler auf 1:16
    PTCONbits.PTMOD = 0;
    PTPER = 9215;    //20ms Periode
    PTMRbits.PTDIR = 0;  //hochzählen
    PWMCON1bits.PEN1H = 1;  //PWM Ausgang 1 aktivieren
    PWMCON1bits.PMOD1 = 1;
    PDC1 = 614;           //1,5 ms Mitte
...

Könnt ihr mir sagen warum der nicht geht? Bzw. wo mein Gedankenfehler 
ist? Als Quartz habe ich 7,3728 MHz. Hoffe ihr könnt mir da helfen.
Danke für euere Bemühungen.

Gruss
Johannes

von ARM-Fan (Gast)


Lesenswert?

Lies dir dein Posting selbst nochmal durch und versuche danach
mal zu beurteilen, wie ein Außenstehender darauf etwas vernünftiges
antworten soll...

von Johannes (Gast)


Lesenswert?

hmm... dachte wäre verständlich.

Das ganze schreibe ich in einem C Compiler für einen dsPIC.
Dies ist auch nur ein Ausschnitt für den Teil im Programm, wo ich den 
PWM Ausgang des PICs ansprechen möchte.

Der Quartz für den PIC hat die Frequenz von 7,3728 MHz.

    PTCONbits.PTEN  = 1;       //Time Base Count Enable
    PTCONbits.PTCKPS = 2;      //Prescaler auf 1:16
    PTCONbits.PTMOD = 0;       //Free Running Mode (PWM)
    PTPER = 9215;              //20ms Periode
    PTMRbits.PTDIR = 0;        //hochzählen des Timerregisters (PWM)
    PWMCON1bits.PEN1H = 1;     //PWM Ausgang 1 aktivieren
    PWMCON1bits.PMOD1 = 1;     //Independent Mode
    PDC1 = 614;                //1,5 ms Mitte als Duty Cycle

Gruss
Johannes

von ARM-Fan (Gast)


Lesenswert?

dsPIC is ja schonmal die erste wesentliche Info.

>Könnt ihr mir sagen warum der nicht geht?

Weil er keine Beine hat...

Scherz beiseite. Aber "Geht nicht" ist auch keine Fehlerbeschreibung.

von Johannes (Gast)


Lesenswert?

Wenn ich es auf den dsPIC übertrage, macht der angeschlossene Servo nix. 
Er fährt auf keine Stellung, noch hält er eine.

von Daniel B. (und3rt4ker)


Lesenswert?

Hi,
nimms mir nicht krumm, aber hast du auch ne Spannungsversorgung am Servo 
und geht es noch? Manchmal sieht man den Wald vor lauter Bäumen nicht.

MfG
und3rt4ker

von Johannes (Gast)


Lesenswert?

Spannungsversorgung liegt an von 5V. Servomotor geht auch. Habe ihn mal 
betrieben an einem PWM Signal das ich mit einem IC erzeugt habe.

von ARM-Fan (Gast)


Lesenswert?

Ich nehme an, du hast kein Oszi um das Ausgangssignal mal anzuschauen?

Ich habe zwar keinen blassen von PICs, aber folgende Appnote gefunden:

http://ww1.microchip.com/downloads/en/DeviceDoc/93004A.pdf

Da ist auch ein Codebeispiel drin. Vielleicht hilft das.

von Johannes (Gast)


Lesenswert?

Super... Danke... werds gleich mal durchlesen. Morgen hole ich mir ein 
Oszi aus der Uni. Mal sehen was meine Platine dann so ausspuckt.

von Christian S. (mueke)


Lesenswert?

Hallo,
hast du evtl nen treiber-IC hinter dem PIC vergessen. Denke mal nicht 
das der PIC nen Servo treiben kann, oder hat der Servo das integriert?

MfG
Muecke

von Rahul D. (rahul)


Lesenswert?

>Denke mal nicht das der PIC nen Servo treiben kann, oder hat der Servo das 
>integriert?

(Modellbau-)Servos wie in diesem Fall haben eine Regelelektronik 
eingbaut.
Die werden über ein pulsweitenmoduliertes Signal angesprochen.
Mit PICs kenne ich mich nicht aus...

von Johannes (Gast)


Lesenswert?

Hi

das ist ein dsPIC 30F4011. Der ist extra für eine PWM Steuerung für 
Motoren ausgelegt. Das ganze ist auf einem Dev2 Board von Microchip 
drauf.
Mittlerweile habe ich auch geschafft, dass der Servo wenigstens etwas 
tut. Egal was ich jetzt einstelle, er fährt immer kpl. nach links. Den 
Code habe ich etwas zu oben verändert.

{
TRISE = 0x0100;             //PWM pins as outputs, and FLTA as input

PWMCON1bits.PMOD1 = 1;
PWMCON1bits.PEN1H = 1;
PTCONbits.PTMOD = 1;        //Time Base Mode
PTCONbits.PTCKPS = 2;       //Prescaler auf 1:16
PTPER = 18880;            //Computer Period  for desired frequency
PDC1 = 1776;    //1,5 ms Mitte
OVDCONbits.POVD1H = 1;
PTCONbits.PTEN = 1;   // Start PWM

}
Vielleicht könnt ihr mir sagen, warum egal was ich für eine Periode 
einstelle immer nur nach links (ccw) fährt.

Gruss
Johannes

von Magnus Müller (Gast)


Lesenswert?

> Vielleicht könnt ihr mir sagen, warum egal was ich für eine Periode
> einstelle immer nur nach links (ccw) fährt.

1. Möglichkeit:
Die Pulsdauer ist entweder zu lange oder zu kurz.

2. Möglichkeit:
Dein PWM-Signal ist invertiert (was dann zwangsweise zu einem zu langen 
Puls führt)

Gruß,
Magnetus

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.