Forum: Mikrocontroller und Digitale Elektronik MSP430 Launchpad, PWM sehr unpräzise


von max (Gast)


Lesenswert?

Hallo zusammen!

Ich verzweifle langsam an MSP430 + PWM. Was soll er tun? -PWM mit ca 
20ms Periode, dutycycle erstmal egal. Dazu verwende ich folgenden Code 
(CCS):
1
#include <msp430.h>
2
3
int main(void) {
4
    WDTCTL = WDTPW | WDTHOLD;  // Stop watchdog timer
5
6
    P1DIR |= 0xFF;
7
    P1SEL |= 0xFF;
8
9
    P2DIR |= 0xFF;
10
    P2SEL |= 0xFF;
11
12
    TACCR0 = 180;
13
    TACCR1 = 100;
14
    TACCTL1 = OUTMOD_4;
15
    // Start timer from ACLK , no division , Up mode , clear , no interrupts
16
    TACTL = TASSEL_1 | ID_0 | MC_1 | TACLR;
17
18
    for (;;) {
19
    __low_power_mode_3 ();
20
    }
21
22
  return 0;
23
}

Man auf dem Oszi auch brav eine PWM, jedoch "wackeln" die Flanken stark 
horizontal. Die Periode lässt sich also nicht genau feststellen. Ich 
kann mir absolut nicht vorstellen woran das liegt, schließlich müsste 
der Timer doch präzise sein oder? Ich greife das Signal an P1.2 ab.

Hatte jemand von euch schon mal ähnliche Probleme? Es muss doch möglich 
sein mit dem MSP eine vernünftige PWM hinzubekommen ;)

Viele Grüße und danke schon mal für eure Bemühungen!
Max

von max (Gast)


Lesenswert?

Übrigens kann ich an P1.0 ein Signal abgreifen, das weder konstante 
Frequenz, noch konstante Amplitude hat. Hier sollte doch eigentlich ein 
Vdd gegeben werden, wenn TACCR0 überläuft, oder?

von Sonnenfreund (Gast)


Lesenswert?

http://www.mikrocontroller.net/articles/MSP430_Codebeispiele#Initialisierung_von_PWM

Probier das einmal. Sonst hole ich mein launchpad erst bei schlechterem 
Wetter raus.:-D

von max (Gast)


Lesenswert?

Das habe ich schon ausprobiert, funktioniert leider nicht. Könnte es 
sein, dass mein Launchpad kaputt ist? Ich habe mittlerweile bemerkt dass 
ich über TACCR1 den Dutycycle nicht verändern kann. Er ist immer bei 
geschätzten 40%.

von max (Gast)


Lesenswert?

Edit: Dutycycle kann doch verändert werden, weiß nicht warum das gerade 
nicht geklappt hat. Frage ist also nur noch warum die Frequenz nicht 
stehen bleibt.

von Denis (Gast)


Lesenswert?

Outmod_7

von msp430 (Gast)


Lesenswert?

Denis schrieb:
> Outmod_7

mal abgesehen davon, welche Lib (also Defines) der TO benutzt (das steht 
ja nirgendwo....), sollte OUTMOD_4 schon das richtige Define sein 
(vorausgesetzt, er benutzt die gleichen Defines  wie ich)...

von max (Gast)


Lesenswert?

Ändert leider nichts an der total unregelmäßigen PWM Frequenz. Ich 
glaube ich kann auch ausschließen, dass der MSP sich ständig resettet, 
weil er immer an breakpoints in der Endlosschleife hält. Der Fehler muss 
irgendwo sehr früh im Timer verursacht werden, da P1.0 nur unregelmäßige 
Peaks ausgibt. Könnte das vielleicht jemand kurz auf seinem Launchpad 
bestätigen? Ihr würdet mir damit einen riesigen Gefallen tun :)

von max (Gast)


Lesenswert?

Defines habe ich gar keine.
1
#include <msp430.h>
2
3
int main(void) {
4
    WDTCTL = WDTPW | WDTHOLD;  // Stop watchdog timer
5
  //P2OUT = 0;
6
    P1DIR |= 0xFF;                       // P1.2 and P1.3 output
7
    P1SEL |= 0xFF;
8
9
    P2DIR |= 0xFF;
10
    P2SEL |= 0xFF;
11
12
    TACCR0 = 180;
13
    TACCR1 = 80;
14
    TACCR2 = 80;
15
16
    TACCTL1 = OUTMOD_7;
17
    TACCTL2 = OUTMOD_7;
18
19
    // Start timer from ACLK , no division , Up mode , clear , no interrupts
20
    TACTL = TASSEL_1 | ID_0 | MC_1 | TACLR;
21
22
    for (;;) {
23
    __low_power_mode_3 ();
24
    }
25
26
  return 0;
27
}

von Uwe B. (boerge) Benutzerseite


Lesenswert?

max schrieb:
> Defines habe ich gar keine.

was steht denn in deiner msp430.h drin?

Bei mir passiert da folgendes:

msp430.h
--> msp430xxxx.h
--> #define OUTMOD_4  (0x0080)  /* PWM output mode: 4 - toggle */

Was passiert bei dir?

Grüße Uwe

von Uwe B. (boerge) Benutzerseite


Lesenswert?

max schrieb:
> Ihr würdet mir damit einen riesigen Gefallen tun :)

also das funktioniert bei mir:

http://bralug.de/wiki/Tux_trifft_MSP430-Launchpad#PWM_.28LED_dimmen.29

(mit einem MSP430G2452).

Allerdings hatte ich keinen Oszi dran, um zu überprüfen, ob das Signal 
einwandfrei aussieht. Die LED auf dem Board macht das, was ich erwartet 
hatte...

Grüße Uwe

PS.: User: msp430 war ich auch.

von max (Gast)


Lesenswert?

1
#define OUTMOD_0               (0*0x20u)      /* PWM output mode: 0 - output only */
2
#define OUTMOD_1               (1*0x20u)      /* PWM output mode: 1 - set */
3
#define OUTMOD_2               (2*0x20u)      /* PWM output mode: 2 - PWM toggle/reset */
4
#define OUTMOD_3               (3*0x20u)      /* PWM output mode: 3 - PWM set/reset */
5
#define OUTMOD_4               (4*0x20u)      /* PWM output mode: 4 - toggle */
6
#define OUTMOD_5               (5*0x20u)      /* PWM output mode: 5 - Reset */
7
#define OUTMOD_6               (6*0x20u)      /* PWM output mode: 6 - PWM toggle/set */
8
#define OUTMOD_7               (7*0x20u)      /* PWM output mode: 7 - PWM reset/set */

von max (Gast)


Lesenswert?

Interessant, der Code von 
http://bralug.de/wiki/Tux_trifft_MSP430-Launchpad#PWM_.28LED_dimmen.29 
funktioniert bei mir auch. Aber warum macht mein Code nur Müll? Ich kann 
mir das nicht erklären...

von Uwe B. (boerge) Benutzerseite


Lesenswert?

MoinMoin,

max schrieb:
> Aber warum macht mein Code nur Müll? Ich kann
> mir das nicht erklären...

gute Frage, nächste Frage... :-)...:

bei meinen Experimenten habe ich festgestellt, dass wenn man die rote 
LED als PWM-Ausgang definiert, das Ganze etwas komischer/unregelmäßiger 
aussieht (wie gesagt subjektiv, ohne Oszi..).

Allerdings habe ich das Datenblatt des entsprechenden MSP430 in dem 
Punkt genau studiert...

Grüße Uwe

von max (Gast)


Lesenswert?

Ich benutze jetzt TASSEL_2 habe nur noch sehr wenige Ausrutscher in der 
Periodendauer. Anscheinend hat TASSEL_1 da etwas Toleranz... Mal ne 
andere Frage: Ich finde beim G2553 kein TA0.2 Pin. Wo soll der denn 
sein? es gibt ein Register dafür, aber ich finde den Pin nicht!

von Uwe B. (boerge) Benutzerseite


Lesenswert?

max schrieb:
> Ich finde beim G2553 kein TA0.2 Pin. Wo soll der denn
> sein? es gibt ein Register dafür, aber ich finde den Pin nicht!

den scheint es, lt. Datenblatt, bei der PDIP-Variante nicht zu geben.

Grüße Uwe

von max (Gast)


Lesenswert?

Hmm gibt es dann überhaupt eine Möglichkeit 4 verschiedene PWM auf einem 
MSP laufen zu lassen (PDIP, Value Line)? Es muss zwangsläufig durch 
Timer umgesetzt werden, weil ich die CPU benötige...

von Uwe B. (boerge) Benutzerseite


Lesenswert?

MoinMoin,

max schrieb:
> Hmm gibt es dann überhaupt eine Möglichkeit 4 verschiedene PWM auf einem
> MSP laufen zu lassen (PDIP, Value Line)? Es muss zwangsläufig durch
> Timer umgesetzt werden, weil ich die CPU benötige...
>
via Timer, logischerweise nur soviel PWMs wie vorhandene Timer...

Grüße Uwe

von max (Gast)


Lesenswert?

Okay dann bedanke ich mich sehr herzlich für die Hilfe!

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.