Forum: Mikrocontroller und Digitale Elektronik msp430g2553 - drei PWM-Ausgänge?


von dommy (Gast)


Lesenswert?

Hey,
habe hier den MSP430G2553 auf einem Launchpad, und möchte eine RGBW-LED 
per PWM ansteuern. Die PWMs werden ja über die Compare-Einheiten der 
Timer realisiert, und die Timer haben auch die Möglichkeit, die Pins 
direkt anzusteuern, wenn sie richtig konfiguriert sind.

Zur Frage: Für die RGBW-LED brauche ich vier PWM-Kanäle, ein Timer(0_A) 
hat drei Compare-Registersets, kann also auch drei PWMs für Pins 
erzeugen. Der µC verfügt aber über zwei einzelne Timer(0_A & 1_A), die 
nahezu die selben Funktionen bieten. Im Datenblatt sind die Pins mit 
folgenden Alternativ-Funktionen belegt:

Entweder:
Timer0_A, compare: Out0 output
Timer0_A, compare: Out1 output
Timer0_A, compare: Out2 output

Timer1_A, compare: Out0 output
Timer1_A, compare: Out1 output
Timer1_A, compare: Out2 output


Heißt das, dass beide Timer die selben Pins ansteuern? Und dass 
Hardware-PWM nicht für vier Kanäle machbar ist? Wenn ja, dann bleibt mir 
wohl nichts anderes übrig, als PWM über Timer_Interrupts zu realisieren. 
Oder sind das zwei verschiedene OutX's?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

dommy schrieb:
> Heißt das, dass beide Timer die selben Pins ansteuern?

Nein. Die sind sogar mehrfach verfügbar.

Sieh ins Datenblatt, S. 16, Tabellen 12 und 13

Timer0_A
Out0 P1.1 oder P1.5
Out1 P1.2, P1.6 oder P2.6
Out2 gibt es im 20poligen Gehäuse nicht

Timer1_A
Out0 P2.0 oder P2.3
Out1 P2.1 oder P2.2
Out3 P2.4 oder P2.5

Du kannst also mit beiden Timern fünf PWM-Kanäle gleichzeitig 
bedienen.

von dommy (Gast)


Lesenswert?

Danke! Wusste nur nicht, ob Out1 jeweils individuell für beide Timer 
gelten, oder von beiden eben direkt angesteuert werden. Werde das mal 
testen - falls es nicht geht, meld ich mich.

von Igor (Gast)


Lesenswert?

dommy schrieb:
> ein Timer(0_A)
> hat drei Compare-Registersets, kann also auch drei PWMs für Pins
> erzeugen.

Wie?

Ich möchte auch 3 PWM-Ausgänge nutzen, allerdings mit einem 
http://www.ti.com/product/msp430g2452 (PDIP)

Dort ist auch ein TimerA mit 3 CC-Units, die sich auch auf Ausgangspins 
schalten lassen. Allerdings erreiche ich nur 2 PWM-Ausgänge, denn der 
"continuous mode" setzt die compare outputs nicht wieder zurück. Es ist 
aber der einzige Mode, in dem CCR0 für den Ausgang genutzt werden kann, 
in allen PWM-tauglichen Modi wird er als MAX genutzt.

> Output modes 2, 3, 6, and 7 are not useful for output unit 0, because EQUx = 
EQU0.

Nur taugen modes 1, 4 und 5 (set, toggle, reset) nichts, wenn man einen 
einstellbaren duty-cylce haben möchte.

Aber selbst wenn der Timer beim Überlauf nicht "restart"en, sondern 
"reset"en würde, und damit auch den compare output beeinflussen würde, 
hätte man wg. der 16 Bit Auflösung bei max. 16 MHz eine recht niedrige 
PWM-Frequenz.

Die einzige Möglichkeit wäre ein Software-Reset im Overflow-Interrupt!?

Hier ein Minimalprogramm für 2 PWM mit unterschiedlichem Duty-Cycle und 
einstellbarer Frequenz.

Warum hat TI nicht anstelle CCR0 ein weiteres Register spendiert, das 
den Timer als MAX resetten kann? Schade :-)
1
#include <msp430.h>  // MSP430G2452
2
3
void main(void)
4
{
5
    WDTCTL = WDTPW | WDTHOLD;  // Stop watchdog timer
6
  
7
    //        TA0.2  TA0.1  TA0.0,
8
    P1DIR  = (BIT4 | BIT2 | BIT1);
9
    P1SEL  = (BIT4 | BIT2 | BIT1);
10
    P1SEL2 = (BIT4);
11
12
    //TA0CCTL0 = ;
13
  TA0CCTL1 = OUTMOD_7;     // toggle/set
14
  TA0CCTL2 = OUTMOD_7;     // toggle/set
15
16
  //
17
  TA0CCR0 = 1024;     // MAX
18
  TA0CCR1 =  512;     // PWM duty
19
  TA0CCR2 =  128;     // PWM duty
20
21
  TA0CTL = TASSEL_2 + MC_1;   // SMCLK, up to CCR0
22
23
  LPM0;
24
}

von Igor (Gast)


Lesenswert?

Andererseits lässt sich eine Compare Unit auch mit mehreren Pins 
verbinden. Es folgt ein Beispiel mit einer 8-bit 62.5 kHz PWM (16e6/256) 
auf drei Ausgängen:
1
#include <msp430.h> // MSP430G2452
2
3
void main(void)
4
{
5
    // Stop watchdog timer
6
    WDTCTL = WDTPW | WDTHOLD;
7
8
    // full speed
9
    BCSCTL1 = CALBC1_16MHZ;
10
    DCOCTL = CALDCO_16MHZ;
11
12
    // TA0.1 on three pins: P1.2, P1.6, P2.6
13
    P1DIR  = (BIT6 | BIT2);
14
    P1SEL  = (BIT6 | BIT2);
15
16
    P2DIR  = (BIT6);
17
    P2SEL  = (BIT6);
18
19
    // set up timer
20
    TA0CCTL1 = OUTMOD_7;    // toggle/set
21
    TA0CCR0 = 255;          // MAX -> 62.5 kHz @ 16 MHz
22
    TA0CCR1 =  64;          // PWM duty
23
24
    // start timer A0
25
    TA0CTL = TASSEL_2 + MC_1;   // SMCLK, up to CCR0
26
27
    LPM0;
28
}

von Jan S. (db8jo)


Lesenswert?

In der

Igor schrieb:
> Dort ist auch ein TimerA mit 3 CC-Units, die sich auch auf Ausgangspins
> schalten lassen. Allerdings erreiche ich nur 2 PWM-Ausgänge, denn der
> "continuous mode" setzt die compare outputs nicht wieder zurück. Es ist
> aber der einzige Mode, in dem CCR0 für den Ausgang genutzt werden kann,
> in allen PWM-tauglichen Modi wird er als MAX genutzt.

In der TI Application Note Slaa513 "Multiple Time Bases on a Single 
Timer"
http://www.ti.com/mcu/docs/litabsmultiplefilelist.tsp?sectionId=96&tabId=1502&literatureNumber=slaa513&docCategoryId=1&familyId=1615

Ist unter anderem beschrieben wie sich mit etwas code in der ISR alle 
drei Copmare Units für PWM nutzen lassen.

Gruß,
Jan

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.