大家好。
我正在使用:
CCS V8
MSP430F2272
DSO-x 2024A Agilent 振荡器
尝试使用 Timer B 捕获模式来测量脉冲之间的时间间隔。
我的方波源为50KHz、我的 Timer_b 时钟为1MHz (MCLK = 8MHz、SMCLK = 8MHz、ACLK = 1MHz)(代码如下)
P2DIR |= 0x08; P2SEL |= 0x08; TACTL =(tassel_1 | MC_1 | ID_1); TACCR0 = 0x09; TACCR1 = 0x05; TACCTL1 = OUTMOD_6;
来源是最好的... 50.001 KHz
P4DIR &=~0x04; P4SEL |= 0x04; TBCTL =(CNTL_0 | TBSSEL_1 | MC_2 | TBIE); TBCCTL2 =(CM_1 | CAP | CCIS_0 | CCIE | SCS);
若要推测事件之间经过的秒数、请使用以下公式:
(超过* 65565 + Event_1 - Event_0)* 0.000001
其中:
over -定时器 B 溢出的次数(TBR 计数0的次数)
65565 - TBR 的大小、由 CNTL_0位定义
EVENT_1 -第二个事件发生时 TBR 的值
EVENT_0 -第一个事件发生时 TBR 的值
下面显示了我的 ISR:
_interrupt void Timer_B1 (void) { switch (__even_in_range (tBIV、14)) { 情况0:中断; //无中断 案例2:中断; // CCR1未使用 案例4: TB_Pulse0 = TB_Pulse1; TB_Pulse1 = TBCCR2; TBCCTL2 &=~CCIFG; if (TB_Pulse0){ TBCTL = 0; SendXBee |= true; } 中断; 案例6:中断; //未使用 CCR3 案例8:中断; // CCR4未使用 案例10:中断; //未使用 CCR5 案例12:中断; // CCR6未使用 案例14: TBCCTL0 &=~COV; if (TB_Pulse1) OverFlo++; //溢出 中断; 默认值:break; } }
您可以从上面的代码中了解到、我只会在捕获到第一个事件后对计时器溢出进行计数。 当我捕获到第二个事件时、计时器 b 关闭、我将通过 UART 发送数据。
我在 main 内部发送数据的例程只需检查'endXBee'、通过 XBee 无线电发送所有数据、然后重置'OVER (过)'、'Event_1'和'Event_0'变量。
即使该代码看起来还不错(至少对我来说是这样) 不管用! 在另一个无线电上读取的值使我可以测量实际信号周期的1/10。
有什么建议??? (耶!! 停止 使用嵌入式电子产品.... 开个玩笑而已)
谢谢大家。