打印
[STM32]

立创商城STM32F系列——STM32f4输入捕获实验代码(02)

[复制链接]
792|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
小乐Tzz|  楼主 | 2018-9-7 11:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM32f4————输入捕获实验代码(02)
/*******************************************************/
此部分代码包含两个函数,其中TIM5_CH1_Cap_Init函数用于 TIM5通道 1的输入捕获设置,其设置和我们上面讲的步骤是一样的,这里就不多说,特别注意:TIM5 是 32 位定时器,所以 arr是u32 类型的。接下来,重点来看看第二个函数。
TIM5_IRQHandler 是 TIM5 的中断服务函数,该函数用到了两个全局变量,用于辅助实现高电平捕获。其中TIM5CH1_CAPTURE_STA,是用来记录捕获状态,该变量类似我们在usart.c里面自行定义的USART_RX_STA 寄存器(其实就是个变量,只是我们把它当成一个寄存器那样来使用)。TIM5CH1_CAPTURE_STA各位描述如表15.3.1所示:
TIM5CH1_CAPTURE_STA
bit7  bit6  bit5~0
捕获完成标志  捕获到高电平标志  捕获高电平后定时器溢出的次数
表15.3.1 TIM5CH1_CAPTURE_STA各位描述
  另外一个变量 TIM5CH1_CAPTURE_VAL,则用来记录捕获到下降沿的时候,TIM5_CNT的值。
  现在我们来介绍一下,捕获高电平脉宽的思路:首先,设置TIM5_CH1 捕获上升沿,这在TIM5_Cap_Init函数执行的时候就设置好了,然后等待上升沿中断到来, 当捕获到上升沿中断,此时如果TIM5CH1_CAPTURE_STA的第6 位为 0,则表示还没有捕获到新的上升沿,就先把 TIM5CH1_CAPTURE_STA、TIM5CH1_CAPTURE_VAL和计数器值TIM5->CNT 等清零,然后再设置 TIM5CH1_CAPTURE_STA的第6 位为1, 标记捕获到高电平, 最后设置为下降沿捕获,等待下降沿到来。如果等待下降沿到来期间,定时器发生了溢出(对 32 位定时器来说,很难溢出) ,就 在 TIM5CH1_CAPTURE_STA 里面对溢出次数进行计数,当最大溢出次数来到的时候,就强制标记捕获完成(虽然此时还没有捕获到下降沿)。当下降沿到来的时候,先设置TIM5CH1_CAPTURE_STA 的第 7 位为 1,标记成功捕获一次高电平,然后读取此时的定时器值到TIM5CH1_CAPTURE_VAL里面,最后设置为上升沿捕获,回到初始状态。
  这样,我们就完成一次高电平捕获了,只要TIM5CH1_CAPTURE_STA的第7位一直为1,那么就不会进行第二次捕获,我们在main函数处理完捕获数据后,将TIM5CH1_CAPTURE_STA置零,就可以开启第二次捕获。
  timer.h头文件内容比较简单,主要是函数申明,这里我们不做过多讲解。   
接下来,我们看看main函数内容
extern u8  TIM5CH1_CAPTURE_STA;    //输入捕获状态               
extern u32  TIM5CH1_CAPTURE_VAL;  //输入捕获值   
int main(void)
{   
  long long temp=0;   
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
  delay_init(168);  //初始化延时函数
  uart_init(115200);//初始化串口波特率为115200
    TIM14_PWM_Init(500-1,84-1);   
//84M/84=1Mhz的计数频率计数到500,频率为1M/500=2Khz      
    TIM5_CH1_Cap_Init(0XFFFFFFFF,84-1);//以 84M/84=1Mhz的频率计数   
      while(1)
  {    delay_ms(10);
    TIM_SetCompare1(TIM14,TIM_GetCapture1(TIM14)+1);   
    if(TIM_GetCapture1(TIM14)==300)TIM_SetCompare1(TIM14,0);         
      if(TIM5CH1_CAPTURE_STA&0X80)//成功捕获到了一次高电平
    {
      temp=TIM5CH1_CAPTURE_STA&0X3F;   
      temp*=0XFFFFFFFF;          //溢出时间总和
      temp+=TIM5CH1_CAPTURE_VAL;    //得到总的高电平时间
      printf("HIGH:%lld us\r\n",temp);//打印总的高点平时间
      TIM5CH1_CAPTURE_STA=0;      //开启下一次捕获
    }
  }
}
该 main 函数是在 PWM 实验的基础上修改来的,我们保留了 PWM 输出,同时通过设置TIM5_Cap_Init(0XFFFFFFFF,84-1),将 TIM5_CH1 的捕获计数器设计为 1us 计数一次,并设置重装载值为最大以达到不让定时器溢出的作用(溢出时间为 232-1 us),所以我们的捕获时间精度为 1us。主函数通过 TIM5CH1_CAPTURE_STA 的第 7 位,来判断有没有成功捕获到一次高电平,如果成功捕获,则将高电平时间通过串口输出到电脑。至此,我们的软件设计就完成了。
/*******************************************************/


【立创商城】STM32F103CBT6 托盘  https://item.szlcsc.com/8796.html

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

70

主题

70

帖子

0

粉丝