MSP430G2553捕获程序案例与经验分享
RQ(LPM1_bits);
//_bic_SR_register_on_exit(LPM1_bits);
break;
}
case 4:break;
case 10:break;
}
}
//如果要测量更低频率的信号的话,可以在中断中判断溢出中断发生的次数,这样就可以得到溢出的次数,从而可以测量更
//低频率的信号
程序例子---利用捕获功能测一个正弦波信号的频率
1.在进行测量之前,你需要对正弦波进行转换,把它变为方波。这个很简单的电路。
2.测频率,下面的代码是我自己写的,可以测到100K。精确度0.01HZ。总的来说,用TIEMEA产生一个2S的中断,2S后去去读计算频率。TIMERA0是对脉冲宽度的测量,TIMERA1是对定时器timerA中断的处理
void Init_Capture(void)
{
P1DIR&=~BIT1;
P1SEL|=BIT1;
BCSCTL2 |= SELS; // SMCLK=XT2=16M
BCSCTL2 |= divS_1; //SMCLK 2分频,即SMCL=8MHZ
TACTL |=TASSEL_1+TAIE+TACLR; //8分频,选择ACLK为timerA的时钟源(ACLK),开中断,增计数模式
TACCTL0 |=CM_1+SCS+CAP+CCIS_0+CCIE; //上升沿捕获+同步捕获+开捕获+timerA为捕获+打开捕获中断
TACTL |=MC_2;
}
int main()
{
Init_Capture();
while(1)
{
if(global_a.Conver==1)//捕获频率
{
_DINT();
global_a.Conver=0;
global_a.CapCount=(float)((32768.0*global_a.pulse)/global_a.time);//计算频率,注意理解!
Print_Fre();//显示频率
_EINT();
}
}
}
#pragma vector=TIMERA0_VECTOR
__interrupt void timer_A(void)
{
if(global_a.Cap_Tar==0)
{
global_a.Cap_First = TACCR0;
global_a.Cap_Tar++;
}
else
{
global_a.Cap_Last = TACCR0;
global_a.Cap_Tar++;
}
}
#pragma vector=TIMERA1_VECTOR
__interrupt void timeA1(void)
{
switch(TAIV)
{case 2:
break;
case 4:
break;
case 10: if(global_a.Cap_Tar==0)
global_a.pulse=0;
else
{
global_a.pulse=global_a.Cap_Tar-1;
global_a.time = global_a.Cap_Last-global_a.Cap_First;
global_a.Cap_Tar=0;
TACTL &=~BIT0;
// BIC_SR_IRQ(LPM3_bits);
global_a.Conver=1;
_DINT();
}
break;
}
}
MSP430G2553 相关文章:
- 基于MSP430的控制电机并测速度系统设计与调试(08-05)
- MSP430G2553的引脚功能详细图解(07-04)
- MSP430G2553的原理图(07-04)
- 详细解读:MSP430G2553单片机串口通信(07-04)
- 分解MSP430G2553的时钟系统(07-04)
- 20引脚的MSP430G2553引脚功能表(07-04)