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?
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.
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.
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 | }
|
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 | }
|
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.