OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2485|回复: 2

最近在做STM32F1的超声波检测,输入捕获

[复制链接]

4

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2016-7-18
在线时间
13 小时
发表于 2017-11-23 09:09:39 | 显示全部楼层 |阅读模式
单路捕获早就解决了,但是多通道捕获花了一整天的时间才弄好,网上的相关例程也不多,我这里就给大家分享以下我的代码,仅供参考:
TIM_ICInitTypeDef  TIM4_ICInitStructure;
void TIM4_Cap_Init(u16 arr,u16 psc)
{  
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);  //ʹÄÜGPIOÍâÉèºÍAFIO¸´Óù¦ÄÜÄ£¿éʱÖÓʹÄÜ


GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_6;  //PB9 Çå³ý֮ǰÉèÖà 
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PB9 ÊäÈë  
GPIO_Init(GPIOB, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_7;  //PB9 Çå³ý֮ǰÉèÖà 
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PB9 ÊäÈë  
GPIO_Init(GPIOB, &GPIO_InitStructure);
//
// GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_8;  //PB9 Çå³ý֮ǰÉèÖà 
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PB9 ÊäÈë  
// GPIO_Init(GPIOB, &GPIO_InitStructure);
//
// GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_9;  //PB9 Çå³ý֮ǰÉèÖà 
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PB9 ÊäÈë  
// GPIO_Init(GPIOB, &GPIO_InitStructure);
//

//³õʼ»¯¶¨Ê±Æ÷5 TIM5  
TIM_TimeBaseStructure.TIM_Period = arr; //É趨¼ÆÊýÆ÷×Ô¶¯ÖØ×°Öµ
TIM_TimeBaseStructure.TIM_Prescaler =psc;  //Ô¤·ÖƵÆ÷   
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //ÉèÖÃʱÖÓ·Ö¸î:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIMÏòÉϼÆÊýģʽ
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //¸ù¾ÝTIM_TimeBaseInitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯TIMxµÄʱ¼ä»ùÊýµ¥Î»
  
//³õʼ»¯TIM5ÊäÈë²¶»ñ²ÎÊý
TIM4_ICInitStructure.TIM_Channel = TIM_Channel_1; //  Ñ¡ÔñÊäÈë¶Ë IC1Ó³Éäµ½TI1ÉÏ
TIM4_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //ÉÏÉýÑØ²¶»ñ
TIM4_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //Ó³Éäµ½TI1ÉÏ
TIM4_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;  //ÅäÖÃÊäÈë·ÖƵ,²»·ÖƵ
TIM4_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 ÅäÖÃÊäÈëÂ˲¨Æ÷ ²»Â˲¨
TIM_ICInit(TIM4, &TIM4_ICInitStructure);

TIM4_ICInitStructure.TIM_Channel = TIM_Channel_2; //CC1S=01  Ñ¡ÔñÊäÈë¶Ë IC1Ó³Éäµ½TI1ÉÏ
TIM4_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //ÉÏÉýÑØ²¶»ñ
TIM4_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //Ó³Éäµ½TI1ÉÏ
TIM4_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;  //ÅäÖÃÊäÈë·ÖƵ,²»·ÖƵ
TIM4_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 ÅäÖÃÊäÈëÂ˲¨Æ÷ ²»Â˲¨
TIM_ICInit(TIM4, &TIM4_ICInitStructure);

TIM4_ICInitStructure.TIM_Channel = TIM_Channel_3; //CC1S=01  Ñ¡ÔñÊäÈë¶Ë IC1Ó³Éäµ½TI1ÉÏ
TIM4_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //ÉÏÉýÑØ²¶»ñ
TIM4_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //Ó³Éäµ½TI1ÉÏ
TIM4_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;  //ÅäÖÃÊäÈë·ÖƵ,²»·ÖƵ
TIM4_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 ÅäÖÃÊäÈëÂ˲¨Æ÷ ²»Â˲¨
TIM_ICInit(TIM4, &TIM4_ICInitStructure);

TIM4_ICInitStructure.TIM_Channel = TIM_Channel_4; //CC1S=01  Ñ¡ÔñÊäÈë¶Ë IC1Ó³Éäµ½TI1ÉÏ
TIM4_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //ÉÏÉýÑØ²¶»ñ
TIM4_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //Ó³Éäµ½TI1ÉÏ
TIM4_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;  //ÅäÖÃÊäÈë·ÖƵ,²»·ÖƵ
TIM4_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 ÅäÖÃÊäÈëÂ˲¨Æ÷ ²»Â˲¨
TIM_ICInit(TIM4, &TIM4_ICInitStructure);

//ÖжϷÖ×é³õʼ»¯
NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;  //TIM3ÖжÏ
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;  //ÏÈÕ¼ÓÅÏȼ¶2¼¶
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  //´ÓÓÅÏȼ¶0¼¶
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQͨµÀ±»Ê¹ÄÜ
NVIC_Init(&NVIC_InitStructure);  //¸ù¾ÝNVIC_InitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèNVIC¼Ä´æÆ÷

TIM_ClearITPendingBit(TIM4, TIM_IT_CC1
               |TIM_IT_CC2
               |TIM_IT_CC3
               |TIM_IT_CC4
               |TIM_IT_Update);

TIM_ITConfig(TIM4,TIM_IT_Update
          |TIM_IT_CC1
          |TIM_IT_CC2
          |TIM_IT_CC3
          |TIM_IT_CC4,ENABLE);//ÔÊÐí¸üÐÂÖÐ¶Ï ,ÔÊÐíCC1-4IE²¶»ñÖжÏ

  TIM_Cmd(TIM4,ENABLE );  //ʹÄܶ¨Ê±Æ÷4
}
u8  Hight_Sta;
u8  TIM4_Clear_STA;
u8  TIM4_STA;
u8  TIM4CH1_CAPTURE_STA=0;
u8  TIM4CH2_CAPTURE_STA=0;
u8  TIM4_CAPTURE_CH=0;
u16 TIM4CH1_CAPTURE_VAL; //ÊäÈë²¶»ñÖµ
u16 TIM4CH2_CAPTURE_VAL; //ÊäÈë²¶»ñÖµ

//¶¨Ê±Æ÷4ÖжϷþÎñ³ÌÐò  
void TIM4_IRQHandler(void)
{  
  if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)   
  {
   if(TIM4CH1_CAPTURE_STA)//¸ßµçƽʱ¼äÌ«³¤Í¨µÀÒ»²¶»ñʧ°Ü
   {
    TIM4CH1_CAPTURE_STA=0;
    TIM4CH1_CAPTURE_VAL=Set_Cho_val;
    TIM_SetCounter(TIM4,0);
    TIM_OC1PolarityConfig(TIM4,TIM_ICPolarity_Rising); //CC1P=0 ÉèÖÃΪÉÏÉýÑØ²¶»ñ
   }   
    if(TIM4CH2_CAPTURE_STA)//¸ßµçƽʱ¼äÌ«³¤Í¨µÀ¶þ²¶»ñʧ°Ü
   {
    TIM4CH2_CAPTURE_STA=0;
    TIM4CH2_CAPTURE_VAL=Set_Cho_val;
    TIM_SetCounter(TIM4,0);
    TIM_OC2PolarityConfig(TIM4,TIM_ICPolarity_Rising); //CC1P=0 ÉèÖÃΪÉÏÉýÑØ²¶»ñ
   }   
    TIM_ClearITPendingBit(TIM4, TIM_IT_Update);   
  }
  if (TIM_GetITStatus(TIM4, TIM_IT_CC1) != RESET)//²¶»ñ1·¢Éú²¶»ñʼþ
  {
   if(TIM4CH1_CAPTURE_STA)  //²¶»ñµ½Ò»¸öϽµÑØ   
   {  
    TIM4CH1_CAPTURE_STA=0;   
    TIM4CH1_CAPTURE_VAL=TIM_GetCapture1(TIM4);   
    if(!TIM4CH2_CAPTURE_STA) TIM_SetCounter(TIM4,0);
    TIM_OC1PolarityConfig(TIM4,TIM_ICPolarity_Rising); //CC1P=0 ÉèÖÃΪÉÏÉýÑØ²¶»ñ
    }
    else          //»¹Î´¿ªÊ¼,µÚÒ»´Î²¶»ñÉÏÉýÑØ
   {
    TIM4CH1_CAPTURE_STA=1;  //±ê¼Ç²¶»ñµ½ÁËÉÏÉýÑØ
    TIM4CH2_CAPTURE_STA=1;
    TIM_SetCounter(TIM4,0);
      TIM_OC2PolarityConfig(TIM4,TIM_ICPolarity_Falling);
      TIM_OC1PolarityConfig(TIM4,TIM_ICPolarity_Falling); //CC1P=0 ÉèÖÃΪϽµÑØ
   }
   TIM_ClearITPendingBit(TIM4, TIM_IT_CC1);
  }  
   if (TIM_GetITStatus(TIM4, TIM_IT_CC2) != RESET)//²¶»ñ2·¢Éú²¶»ñʼþ
  {
   if(TIM4CH2_CAPTURE_STA)  //²¶»ñµ½Ò»¸öϽµÑØ   
   {   
    TIM4CH2_CAPTURE_STA=0;   
    TIM4CH2_CAPTURE_VAL=TIM_GetCapture2(TIM4);  
    if(!TIM4CH1_CAPTURE_STA) TIM_SetCounter(TIM4,0);
    TIM_SetCounter(TIM4,0);   
    TIM_OC2PolarityConfig(TIM4,TIM_ICPolarity_Rising);
    }
    else          //»¹Î´¿ªÊ¼,µÚÒ»´Î²¶»ñÉÏÉýÑØ
   {  
    PBout(4)=1;
    TIM4CH1_CAPTURE_STA=1;  //±ê¼Ç²¶»ñµ½ÁËÉÏÉýÑØ
    TIM4CH2_CAPTURE_STA=1;
    TIM_SetCounter(TIM4,0);
      TIM_OC2PolarityConfig(TIM4,TIM_ICPolarity_Falling);
      TIM_OC1PolarityConfig(TIM4,TIM_ICPolarity_Falling); //CC1P=0 ÉèÖÃΪϽµÑØ
   }
    TIM_ClearITPendingBit(TIM4, TIM_IT_CC2);
  }  //Çå³ýÖжϱê־λ

}
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2016-7-18
在线时间
13 小时
 楼主| 发表于 2017-11-23 09:13:31 | 显示全部楼层
这里我使用了定时器3的一二两个通道,需要注意的是我的上升沿是基本上同时到达,所以下降沿的逻辑是只要检测到一路上升沿就触发两个通道的下降沿捕获,所以存在一定误差,另外 TIM4CH2_CAPTURE_VAL=TIM_GetCapture2(TIM4);  读取计数器的值的函数每个通道都有一个,注意区分;
回复 支持 1 反对 0

使用道具 举报

1

主题

14

帖子

0

精华

高级会员

Rank: 4

积分
984
金钱
984
注册时间
2017-11-3
在线时间
63 小时
发表于 2017-11-26 11:53:58 | 显示全部楼层
谢谢分享, lz有完整的代码文件吗? 求一份测试用, 谢谢
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-16 08:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表