6、输入捕获实验

注意点:1、在学习的过程中我们使用到与串口实验相类似的一个寄存器(本质是一个变量),用来处理不同的情况,在今后的学习也可以使用这种方法,这种寄存器的组成如下图所示:


             2、确定捕获到一个完整高电平的软件实现(包括如果处理接收到的高电平持续时间过长的情况)

void TIM2_IRQHandler(void)

if((TIM2CH1_CAPTURE_STA&0X80)==0) //还未成功捕获
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) //判断是否发生更新,即是不是发生溢出更新
{
if(TIM2CH1_CAPTURE_STA&0X40)//已经捕获到高电平了
{
if((TIM2CH1_CAPTURE_STA&0X3F)==0X3F)//高电平太长了
{
TIM2CH1_CAPTURE_STA|=0X80;//标记成功捕获了一次
TIM2CH1_CAPTURE_VAL=0XFFFF;
}else TIM2CH1_CAPTURE_STA++;
}
}
if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)//捕获 1 发生捕获事件(可能是高电平,也有可能是低电平)
{
if(TIM2CH1_CAPTURE_STA&0X40)    //捕获到一个下降沿

TIM2CH1_CAPTURE_STA|=0X80;    //标记成功捕获到一次上升沿
TIM2CH1_CAPTURE_VAL=TIM_GetCapture1(TIM2);
TIM_OC1PolarityConfig(TIM2,TIM_ICPolarity_Rising); 
//CC1P=0  设置为上升沿捕获
}else                   //还未开始,第一次捕获上升沿
{
TIM2CH1_CAPTURE_STA=0;      //清空
TIM2CH1_CAPTURE_VAL=0;
TIM_SetCounter(TIM2,0);
TIM2CH1_CAPTURE_STA|=0X40;    //标记捕获到了上升沿
TIM_OC1PolarityConfig(TIM2,TIM_ICPolarity_Falling);   
//CC1P=1  设置为下降沿捕获

}                   
}
TIM_ClearITPendingBit(TIM2, TIM_IT_CC1|TIM_IT_Update); //清除中断标志位
}

是这样的,当发生上升沿捕获的时候,由于这时候TIM2CH1_CAPTURE_STA的标志位还没有被置为高位,所以进入到下一个循环。同时设置下次捕获为下降沿捕获。到再次发生捕获的时候,就可以用是否已经获得上升沿标志位来判断是否捕捉到下降沿。至此一次脉宽的采集就完成了。

3、主函数中高电平时间的计算:

int main(void)
 {
 
u32 temp=0; 
NVIC_Configuration();//设置NVIC中断分组2:2位抢占优先级,2位响应优先级 
delay_init();     //延时函数初始化
uart_init(9600);//串口初始化为9600 
LED_Init();   //初始化与LED连接的硬件接口
  TIM1_PWM_Init(899,0); //不分频。PWM频率=72000/(899+1)=80Khz
  TIM2_Cap_Init(0XFFFF,72-1);//以1Mhz的频率计数 
    while(1)
{
  delay_ms(10);
TIM_SetCompare1(TIM1,TIM_GetCapture1(TIM1)+1);
if(TIM_GetCapture1(TIM1)==300)TIM_SetCompare1(TIM1,0); 
if(TIM2CH1_CAPTURE_STA&0X80)//成功捕获到了一次高电平
{
temp=TIM2CH1_CAPTURE_STA&0X3F;
temp*=65536; //溢出时间总和
temp+=TIM2CH1_CAPTURE_VAL;//得到总的高电平时间
printf("HIGH:%d us\r\n",temp);//打印总的高点平时间
  TIM2CH1_CAPTURE_STA=0;//开启下一次捕获
  }
}
}

通过分析计算公式可知:定时器2的工作频率为72M/(71+1)=10M;由于其自动装载的数值是0xFFFF(65535),计数方式为0~65535,那么完成一次计数的时间就需要65536*(1/10M)。(一次脉冲计数器加1)那么也就可以理解代码中的计算方式了,TIM2CH1_CAPTURE_STA为溢出的次数,TIM2CH1_CAPTURE_VAL为寄存器中的计数值。每完成一次计数都是从0~65535,那么因为溢出所以需要的时间为溢出次数*每次完成一次计数所需要的时间,即temp=TIM2CH1_CAPTURE_STA&0X3F;temp*=65536;再加上捕获到下降沿时的计数值,就是整个过程所需要的时间。


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值