hey leute! kenn mich nicht so gut aus und wollte fragen, ob sich jemand mein programm ansehen könnte! möchte per software eine PWM erstellen! leider macht der controller gar nix! könnte mir jemand sagen, was ich falsch mache?? hätte da noch eine frage zu den interrupt nummern! woher weiß ich denn, welche nummer für welchen interrupt ist? hab nen at89s4051 aber im datenblatt hab ich da auch nix gefunden... Danke!! mfg chris
> möchte per software eine PWM erstellen! leider macht der controller gar nix! Was heisst "er macht gar nix?" Er läuft nicht, oder dein Programm tut nicht? Kannst du ne LED oder so ansteuern, dass du siehst, ob er überhaupt tut? > könnte mir jemand sagen, was ich falsch mache?? Ja, kann ich... Du schaltest die beiden Timer in den Counter-Betrieb (TMOD = 0x55), was du brauchst ist der Timer-Betrieb. (TMOD = 0x11). Was heisst "per Software"? Willst du wirklich von Hand eine PWM erzeugen, oder mit der integrierten PWM Funktion? Falls PWM Funktion: Datenblatt, Seite 14, Kapitel 16. Da steht alles beschrieben. > woher weiß ich denn, welche nummer für welchen interrupt ist? Unter der Annahme, dass du den Keil C51 Compiler verwendest: Guckst du hier: http://www.keil.com/support/docs/1150.htm Und hier: http://www.keil.com/appnotes/files/apnt_103.pdf Hoffe, ich konnte helfen :) Falls noch Fragen sind, her damit. Ralf
danke ralf für die hilfe :) das problem ist das, ich brauche 2 PWM, kann aber mit dem kontroller nur eine erzeugen über die beiden timer! jetzt brauch ich eine alternative!! LEDs kann ich ansteuern, hab ich auch schon gemacht! und wenn ich mit der PWM arbeite, funkt es auch! danke, jetzt funktionierts :) jetzt muss ich es nur mehr so umschreiben, dass ich es für 2 pwm nutzen kann :) VIELEN DANK FÜR DIE HILFE :)
> das problem ist das, ich brauche 2 PWM, kann aber mit dem kontroller nur > eine erzeugen über die beiden timer! jetzt brauch ich eine alternative!! Ah, okay. Jetzt wirds klarer, weil 2 PWMs, das hab ich nicht gewusst. Hm, gibt es irgendwelche Gemeinsamkeiten der beiden PWMs? Z.B. gleiche Frequenz. Dann könntest du Timer0 in Mode3 setzen und hast zwei getrennte 8-Bit-Timer, macht zusammen mit Timer1 drei Timer. Allerdings ist Timer 1 dann ein bisschen in der Funktion eingeschränkt. Je nachdem, wie genau die ganze Sache werden muss, kannst du es auch mit beiden Timern normal lösen. Wenn beide PWMs die gleiche Frequenz haben, macht ein Timer die Grundfrequenz, und triggert damit den anderen Timer. Der andere Timer handelt beide PWMs ab. Es geht auch mit nur einem Timer, je nach Ansatz und Anforderung an die Genauigkeit. Ralf
naja die anforderungen sehen so aus, dass ich 2 PWM für servo regler brauche! die brauchen eine periodendauer von T = 20 ms und die pulsweite variert von 1-3 ms glaub ich! aber dein vorschlag hört sicher sehr gut an, werd das mal versuchen! das einzige, was noch schwierigkeiten machen könnte ist das signal, es wird nämlich über bluetooth und ner RS232 auf den µC übertragen, muss also immer das jeweilige signal (impuls) anpassen! gibts für die timer geschichten vll irgendwo was fertiges zum ausprobieren/testen? danke chris
Okay, dann könnte ein Ansatz für Verwendung von einem Timer wie folgt aussehen: Der Timer wird auf 1ms Sekunden eingestellt. Du verwendest für jeden Servo zwei Variablen + eine Variable für das Zählen von 20ms. In den Servo-Variablen steht die Anzahl ms, für die der zugeordnete Portpin auf high gehen soll. Du brauchst jeweils zwei Variablen, eine für das Hauptprogramm, eine für den Interrupt (wg. Synchronisation). Bei jedem Timer-Interrupt vergleichst du die Servo-Variablen auf 0. Sind sie ungleich 0, setzt du den Portpin und zählst sie runter. Ist eine 0 geworden, löscht du den entsprechenden Portpin. Ist eine Variable 0, so machst du nix (für den entsprechenden Servo). Du musst im Timer-Interrupt auch prüfen, ob du die 20ms erreicht hast, dazu brauchst du die zusätzliche Variable. Wenn du 20 Durchläufe erreicht hast, holst du die Werte der Servovariablen des Hauptprogramms in die Variablen des Interrupts und das Spiel geht von vorne los. Du könntest auch eine Servovariable nehmen, das hat aber den Nachteil, dass dir ein Servo zweimal innerhalb der 20ms angehen könnte, wenn das Hauptprogramm die Werte neu schreibt. Hoffe, das hilft ;) Ralf
> ...die pulsweite variert von 1-3 ms
Sorry, zu spät registriert. In dem Fall musst du natürlich dafür sorgen,
dass die Variablen nicht auf 0 geprüft werden, sondern auf 1.
Desweiteren ist die Auflösung eines Servos natürlich mit einem
1ms-Timers bescheiden (Voll links/rechts oder Mittelstellung). Dazu
müsstest du dann eine kleinere Zeitbasis mit dem Timer machen (z.B.
250µs), und die entsprechenden Werte natürlich vergrößern (also nicht
auf 20ms prüfen, sondern auf 20ms/TB -> TB = Zeitbasis des Timers).
Ralf
danke ralf! hat mir sehr geholfen! hatte eigentlich auch den selben gedanken! ;) bin noch net ganz fertig mit den programm, aber ich denke es müsste funktionieren!! thx
Hi Chris, die Lösung ist nicht erprobt, da gibts sicher noch Optimierungsmöglichkeiten, oder sogar bessere Ansätze. Aber du kannst ja deine Ergebnisse hier bzw. in der Codesammlung posten. Wäre nett, wenn du uns (mich) auf dem laufenden hältst... Ralf
chris wrote: > naja die anforderungen sehen so aus, dass ich 2 PWM für servo regler > brauche! > die brauchen eine periodendauer von T = 20 ms und die pulsweite variert > von 1-3 ms glaub ich! Du kannst die Pulse einfach nacheinander erzeugen. In die 20ms passen dann bis zu 6 Impulsausgänge. Peter
Für gängige Modellbauservos ist der Neutralimpuls bei 1.5ms und die pulsweite zwischen 0.9 - 2.1ms Grüße, Michael
hey leute! hab das mit der soft PWM versucht, aber da geht gar nix :( weiß auch leider nicht, wo ich meinen fehler mache! kann mir wer helfen?? bin am verzweifeln! hoffe ihr könnt mit der beschreibung des programmes was anfangen!
nach mehreren versuchen, hab ichs noch immer nicht hinbekommen! denke, mein fehler liegt in der periodendauer! verwende einen quarz mit 12,5 MHz der wird intern druch 12 dividiert (maschinen zyklus) bleibt 1 MHz, ergibt einen zyklus von rund 1µs ich hoffe so weit hab ichs noch richtig! wenn ich jetzt zb eine T = 20 ms brauche, muss ich von meine 65535 - 20000 rechnen, oder? ergibt 45535 und das wäre dann mein startwert für den timer stimmt das? bin schon ganz durcheinander... mfg chris
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.