- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 9 von 9

Thema: PWM signal für servo "von hand" erzeugen ?

  1. #1
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    09.05.2006
    Beiträge
    1.178

    PWM signal für servo "von hand" erzeugen ?

    Anzeige

    Praxistest und DIY Projekte
    Hallo Leute!
    Meine nächster gewünschter Fortschirtt mit nem PIC16F876A
    wäre damit Servos anzusteuern...

    Bisher hab ich nur pwm gemacht, auf mosfets, und das waren 670Hz odersowas rum, also zuviel für nen servo (oder?).

    Jetzt ist mir als einfach gestrickter Person eingefallen, dass ich bei meinem letzten Programm mit Pausen garbeitet habe, die ca 1ms lang waren, beim ADC auslesen.

    .. jetzt könnte ich die pausen ja in ein unterprogramm packen.
    und zb 4 (..10) servostellungen schreiben (mehr brauch ich erstmal net)
    die ich dann aufrufe.

    Ziel ist erstmal, den servoarma langsam zu heben , und dann schnell wieder abzusenkene, oder andersrum.

    Die Genauigkeit fehlt dann wahrscheinlich etwas, aber das kann ich ja dann austesten, um wieviel cih die einzelnen unterprogramme variieren muß.

    Frage dazu:
    Lassen sich die Ports schnell genug high/low setzen, um da das gewünschte servosignal hinzubekommen?

    Ist das ganze reproduzierbarm, auch wenn ich das ding nach ner woche wieder aus der kiste hole, oder gibts da toleranzen die reinwirken? Temperatur oder sowas?

    Oder hat mir jemand nen Lösung/Beispiel in Assembler, die ich innerhalb von 10 Stunden kapiere, und funktionsfähig selbst hinbekomme ?

    Danke!
    GrußundTschüß \/
    ~Jürgen

  2. #2
    Erfahrener Benutzer Lebende Robotik Legende Avatar von PICture
    Registriert seit
    10.10.2005
    Ort
    Freyung bei Passau in Bayern
    Alter
    73
    Beiträge
    11.077
    Hallo PsiQ!

    Ich habe mich selber mit Servos nicht beschäftigt, aber es sollte nicht schwerig sein. Du hast schon PWM programmiert, also weiss Du wie´s geht.

    Um ein Servo steuern braucht man eine PWM mit 50... 100Hz mit ON=1...2ms, wobei 1,5 ms der Mittelstellung enspricht.

    Du kannst versuchen mit einem Timer ein Interrupt, der jede 10..20ms auftritt zu programmieren und nach dem 1...2ms Servoimpuls, während der OFF Zeit (~8...18ms) die Position des Einstellpotenziometers per A/D Wandlung zu bestimmen, die ON Zeit (Servoimpuls) berechnen und an CCPM übergeben.

    Zu Deinen Fragen:

    Die I/O Ports Ausgangspegels lassen sich sehr schell, z.B. bei 4MHz Oszillator Frequenz innerhalb von 1 us einstellen.

    Da es digital ist, ist die Stabilität und Reproduzierbarkeit nur Taktabhängig, also beim Quarz ~10^-5.

    MfG

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    09.05.2006
    Beiträge
    1.178
    ahja, stimmt, timer statt pausenwarten dürfte da besser sein
    gut, danke,
    ich schau mal wie datt geht, sobald ich zeit hab..
    Danke!
    GrußundTschüß \/
    ~Jürgen

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    09.05.2006
    Beiträge
    1.178
    ich bins nochmal...

    da ich vom timer noch keine wirkliche ahnung hab, hab ich grad bei sprut geschaut..nochmal das pwm...
    und da ist mir aufgefallen:
    wenn ich nur ein 1Mhz quarz nehme, komme ich mit dem pwm auf ne Frequenz von ca 61Hz....
    soooo...
    wäre das nen versuch wert, damit mal direkt auf nen servo zu gehen?
    oder ist das ausserhalb der toleranzen ?

    bzw, gibts auch quarze so bei 0,850Mhz
    --aber das wäre ja gegen den sinn vom programmieren..
    für nen beispiellink zum richtigen timer tüddeln wäre ich auch dankbar

    bis denn!
    GrußundTschüß \/
    ~Jürgen

  5. #5
    Erfahrener Benutzer Lebende Robotik Legende Avatar von PICture
    Registriert seit
    10.10.2005
    Ort
    Freyung bei Passau in Bayern
    Alter
    73
    Beiträge
    11.077
    Hallo PsiQ!

    Ich habe noch nichts mit Servos gemacht und kenne ich genaue Toleranzen nicht.

    Beim Timer 2 gibt es ein Prescaler (1...16) mit dessen man seine Frequenz teilen kann. Damit könnte man die Quarzfrequenz "teilen".

    Die Zeit vom seinen Start bis zum von ihm ausgelösten Interrupt kann man mit den Werten, die in seine Register geschrieben werden ebenfalls festlegen.

    Somit kommt man auf (fast) jede Frequenz. Man muss leider ein bischen rechnen...hilft aber nichts!

    MfG

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    09.05.2006
    Beiträge
    1.178
    so.. habmal mit was einfachem angefangen..
    so werd ichs mal großflächig zusammenbruzzeln zum testen:
    Bild hier  

    denke das müsste so gehen..
    Irgendwelche Einwände?

    was fürn quarz soll ich denn nehmen?
    nen 20Mhz liegt grad in der krümelkiste vor mir,
    nen 10Mhz hab ich auch noch da..

    Ablaufen soll das nachher so:

    Strom ran, powerup...

    1.Taster wird gedrückt

    2. ca8 Sekunden Pause

    3. Servo1 geht langsam hoch , zuckel zuckel, und dann flott wieder runter
    ohne Pause
    4. Servo2 langsam hoch, und zack wieder runter

    Programmteil Ende.

    Auf Taster warten.

    So denn, dann löte ich mal..
    bis denn!


    edit:
    zwischen pic-ausgangspin, und servo-signal kommt noch jeweils ein
    1k Widerstand
    GrußundTschüß \/
    ~Jürgen

  7. #7
    Erfahrener Benutzer Lebende Robotik Legende Avatar von PICture
    Registriert seit
    10.10.2005
    Ort
    Freyung bei Passau in Bayern
    Alter
    73
    Beiträge
    11.077
    Ist der LM78L05 für die Servos nicht zu schwach ?

    Wenn die Motoren mit anderer Spannung versorgt werden, dann sieht Dein Schaltplan gut aus. Ich verstehe nur nicht, was Die Diode D2 machen soll.

    MfG

  8. #8
    Ich hab früher mit 1nem Timer 2 PWMs für Motoren erzeugt. den selben Trick könntest du auch machen...

    Der Trick: Der Timer hat nen Überlauf von ~100us. das wären bei den 2ms immerhin 20x. du hast 3 countervariablen.

    Timer-Überlauf:
    decreasen aller counter und schaun on einer 0 wird. (DECFSZ)

    counter_all:
    beim 20. Mal werden alle PWM-Ausgänge auf 1 und alle counter auf ihren start(/soll)wert gestellt. (Ausnahme: ein Ausgang ist deaktiviert, dann bleibt er 0)

    counter_1:
    wenn der counter auf 0 kommt, Ausgang 1 auf 0 setzen

    counter_2:
    wenn der counter auf 0 kommt, Ausgang 2 auf 0 setzen

    Hoffe ich konnte helfen.

  9. #9
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    09.05.2006
    Beiträge
    1.178
    Zitat Zitat von PICture
    Ist der LM78L05 für die Servos nicht zu schwach ?

    Wenn die Motoren mit anderer Spannung versorgt werden, dann sieht Dein Schaltplan gut aus. Ich verstehe nur nicht, was Die Diode D2 machen soll.

    MfG
    Zu Spannung:
    Jou, ist auch kein lm, wußte nur net wie der heißt den ich da hab, der kann glaub 1,5A, das dürfte reichen
    Ich glaub ich werde die Spannungen wenns läuftgetrennt ausführen, damit die Servos (evtl merh als 2) auch unter Last den ic net stören.

    Zu D2:
    Die dämpft , nochmal zwischen der Spannung am großen C und der an den kleinen C's..
    Es wird doch quasi mit jeder "zwischenstufe" kondensator,widerstand,kondensator,widerstand.. die spannung hintenraus immer unempfindlicher gegen störungen von vorne.. odä?
    Anstatt nem widerstand nehm ich halt ne diode.
    für große störungen vorne nen dicken C, für kleine schnelle, die kleinen C's vor und nach dem Regler..

    @Gärtner...
    Danke für deinen Mühen, aber ehrlich gesagt hcb ich deine Ausführungen net wirklich kapiert:
    Ich lass den Timer überlaufen, zähl die carryflags zusammen, und mach dann zb 180 überläufe low (=18mS) und 20 Überläufe high (2mS)
    und hoffe, dass dann noch 50Hz hinkommen, oderwie?,
    oder sind diese 50Hz Oberfrequenz egal, solange der Rest passt?
    hmmmm..

    Ich fang jetzt an zu löten, hab vorhin erstmal 3 Stunden Elektro-Kleinteile sortiert und beschriftet..
    GrußundTschüß \/
    ~Jürgen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress