MSP430 Periodendauer berechnen

OP #2844129
Lesenswert?
• ▲
▼
Hallo zusammen,

ich bin verzweifelt und kapier garnix mehr! Irgendwie berechne
ich die Periodendauer falsch.

Ich habe einen Motor mit einer Auflösung bei einer Codierscheibe von 400 
Inkrementen bei MSP430f1611 an Port TBCLK angeschlossen. Ich möchte die 
Drehzahl bestimmen und der Motor soll abgebremst werden. Testweise hab 
das so programmiert, das 40000 Impulse gezählt werden sollen ehe ein 
Interrupt ausgelöst wird. Mit Timer A messe ich die Zeit und hat einen 
32kHz Quarzosillator.

Zur Kontrolle, ob ich es richtig programmiert habe, messe ich am 
Ozilloskop die Periodendauer. Leider weicht die gemessene Periodendauer 
bei meiner Berechnung etwas ab. Hier der Code:
1
#include <msp430x16x.h>
2

3
unsigned long long zeit, time,count;
4

5
void main(void)
6
{
7
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
8

9
  P4SEL |= BIT7;
10
  
11
  _BIS_SR( GIE);                 // Enter LPM0 w/ interrupt
12
  while(1)
13
    {           
14
          TACCTL0 = CCIE ;         // CCR0 interrupt enabled
15
          TACCR0 = 65535/2;        // eine sekunde laufen lassen
16
          TACTL |= TACLR;
17
          TACTL = TASSEL_1 + MC_1 ;     // ACLK, contmode
18
          
19
          TBCCTL0 = CCIE;               // CCR0 interrupt enabled
20
          TBCCR0 = 40000;
21
          TBCTL |= TBCLR;
22
          TBCTL = TBSSEL_0 + MC_1;      // TBCLK, up-mode
23
          while(TBCTL & MC_1)
24
          {     
25
          }
26
    }
27
}
28

29
// Timer A0 interrupt service routine
30
#pragma vector=TIMERA0_VECTOR
31
__interrupt void Timer_A (void)
32
{ 
33
  count += 0x7FFF;      // aktuellen Zähler speichern (32767=7FFF)
34
}
35

36

37
//Timer B zählt die Impulse, die reinkommen. Drehsensor ist an Port 4.7 angeschlossen
38
//
39
// Timer B0 interrupt service routine
40
#pragma vector=TIMERB0_VECTOR
41
__interrupt void Timer_B (void)
42
{ 
43
  TBCTL ^= MC_1;                //Stoppe Timer B
44
  TACTL ^= MC_1;                //Stoppe Timer A
45
  time= (count + TAR - 32767);  //Hier Zeit aus Timer A rausholen
46
  count= 0;
47
}

Berechnet habe ich die Periodendauer folgendermaßen.

zeit= time/32676    //Wie lange hat er für 40000Impulse gebraucht?
F= 40000/zeit       //Frequenz in 1/s
t= 2* 1/F           //Periodendauer

Die Werte weichen so um die 30 bis 100 µs ab!

Hab ich das so richtig berechnet? Richtig programmiert? Kann es sein, 
das ich einen Offset mit einbeziehen sollte? Anregungen, wie mans besser 
machen oder womit es genauer geht?

gruß colin

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.