mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PWM Signal erzeugen mit MSP430


Autor: Timo Granz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!

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

Autor: Timo Granz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auf einem MSP430F149.
Was ist denn ein Toolchain?

Danke für die Hilfe
Timo

Autor: OldBug (Gast)
Datum:

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

Autor: Timo Granz (Gast)
Datum:

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

Autor: Khani (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Noch eine recht gute Quelle für PWM:

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

Autor: Timo Granz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für eure Hilfe.
Es funktioniert.

Gruß
Timo

Autor: OldBug (Gast)
Datum:

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

Autor: Timo Granz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
}

Autor: OldBug (Gast)
Datum:

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

Weiter so...

Autor: Timo Granz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ... ;-)

Autor: Matthias (Gast)
Datum:
Angehängte Dateien:
  • preview image for hp.png
    hp.png
    81,7 KB, 434 Downloads

Bewertung
0 lesenswert
nicht 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

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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. ;-)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.