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
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?
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
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.
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.
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.
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)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.