Forum: Mikrocontroller und Digitale Elektronik PWM Signal erzeugen mit MSP430


von Timo Granz (Gast)


Lesenswert?

Hallo,

in der Schule wurde uns die Aufgabe gestellt einen Motor mit Hilfe des
MSP430 anzusteuern. Wir sollen das über ein einstellbares PWM Signal
mit Timer B in C realisieren. Nur leider habe ich überhaupt keine
Ahnung davon.
Hat jemand so eine Funktion, oder könnte mir jemand weiterhelfen?

Vielen Dank schonmal
Gruß
Timo

von OldBug (Gast)


Lesenswert?

Hi!

Hast Du denn überhaupt schon eine Toolchain für den MSP430?
Auf welchem Prozessor dieser Familie sollst Du das denn realisieren?

von Timo Granz (Gast)


Lesenswert?

Auf einem MSP430F149.
Was ist denn ein Toolchain?

Danke für die Hilfe
Timo

von OldBug (Gast)


Lesenswert?

Toolchain ist die "Entwicklungsumgebung", also Compiler und Tools zum
erstellen der nötigen Files.

von Timo Granz (Gast)


Lesenswert?

Wir benutzen einen einfachen Texteditor, compilieren mit gcc und laden
mit IAR Systems die Software in den Flash

von Khani (Gast)


Lesenswert?

PWM : PUls-Weiten-Modulation.
Es gibt verschiedene Modelle - ich erläutere jetzt kurz den phasen- und
frequenzrichtigen Modus.

Es gibt eine feste Dauer eines Zyklus, im weiteren f_PWM.
Während dieses Zyklus ist die Spannung eine Zeit lang 100% an, den Rest
des Zyklus aus.
Mit einem Timer kann man das wie folgt realisieren :
Man lässt den Timer von 0 aus hochzählen. Wenn er eine vorgegebene
Obergrenze erreicht hat, lässt man ihn wieder herunterzählen bis auf
Null und dann wieder von vorn. Die Zykluszeit ist dann genau
T_PWM = 2 * (Obergrenze) * (Zeit für einen Schritt)
(Achtung - falls höchste Genauigkeit gefordert ist, muss man sich noch
Gedanken machen, was im Zähler im Umkehrpunkt passiert!)
f_PWM = 1/T_PWM

Es fehlt jetzt noch das Ein-/Ausschalten der Spannung. Das realisiert
man durch einen einstellbaren Wert zwischen 0 und Obergrenze des
Zählers. Erreicht der Zähler beim Aufwärtszählen den Wert (x_PWM) so
wird der Ausgang ausgeschaltet. Beim Erneuten Durchlaufen beim
Herunterzählen wird der Ausgang wieder eingeschaltet.
Als Puls-/Pauseverhältnis ergibt sich :
ED = x_PWM / Obergrenze (mit 0<=x_PWM<=Obergrenze)

Um die Phasen-Richtigkeit zu gewährleisten und Fehlzyklen zu vermeiden,
darf der Wert x_PWM nur im Zählerstand 0 modifiziert werden.

Tips :
- Im Datenblatt das Zählerkapitel durchlesen
- nach "Compare-Match" suchen
- nach "PWM" suchen
- bei Nichtverstehen wieder hier mit Seitenangabe hier nachfragen

MfG, Khani

von OldBug (Gast)


Lesenswert?

Aha!

Für den Timer_A gibt es ein Beispiel, wie man mit dem PWM macht. Mit
Hilfe des Datenblattes sollte das recht einfach auf den Timer_B
übertragbar sein!

Schau doch mal in "/examples" im mspgcc-Verzeichnis. Genauer:
 /examples/slac015/fet140_ta_pwm01 bis fet140_ta_pwm06

Für den Timer_B hab ich jetzt auf Anhieb kein Beispiel gefunden, kann
aber sein, daß eins dabei ist. Aber wie gesagt: mit dem Family User
Guide lässt sich das auch einfach auf den Timer_B anpassen.

von OldBug (Gast)


Lesenswert?

Noch eine recht gute Quelle für PWM:

http://wiki.mikrocontroller.net/PWM.htm

von Timo Granz (Gast)


Lesenswert?

Vielen Dank für eure Hilfe.
Es funktioniert.

Gruß
Timo

von OldBug (Gast)


Lesenswert?

Na das ging aber flott!
Würdest Du uns mal auf Deine Sourcen gucken lassen?
Würd mich jetzt echt interessieren...

von Timo Granz (Gast)


Lesenswert?

Die Pwm Funktion sieht folgendermassen aus:

void PWM(int dutycycle, int period)
{
  TBCTL = MC_0;                       // Stop the timer
  TBCTL = TASSEL_2 + TBCLR;           // ACLK, Clear Tar
  TBCCR0 = period;                  // PWM Period
  TBCCTL2 = OUTMOD_7;                 // CCR2 reset/set
  TBCCR2 = dutycycle;                 // CCR2 PWM duty cycle
  P4DIR |= 0x0F;                      // P4 output
  P4SEL |= 0x0F;                      // P4 TA1/2 otions
  TBCTL |= MC0;                       // Start Timer_B in up mode
}

von OldBug (Gast)


Lesenswert?

Hm, das sah nach so nem "wer macht meine Hausaufgaben"-Thread aus,
aber anscheinend hat ja wirklich nur der Denkanstoß gefehlt.

Weiter so...

von Timo Granz (Gast)


Lesenswert?

Das stimmt nicht ganz. Ich hatte eine Lösung mit einer Schleife, die mir
mein Ausgangssignal generiert hat. Was natürlich keine saubere Lösung
war, da ja nicht anderes mehr gemacht werden kann. Die zweite Aufgabe
baute dann auf die erste auf und meine Lösung war damit hinfällig. Ich
habe nur den Hinweis auf Timer B erhalten. Da ich vorher nie mit Timern
gearbeitet habe stand ich wie der "Ochs vorm Berg", durch eure
Denkanstösse konnte ich diesen Teil der Aufgabe aber ziemlich schnell
lösen.
Tolles Forum und vielen Dank nochmals für die Hilfe

Timo

von Sebastian (Gast)


Lesenswert?

Und auf www.mathar.com hab ich das ganze noch als schicke kleine
Lichtorgel mit dem Timer_A gemacht. Falls euer Lehrer 'ne Disco machen
möchte oder so ... ;-)

von Matthias (Gast)


Angehängte Dateien:

Lesenswert?

Hi

@Sebastian
Meinst du du könntest deine Seite so gestalten das sie auch mit
Auflösungen jenseits von 1024x768 ordentlich dargestellt wird? Hier
(1600x1200) ist alles seitlich verschoben. Siehe Anhang.

Zusätzlich könnte ein Besuch von http://validator.w3.org/ nicht
schaden.

Bitte nicht böse sein. Nur konstruktive Kritik.

Matthias

von Sebastian (Gast)


Lesenswert?

Jaja, ich weiss. Die Seite ist blöderweise für 1024*768 optimiert.
Sobald ich Zeit habe, werde ich sie "offener" gestalten. Solange muss
eben noch der Inhalt zählen, nicht die Form. ;-)

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.