Forum: Mikrocontroller und Digitale Elektronik PWM-Software


von chris (Gast)


Angehängte Dateien:

Lesenswert?

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

von Ralf (Gast)


Lesenswert?

> 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

von chris (Gast)


Lesenswert?

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 :)

von Ralf (Gast)


Lesenswert?

> 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

von chris (Gast)


Lesenswert?

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

von Ralf (Gast)


Lesenswert?

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

von Ralf (Gast)


Lesenswert?

> ...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

von chris (Gast)


Lesenswert?

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

von Ralf (Gast)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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

von M. Kriegel (Gast)


Lesenswert?

Für gängige Modellbauservos ist der Neutralimpuls bei 1.5ms und die 
pulsweite zwischen 0.9 - 2.1ms

Grüße,
Michael

von chris (Gast)


Angehängte Dateien:

Lesenswert?

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!

von chris (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.