|
用于测量空气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;
//设置为传送模式
}
}
|
|