【MSP430】捕获模式测量信号占空比

代码来自2016北斗杯,用于测量空气pm2.5,该传感器通过测量信号的占空比估计颗粒浓度

(1)TimerB设置,工作在捕获模式:

void TimerB_Init(){
  TBCCTL0&=~(CCIS1+CCIS0);            // 捕获源为P4.0,即CCI0A(也是CCI0B) 
  TBCCTL0|=CM_2+SCS+CAP;              //下降沿捕获,同步捕获,工作在捕获模式 
  TBCCTL0|=CCIE;                      //允许捕获比较模块提出中断请求 
  TBCTL|=ID_3; 
  TBCTL|=TBSSEL_2;                    //选择时钟MCLK 
  TBCTL|=TBCLR;                       //定时器清零, 
  //定时器开始计数(连续计数模式0~0xFFFF) 
  TBCTL|=MC_2; 
  _EINT(); 
}

(2)定时器开关:

void TimerBopen(void){
  TBCCTL0|=CCIE;                      //允许捕获比较模块提出中断请求
  TBCTL |= TBIE;
}


void TimerBclose(void){
  TBCTL &= ~TBIE;
  TBCCTL0&=~CCIE;                     //禁止捕获比较模块提出中断请求
}

(3)中断

用到两种中断:下降沿/上升沿中断、计数器溢出中断

实现在单位时间内测量低电平的时间,从而计算占空比:

//―――――定时器TB CCR0的中断:用于检测脉冲上升与下降沿―――― 
#pragma vector=TIMERB0_VECTOR        
__interrupt void TimerB0(void) 
{ 
  if(TBCCTL0&CM1){                    //捕获到下降沿 
    P6OUT |=BIT0;
       
    TBCTL|=TBCLR; 
    TBCCTL0=(TBCCTL0&(~CM1))|CM0;     //改为上升沿捕获:CM1置零,CM0置一 
  }else if(TBCCTL0&CM0){                    //捕获到上升沿 
    P6OUT &=~(BIT0);
    widthB+=TBCCR0;                    //记录下结束时间 
    TBCCTL0=(TBCCTL0&(~CM0))|CM1;     //改为下降沿捕获:CM0置零,CM1置一     
  } 
} 


//―――――定时器TB计数器溢出中断:用于检测脉冲上升与下降沿――――
#pragma vector=TIMERB1_VECTOR
__interrupt void Timer_B(void)
{
 
   switch( TBIV ){
    case 2: break;                   //CCR1不使用
    case 4: break;                   //CCR2不使用
    case 14: numB++;       //溢出
    break;
  }
  if(numB>=15){
    numB=0;
    secB++;
  }
  if(secB>=10){                        //设定时间后需要改变
 //   calculate();
    TimerBclose();
    return;
    
    //设置为传送模式
  }
}



  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值