www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik MSP430 PWM auswerten


Autor: Marco B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich möchte ein PWM-Signal mit dem MSP auswerten. Ich habe allerdings 
überhaupt keine Idee, wie ich das PWM-Signal mit dem MSP analysieren 
soll. Wie komme ich denn an das Tastverhältnis der PWM?



Gruß
Marco

Autor: Daniel der Drüsendieb (druesendieb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das geht mit jedem mC:

100% ist die Zeit zwischen zwei gleichen Flanken.

Das PWM-Tastverhältnis ist der Anteil, der von der gegengerichteten 
Flanke markiert ist - oder das Komplement.

Ist das so schwierig, daß man da nicht selbst drauf kommen kann?

Daniel Drüsendieb

Autor: Michael Waiblinger (wiebel42)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder natürlich ganz stumpf Tiefpass/Integrierer -> ADC. Jenachdem was 
man über hat Timer oder ADC.

Autor: Marco B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"Ist das so schwierig, daß man da nicht selbst drauf kommen kann"

ne, was ne pwm ist und ein tastverhältnis weiß ich auch!

mir ging es darum, wie man nun das signal, was man am controller anlegt 
auswertet. wenn ich es z.b. an einen adc port lege, wie ich dann per 
software daran komme. da habe ich keine idee.

mit einem timer könnte man sicher die erste flanke nehmen, einen timer 
starten, dann sehen, wie weit es zur zweiten flanke ist usw. ist doch 
aber ein wenig umständlich, da man die ports andauern hin und her 
schalten muss, auf welche flanke sie reagieren müssen usw.





Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Marco B.

>ne, was ne pwm ist und ein tastverhältnis weiß ich auch!

>mir ging es darum, wie man nun das signal, was man am controller anlegt
>auswertet. wenn ich es z.b. an einen adc port lege, wie ich dann per
>software daran komme. da habe ich keine idee.

Wenn du es per ADC machen willst, musst du einen RC-Tiefpass mit 
entsprechend niedriger Bandbreite davorschalten, die Bandbreite muss ca. 
1/100 bis 1/1000 des der PWM-Frequenz betragen.

>mit einem timer könnte man sicher die erste flanke nehmen, einen timer
>starten, dann sehen, wie weit es zur zweiten flanke ist usw. ist doch
>aber ein wenig umständlich, da man die ports andauern hin und her
>schalten muss, auf welche flanke sie reagieren müssen usw.

Überhaupt nicht. das sind eine handvoll Befehle, das fällt unter ferner 
liefen. Die Funktion die du suchst heisst Input Capture (ICP), kann der 
MSP auch.

MFG
Falk

Autor: Michael Waiblinger (wiebel42)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie gesagt die Idee mit dem ADC ist nur dann sinnvoll wenn man keinen 
Timer mehr übrig hat. sonst ist der direkte Weg natürlich eleganter.

Autor: Marco B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,


ich bin nun nochmal dazu gekomen, mich damit zu beschäftigen. Allerings 
habe ich es noch nicht am Laufen.

Ich habe nun das auszuwertende Signal an den Port 1.1 (TA0) gelelgt.
Ich möchte nun die Periodenlänge messen und die Dauer des High-Pegels. 
Somit kann ich ja dann das Tastverhältnis berechnen.

Das Problem ist nun, das kein Interrupt des Timers kommt. Er springt 
nicht in die ISR.

Könnte es vielleicht an einer falschen Initialisierung liegen? Oder bin 
ich überhaupt auf dem richtigen Weg?


Den Timer habe ich dann wie folgt initialisiert:
void InitTimer(void)
{
  TACTL = TASSEL_2 + MC_2 + ID_3 + TACLR;    // SMCLK, continuous, Teiler 8
                                             // 1MHz
  TACCTL0= CM_1 + SCS + CCIS_0 + CAP + CCIE; // steigende Flanke, 
                                             // synchronisiert
                                             // TA0, Capture mode,
}

Der externe Quarz 8MHz wird zuvor schon wie folgt initialisiert. er soll 
auch für Baudratenerzeugung des uart verwendet werden. Die Uart 
Schnittstelle funktioniert einwandfrei.:
BCSCTL1 &= ~XT2OFF;     // XT2on, externen Resonator anschalten (8MHz)
do
{
  IFG1 &= ~OFIFG;                       // Clear OSCFault flag 
  wait(255);                            // Time for flag to set
}
while ((IFG1 & OFIFG));                 // OSCFault flag still set?
BCSCTL2 |= SELM_2 + SELS;               // MCLK = SMCLK = XT2 (safe) 

Die ISR des Timers sieht wie folgt aus:
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A0 (void)
{ 
    if(flanke == 0 && ready == 0)// Wenn erste steigende Flanke kommt...
    {
        rise= TACCR0;            // Zählerstand speichern 
        periode= rise - start;   // Periodenlänge berechnen
        start= rise;             // Wert für spätere weiterverarbeitung 
                                 // zwischen speichern
        flanke++;
        ready= 1;                // Wenn ready 1 ist, dürfen die Werte 
                                 // ausgegeben werden
        TACCTL0 |= CM_2;         // auf fallende Flanke umschalten 
    }
    else if(flanke == 1 && ready == 0) // Wenn die fallende Flanke kommt
    {
         fall= TACCR0;                 // Zählerstand speichern
         high_time= fall - rise;       // High-Zeit berechnen
         flanke= 0;
         TACCTL0 |= CM_1;              // Auf steigende Flanke umschalten 
    }
}/* __interrupt void Timer_A0 (void) */

Vieleicht noch die Initialisierung der Ports:
void InitPorts(void)
{
  P1DIR=0x00;              // Port1 = Input
  P2DIR=0x80;              // Port2 = Output (Port 2.7 als "ENABLE") 
  P4DIR=0xFF;              // Port 4 = Output (8 Datenleitungen zum LCD)
  P5DIR=0x1F;              // Port 5 = Output (RS, R/W und E vom LCD an 44, 45 
                           // und 46 (entspricht P 5.0, 5.1, 5.2))
  P1SEL=0x00;              // Alle Ports als GPIO nutzen
  P2SEL=0x02;              
  P3SEL=0x30;              // Port 3 als UART nutzen
  P4SEL=0x00;              // Alle Ports als GPIO nutzen
  P5SEL=0x00;              // Alle Ports als GPIO nutzen

  P5OUT=0x01;             // Initial nur E (clock) auf HIGH, RS und R/W auf LOW
  P4OUT=0x00;             // Ports mit Null initialisieren
  P2OUT=0x00;             
}/* void InitPorts(void) */

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.