Forum: Mikrocontroller und Digitale Elektronik MSP430 Timer B PWM


von reflection (Gast)


Lesenswert?

Salu zusammen

Ich habe noch nie etwas mit Timern gemacht. Nun habe ich mir hier einen 
RGB Controller gebaut. Dieser liest die Werte für die Intensität der 
einzelnen Farben über einen AD Wandler ein (Potis). Nun möchte ich gerne 
je nach Poti Stellung ein entsprechendes PWM Signal erzeugen und an den 
Pins TB0 - TB2 ausgeben (Pin 36-38 / MSP430F149)

Denkt ihr die folgende Initialisierung des Timers B ist so korrekt wie 
ich mir das überlegt habe?

Die Frage die sich mir immer noch stellt ist, wie bekomme ich jetzt die 
entsprechende PWM auf die Pins P4.0-4.2? ACLK ist 1MHz. Hier beschreibe 
ich einfach einmal das CCR2 Register. Ist jetzt CCR1 für P4.0, CCR2 für 
P4.1 usw, oder sehe ich da etwas falsch? Irgendwie habe ich einfach 
ziemliche Probleme mit dem Verständnis wie ich die PWM rausbekomme. Wie 
ein Timer funktioniert habe ich denke ich verstanden. Wäre echt froh 
wenn ich von Euch Hilfe bekommen würde. Achja, wie gross würded ihr 
period wählen?

Gruss reflection

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

von Jörg S. (joerg-s)


Lesenswert?

>Nun möchte ich gerne je nach Poti Stellung ein entsprechendes PWM Signal
>erzeugen und an den Pins TB0 - TB2 ausgeben (Pin 36-38 / MSP430F149)
TB0 ist mit CCR0 verknüpft. Da du CCR0 für die Periode brauchst, fällt 
der weg.

>Ist jetzt CCR1 für P4.0, CCR2 für P4.1 usw, oder sehe ich da etwas
>falsch?
CCR1 = TB1 = P4.1

>Achja, wie gross würded ihr period wählen?
So das die Umrechung von ADC-Wert auf PWM einfach ist. Also evt. 4095. 
Dann brauchst du nur noch den Wert vom ADC in CCRx laden und bist 
fertig.

von reflection (Gast)


Lesenswert?

Huch, na das ist natürlich nicht so gut! Kann ich denn auf eine andere 
Art und Weise TB0 bis TB2 nutzen? Hab den Print eben schon fertig :o\

Gruss

von Jörg S. (joerg-s)


Lesenswert?

Ich fürchte das das nicht geht, da diese ganzen Toggle/Reset/Set 
Geschichten immer abhängig von CCR0 sind.
Die einzige Alternative wäre also nur die PWM in Software (mit dem Timer 
als Hilfsmittel) zu erledigen. Wenn der MSP sonst nichts zu tun hat 
könnte es evt. noch einigermassen gehen.

von reflection (Gast)


Lesenswert?

Kein Problem, hab die Leiterbahn bereits aufgefräst ;o) und neu 
verdrahtet. Mal schauen ob es funzt. Komme aber erst heute Abend dazu

Gruss und Danke schonmal im Voraus

PS: Kann mir noch jemand sagen wie ich jetzt ganz genau die 
Periodendauer ausrechne? Bei einem ACLK von 1MHz. Nehme ich an ich setze 
CCR^0 auf 255, kann ich dann 1MHz / 255 rechnen und bekomme die 
Periodendauer?

von Jörg S. (joerg-s)


Lesenswert?

Der Timer rennt mit 1Mhz. D.h. ein Timer Takt = 1/1Mhz = 1µs
Bei 255 Timer Takten dann entsprechend 1µs * 255 = 255µs Periodendauer

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.