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