Forum: Mikrocontroller und Digitale Elektronik MSP430 Periodendauer berechnen


von Colin M. (colin80)


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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Colin M. schrieb:
> 32676

Wo kommt dieser Wert her?

von Colin M. (colin80)


Lesenswert?

Sorry, ein zahlendreher, sollte eigentlich 32767 sein!

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.