MSP430 Generelle PWM Frage

Gast #471793
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?
Gast #471810
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!
Gast #472107
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.
Gast #472355
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?!?!
Angehängte Dateien:
Gast #472522
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren