Kostenloser Elektrotechnik VIDEO-Kurs


mit VIDEO-Reihen zu den Themen:
Grundlagen der Elektrotechnik
Gleichstromnetze und Berechnungsverfahren
Wechselstrom und Drehstromnetze
Elektrische Maschinen
Regelungstechnik
Digitaltechnik
Mikrocontrollertechnik und C-Programmierung


Ein Programmablaufplan für die Pulsweitenmodulation


Im heutigen Artikel soll die Pulsweitenmodulation mit Hilfe eines Programmablaufplans realisiert werden.

Und zwar in Zusammenhang mit der Programmierung des Timers.

Der Timer soll jeweils nach 1 ms ablaufen. Da der Mikrocontroller mit 12 MHz getaktet, die Timer-Register also jede µs inkrementiert werden, müssen wir bis 1.000 zählen bis 1 ms vergangen ist.

Da wir dafür TH0 und TL0 benötigen, mit einem Byte kann man ja nur bis 255 zählen, wählen wir nicht den auto-reload Modus, sondern wählen den Modus 1, bei dem wir beide Timerregister für das Zählen zur Verfügung haben.

Berechnung der Initialisierungswerte für die Register TH0 und TL0
Da wir bei 65536 einen Überlauf haben, müssen wir bei dezimal 64536 starten. Hexadezimal ist das FC18. Das bedeutet TH0=0xFC und TL0=0×18.

In dem Video zeige ich noch einmal die Berechnung und die Programmierung der Registerwerte.

Planung des Programms mit Hilfe eines Programmablaufplans, PAP

In der Interrupt Service Routine des Timers soll nun die Pulsweitenmodulation realisiert werden.

Da die Realisierung des Programms nicht ganz trivial ist, ist die Planung des Programms zu empfehlen.
Für diese Planung gibt es verschiedene Möglichkeiten. Neben Struktogrammen hat sich in der Programmierung der sogenannte Programmablaufplan als zweckmäßig erwiesen.

In einem Programmablaufplan plant man das Programm zunächst einmal unabhängig von der Sprachsyntax das Programm und schreibt den Ablauf der Programms mit all seinen Verzweigungen zunächst einmal z.B. auf einem Blatt Papier auf.

Hierdurch bekommt man eine gute Vorstellung vom Ablauf des Programms. Ein Programmablaufplan ist hierbei einfacher zu lesen und zu erstellen als das benötigte C-Programm.

In einem zweiten Schritt schreibt man dann mit Hilfe des Programmablaufplans sein C-Programm. Diese Umsetzung geht einem dann in den meisten Fällen sehr leicht von der Hand.

Wie man einen Programmablaufplan erstellen kann, zeige ich im folgenden Video.


Deine Aufgabe

Wenn ich Du wäre ;-) , würde ich mir jetzt, nachdem Du das Video gesehen hast, ein Blatt Papier nehmen und versuchen, den Programmablaufplan einmal selbständig zu erstellen – ohne noch einmal in das Video zu spicken.

Anschließend kannst µVision aufrufen und die Interrupt Service Routine erstellen.


Hat Dir der Artikel geholfen? - Dann hilf dem Artikel ;-)

1 Star2 Stars3 Stars4 Stars5 Stars (Gibt jetzt das erste Rating ab!)
Loading ... Loading ...




Ähnliche Artikel

Folgende Artikel aus der gleichen Kategorie könnten Dich ebenfalls interessieren:

Timer Interrupt Lösung der Aufgabe Am Ende der vergangen Folge, in der es um die Programmierung eines Timer Interrupts ging, hatte ich ...

Programmierung der Pulsweitenmodulation Heute geht es um die Programmierung der Pulsweitenmodulation in C. Mit Hilfe des Programmablaufplan...

Timer Interrupt des 8051 Mikrocontrollers Zu den wichtigsten Aufgaben eines Mikrocontrollers gehören Steuerungs-, Regelungs- und Messaufgaben....

Programmieren des Timer Interrupts Heute geht es wieder ans Eingemachte. Mit einer schönen Aufgabe zum Schluss. Wann wird ein Timer Int...

Software Interrupts, Traps Wie bereits in der Übersicht zu externen Interrupts gezeigt, können Interrupts auch durch Software a...

{ 6 Kommentare… sie unten lesen oder einen hinzufügen }

Andreas

Hallo Wolfgang,
habe ich etwas verpasst oder ist seit Oktober (noch) keine Fortsetzung erschienen?
Nicht dass mein Spamfilter dazwischenfunkt – seit Teil 2 gibt es ja kein Inhaltsverzeichnis mit Links mehr.
Danke für die großartige Arbeit :-)
Andreas

Wolfgang Bengfort

Hallo Andreas (und auch die anderen, die derzeit hier warten),

Du hast recht.
Ich bin zur Zeit mit dem Mikrocontroller-Kurs ziemlich in Verzug geraten.
Ich hoffe, nach den Prüfungen in diesem Frühjahr auch hier wieder Gas geben zu können.

Bis dahin, viele Grüße
Wolfgang

Peter

Könnte man es nicht auch so lösen?

int Slot = 0;
int i= 0;

if (i == 0);
{
if (Slot == P0)
{
P1 = 0×01;
Slot=0;
i = 1;
}
else
{
Slot++;
}
}

else
{
if (Slot == (255-P0))
{
P1 = 0×00;
Slot=0;
i = 0;
}
else
{
Slot++;
}
}

Peter

achja i muss dann aber eine static int sein

Kevin

Hallo,

Erstmal danke für deine Mühe. Nur um sicher zu gehen:
Zu sagen, dass jede Mikrosekunde inkrementiert wird ist sehr sehr grob geschätzt. Man muss noch beachten, dass bei den meisten Derivaten die Oszillatorfrequenz / Takt des Mikrokontrollers erst Mal z. B. durch 6(also durch einen prescaler) geteilt wird. Außerdem würd ich bei 12MHz auch ohne prescaler nicht auf 1 Mikrosekunde kommen. Das ist schon sehr grob geschätzt. Kannst du wenigstens sagen, wie du auf die Mikrosekunde kommst?

Wolfgang Bengfort

Der Mikrocontroller hat einen Prescler von 12. Das heißt der Timer wir 1 Mio mal pro Sekunde getktet, zwischen den Takten vergeht also 1 µs.

Einen Kommentar hinterlassen