Forum: Mikrocontroller und Digitale Elektronik MSP430 Generelle PWM Frage


von PROJECT_X (Gast)


Lesenswert?

servus,

hab auf meiner platine einen sender mit dem P1.1/TA0
verbunden.
ist es mit dem TA0 auch möglich PWM mit einstellbarer
Dutycycle zu erzeugen??
Oder geht das nur mit den TA1 und TA1 ausgägngen??

danke!

von Jörg S. (Gast)


Lesenswert?

Genau die selbe Frage wollte ich gerade für Timer B stellen :) Hab eine 
Platine gemacht wo TB0 und TB1 als PWM Ausgänge benutzt werden sollen. 
Jetzt hab ich festgestellt das alle Beispiele von TI nur TB1 und höher 
verwenden, weil das TBCCR0 Register (für TB0) als Maximalwertspeicher 
benutzt wird.
Leider kann ich an der Platine nix mehr Ändern :( Gibt es Hoffnung?

von PROJECT_X (Gast)


Lesenswert?

ja, bei mir ist es nicht ganz so schlimm,
wird beim ersten redesign geändert, falls
es keine andere lösung gibt.
hab eine notlösung gefunden, warte aber noch ab,
ob jemand eine bessere lösung hat als ich!

von Jörg S. (Gast)


Lesenswert?

Ich könnte was mit Interrupts basteln, aber das Ding soll natürlich noch 
was anderes machen ausser Interrupts alle paar ms.
Wie sieht deine Lösung aus?

von Johnny (Gast)


Lesenswert?

Also ein PWM Signal kann an TA0 / TB0 nicht erzeugt werden, denn wie 
vorher bereits gesagt, TA0 / TB0 dienen der Definition der 
Grundfrequenz. Der DutyCycle kann nur mit TA1 / TB1 und aufwärts 
definiert werden.
Ein Murks mit einem software PWM bleibt wohl die einzige Möglichkeit, 
sofern das Layout nicht mehr geändert werden kann.

von PROJECT_X (Gast)


Angehängte Dateien:

Lesenswert?

ja, bei der software lösung hab ich ein problem
hab da so eine DELAY function mit den timerb gmacht, aber
des funzt nicht so richtig.

wird der sensor einmal angestoßen, wird gesendet und
die led blinkt
beim 2ten mal anstoßen geht der MSP schlafen
und wenn ich ihn ein drittes mal anstoß dann
hängt er in der while schleife der
delayfunktion fest.
das passiert aber nur, wenn die delay funktion im main nicht 5000
wie in der delay funktion der ISR steht.
also wenn beide delay funktionen 5000, oder einen anderen gleichen
wert haben, geht alles, ist er unterschiedlich, dann hängts
wieder in der while schleife der delay funkt.

was ist da falsch?!?!

von Johnny (Gast)


Lesenswert?

Ich würde das ganze so umschreiben, dass Du gar keine Delays mer 
benötigst. Solche Programme sind meist nicht wartbar, da das Timing 
überhaupt nicht mehr stimmt, wenn man an der falschen Stelle was am Code 
ändert oder es funktioniert sogar überhaupt nicht mehr.

Die Erzeugung des PWM Signals würde ich komplett im Timer IRQ machen, es 
sind ja nur ein paar Zeilen einfacher Code.

Irgend sowas vielleicht (nicht getestet):

// Interruptroutine
#pragma vector=TIMERB0_VECTOR
__interrupt void count_CCRO()
{
  irq_count += 1;

  // Grundfrequenz bestimmen
  if (irq_count > max_count)
  {
    irq_count = 0;
  }

  // PWM generieren
  if (irq_count < pwm_sollwert)
  {
    redON;
  }
  else
  {
    redOFF;
  }
}

Das sollte dann äusserst stabil laufen, fast egal was Du im main() noch 
so machst.

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.