Frequenz mit MSP430 messen

Gast #329347
Lesenswert?

Hallo

Ich will eine Frequenz mit dem MSP430F149 messen. Klar das es
funktioniert mit der Frequenz auf einen Interrupt und in der ISR nen
Zähler hochzählen. Das lastet den Prozessor bei höhern zu messenden
Frequenzen aber stark aus, weil er immer in die Routine springen muss.


Nun meine Frage: Man kann ja mit dem Timer Zeiten messen. Also capture.
Dort wird der Takt der gezählt wird intern erzeugt und das äussere
Singal ist die "Torzeit". Nun würd ich aber gern die Torzeit intern
und den takt von Extern anlegen. Geht das? Kann ich den Zählereingang
von Timer A nach aussen auf einen Pin legen??

Hab schon in dem Userhandbuch und so geschaut, konnte aber nix finden
Gast #329350
Lesenswert?

Naja wie gesagt ich konnte im Datenblatt nichts finden, wie ich die
externe Frequenz an meinen Zählereingang legen kann. Ich habe nur den
Capturemode gefunden was ja gerade anderst herum ist.

Warum kommt der Beitrag zwischendrin 3 mal???
Gast #329351
Lesenswert?

moin, irgenwie begreife ich deine frage nicht.

das zu messende signal legst du an einen capture-eingang. richtig
konfiguriert wird z.b. bei jeder steigenden flanke am captureeingang
der timer-wert in das register TACCRx (timerA) geschrieben. überträgt
man diesen wert in der interruptroutine in einen puffer, kann die
frequenz des signal aus dem aktuellen wert in TACCRx, dem gespeicherten
wert des vorherigen interrupt und der timer-takt-frequenz leicht
ausgerechnezt werden.
Gast #329352
Lesenswert?

Hallo

Also ich hab jetzt selber rausgefunden wie es geht. Ich möchte nicht
das Eingangssignal auf den Capture Eingang legen, und praktisch die
Periodendauer messen. Sondern ich möchte den Caputer von Timer B
vorgeben und die Frequenz direkt in den Zähler laufen lassen (Messung
der Anzahl der Highpegel in einem bestimmten Zeitintervall). Als
Beispiel laufen in einer Sekunde 500 000 (kann sein, das der Zähler
nicht mehr so viel kann) Zählimpulse in den Zähler beträgt die Frequenz
500 kHz. Dazu habe ich die Eingangsfrequenz auf INCLK gelegt. Und eine
Verbindung von TB an TA0 extern gemacht. D.h. ich gebe mit Timer B (TB)
die Torzeit vor. TA0 ist mein Capture eingang.

so kann ich während ich die Frequenz messe (z.B. 1 s lang) andere
Aufgaben mit dem µC erledigen. Natürlich ist das was ich messe, nur die
Durchschnittsfrequenz in diesem Zeitraum.
Gast #550753
Lesenswert?

Hallo alle zusammen,

habe heute mal wieder mit MSP430 und Capture rumgespielt. Leider läuft 
die Messung nicht so stabil, wie ich's gern hätte. Hier der Code der 
ISR:

--snip---

void TimerA1_Interrupt(void) __interrupt[TIMERA1_VECTOR]
{
unsigned int counter = TACCR2;
TACCTL2 &= ~COV;
 switch(TAIV){
//----------------------------------------------------------
  case 0x0A:{     // timer 2 overflow
              //TACCTL2 |= CCIE;
              if(!fCAP) Overflow++;
              break;
            }
  case 0x04:{     // capture 2 interrupt
              if(fCAP == 1){
                LastValue = counter;
                sum = fCAP = Overflow = 0;
              }else{

              //-- measurement has finished after 2000 cycles --
                if(CountTC++ ==1999){    //199
                  TACTL &= ~MC1;                   // stop meas
                  TACCTL2 &= ~CM0;                // --"--
                  //TACCTL2 &= ~CCIE;
                  sum = (65536-LastValue) + (Overflow*65536) + counter;

                  freq = 6e06 * 2000 / sum;      //XTAL = 6e06 Hz

                  Det_MeasFin = true;
                }
                TACCTL2 |= CCIE;
              }
              break;
            }
      }
       TACCTL2 &= ~COV;
}


Das Problem ist, dass ich mit dem Capture-Eingang eine Frequenz bis ca. 
100kHz messen möchte. Der Capture-Timer soll frei laufen und über 200 
(2000) einkommende Perioden den Quarztakt messen. Anschließend wird 
berechnet. Das Pproblem könnte in dem gleichzeitigen Auftreten von 
Overflow und Capture liegen, denn ich bekomme öfter unterschiedliche 
Frequenzen mit leichten Abweichungen präsentiert.

Wer kann helfen oder hat ein Beispiel?? (PS: Capture soll hier NICHT nur 
die Quarzimpulse über eine einkommende Periode des Capture messen, 
sondern ein freilaufender Timer soll 200 oder 2000 Perioden aufnehmen 
und dann erst stoppen.

Danke im voraus.
Gast #583294
Lesenswert?

@ MiGu

Genau dieses Problem, mit dem gleichzeitigen Auftreten von overflow und 
capture, habe ich vermutlich bei meinem Code auch! Wie hast du es 
gelöst?

Hat sonst jemand eine Idee, wie man dies lösen könnte?


Besten Dank im Voraus!

Gruss
Renato

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