mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PIC Servosignale wandeln


Autor: Remo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Ich möchte gerne mit meinem PIC zwei Servokanäle vom Empfänger
einlesen, mischen und wider zwei Servosignale ausgeben.

Ich weiss über die Signalart der Servos bescheid.
(1-2ms Puls alle 20ms)

Jedoch weiss ich nicht genau wie ich dass Programmier- und Zeittechnisch 
genau lösen soll, dass sich Einlesen und Ausgeben nicht gegenseitig 
behindern.

uC:             PIC 16F87 mit 8Mhz internal oscillator
Programmierung: MikroC (von MikroelEktronika)

Für Tips oder Codeschnipsel in C wäre ich sehr dankbar.

Freundliche Grüsse

Remo

Autor: Martin S. (drunkenmunky)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was soll sich da behindern?

Du willst von einem Modellfunkempfänger ein PWM Signal einlesen, oder?
Schau dir das mal an:
http://sprut.de/electronic/modell/allgemein/index.htm

Das Signal schließt du an einen Eingangspin an. Dann mißt du damit die 
Pulslängen und kannst damit noch rumrechnen oder filtern. Und dann 
willst du 2 Servos anschließen, die verschieden ansteuerbar sind, oder? 
Dafür brauchst du dann halt nochmal 2 Ausgangspins mit Hardware-PWM (am 
einfachsten). Der 16F87 hat übrigens nur ein Hardware PWM.

Code schreibt dir dafür keiner. Oder wo gibts sonst noch Probleme?

Autor: Remo (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Martin

Danke für deine Antwort.

Mein Projekt sieht folgendermassen aus:

Ich habe im EEprom des Pic's für jeden Servoausgang 2 Positionen 
gespeichert.
Nennen wir sie mal PosA und PosB.
Ist nun am ersten eingang des Pic's das Servosignal grösser als 1,5ms
soll das Servo 1 am Pic von PosA nach PosB fahren, 3 Sekunden dort 
bleiben und wider nach PosA zurück fahren.
Das selbe geschieht mit Eingang 2 und Servo 2.

Mein jetziges Programm funktioniert soweit gut bis auf die zuverlässige 
Messung der zwei Eingangssignale.

Das mit dem behindern meinte ich so:
Alle 20ms mus ich ja einen Puls an Servo 1 und 2 senden.
Aber eben auch alle 20ms sollte ich die Eingänge 1 und 2 messen.

Kann mir einfach nicht vorstellen, wie ich die Messung in mein Programm 
einbauen kann ohne das die zyklische Pulserzeugung nicht beeinflusst 
wird.

freundliche Grüsse

Remo Hug

Autor: Bernd Rüter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe so etwas ähnliches mit einem 16F688 gelöst.

Die Servo-Signale vom Empfänger gebe ich auf 2 Eingänge, die ein 
Interrupt-on-change erzeugen können.
Dann lasse ich (i.d.R.) Timer1 als Zeitbasis laufen (bei 1:1 Vorteiler 
und 8MHz Takt sollte das passen).
Bei einem Anstieg eines Signals merke ich mir den Zählerstand und beim 
Abfallen kann man eine einfache Subtraktion durchführen, um die 
Differenz zu erhalten. (Achtung! Vorzeichen)
Das macht die Interrupt-Routine, die diese Zahl in eine Variable 
schreibt und ein Bit setzt zur Erkennung des neuen Wertes.

Das Hauptprogramm sieht immer nach, ob ein neuer Wert gemessen wurde, 
löscht das Bit und wertet diesen dann aus.

Im Hauptprogramm habe ich mit Timer0 und einem 1:64-Vorteiler eine 0,01s 
Schleife gebaut, so daß das Hauptprogramm 100mal je Sekunde durchlaufen 
wird.
Ich habe hier Timer1 als Zeitbasis für die Messung des Eingangssignals 
und als Timer für das Ausgangssignal genommen, weil ich nicht beides 
gleichzeitig brauchte, bei Dir ist da evtl. ein weiterer 16-Bit-Timer 
nötig.
Im Hauptprogramm kann dann alle 0,01s abwechselnd ein Servo-Signal 
angestoßen werden.

Autor: Martin S. (drunkenmunky)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde da auch nicht so ein alten Controller verwenden (wie gesagt 
nur eine Hardware PWM). So ein PIC16F1824 kostet bei Einzelkauf grad mal 
1,30$ und hat dann 4 PWM Module.

Wieviel Eingangspin hast du jetzt? Einen oder zwei?

Zeitlich sieht des so aus, dass du erst dein Eingangssignal ausmißt, so 
wie schon beschrieben und danach dem PWM Modul ein neues Tastverhältnis 
übergibts. Um das Ein- und Ausschalten der Ausgänge mußt du dich dann 
nicht kümmern, das macht dann das PWM Modul.

Autor: Jens Martin (jens-martin)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Martin S. schrieb:
> Um das Ein- und Ausschalten der Ausgänge mußt du dich dann
> nicht kümmern, das macht dann das PWM Modul

Kann man die PWM Module in disem Bereich fein genug auflösen?

Servodaten:

Pulslänge:     1-2 ms absolut
Periode:      20   ms
Frequenz:     50   Hz
Drehbereich: 180°  mal angenommen

Steuerdaten:
Pulse:      >= 2 / Grad  (= 360 / Drehbereich)

Ergo:
Auflösung: > 1/360 ms bei 50 Hz

Schätze das wird schwierig mit ner PWM da diese entweder den Bereich 
oder die Auflösung nicht können.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vergiss die 20 Millisekunden.
Die sind nicht wichtig.

Wichtig ist, dass du die Pulse selber, also den 1 bis 2 Millisekunden 
Teil korrekt generierst. Ob danach 10 Millisekunden oder 15 oder 20 oder 
25 Millisekunden Pause bis zum nächsten Puls kommen, interessiert das 
Servo nicht. Der Puls und dessen Länge von der ausfsteigenden bis zur 
absteigenden Flanke ist das was zählt.

Genauso das Messen des Einganspulses vom Empfänger. Du misst nicht alle 
20 Millisekunden, sondern du beginnst die Zeitmessung wenn das 
Eingangssignal von 0 auf 1 wechselt und du beendest die Zeitmessung, 
wenn das Eingangssignal wieder von 1 auf 0 zurückwechselt. Die Zeit 
dazwischen ((wieder die 1 bis 2 Millisekunden), die sind das was zählt. 
Wie lange die Pause bis zum nächsten Pulsbeginn ist, ist völlig egal. 
(Und die werden auch bei einer komerziellen Fernsteuerung keineswegs 
exakte 20 Millisekunden sein)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.