OpenEdv-开源电子网

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

STM32 F103RET6 脉冲捕获异常

[复制链接]

3

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
160
金钱
160
注册时间
2019-9-16
在线时间
24 小时
发表于 2020-10-10 16:35:44 | 显示全部楼层 |阅读模式
10金钱
小弟实在搞不懂咋回事了。求助一下通过定时器1配置成下降沿捕获脉冲。用函数发生器设置1HZ的。50%占空比的方波。定时器理论上是1秒进一次中断,但是有些时候会1秒进2次。
调整占空比为30%后,中断依然会出现1秒进2次的情况。第一次进入时间较上一次是700ms,下一次是300ms.
通过上面的现象,我感觉就是中断源不对,有些时候中断源反转了。但是不知道问题出在哪。
GPIO_InitTypeDef GPIO_InitStructure;
         TIM_ICInitTypeDef  TIM_ICInitStructure;
   TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;//TIM1ê±»ù
         NVIC_InitTypeDef NVIC_InitStructure;

   /* GPIOB Periph clock enable */
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  /* TIM4 channel 2 pin (PB.07) configuration */
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
//   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
   GPIO_Init(GPIOA, &GPIO_InitStructure);
       
         RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
   TIM_DeInit(TIM1);
   TIM_TimeBaseStructure.TIM_Period =65000-1;//×Ô¶ˉ֨װÖμ   
   TIM_TimeBaseStructure.TIM_Prescaler =3600-1;//Ô¤·ÖÆμÖμ
   TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//êäèëê±Öó2»·ÖÆμ
   TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//ÏòéϼÆêy
   TIM_TimeBaseStructure.TIM_RepetitionCounter=1;
   TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure);

  TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;//êäèëí¨μà

        TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;     //2¶×½Ï½μÑØ
               
        TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;    //2¶×½ÖD¶Ï
               
        TIM_ICInitStructure.TIM_ICPrescaler =TIM_ICPSC_DIV1;       //2¶×½2»·ÖÆμ

        TIM_ICInitStructure.TIM_ICFilter = 0x0;          //2¶×½êäèë2»ÂË2¨
//  TIM_ICInit(TIM1, &TIM_ICInitStructure);
   TIM_PWMIConfig( TIM1, &TIM_ICInitStructure);
   TIM_SelectInputTrigger(TIM1,TIM_TS_TI1FP1);
// TIM_SelectSlaveMode(TIM1, TIM_SlaveMode_Reset);
   TIM_SelectMasterSlaveMode(TIM1,TIM_MasterSlaveMode_Enable);


        NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQn;  //TIM4ÖD¶Ï
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //ÏèÕ¼óÅÏè¼¶1¼¶
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;  //′óóÅÏè¼¶2¼¶
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQí¨μà±»ê1Äü
        NVIC_Init(&NVIC_InitStructure);  //¸ù¾YNVIC_InitStructÖDÖ¸¶¨μÄ2Îêy3õê¼»ˉíaéèNVIC¼Ä′æÆ÷

最佳答案

查看完整内容[请看2#楼]

已解决,硬件滤波问题
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
160
金钱
160
注册时间
2019-9-16
在线时间
24 小时
 楼主| 发表于 2020-10-10 16:35:45 | 显示全部楼层
已解决,硬件滤波问题
回复

使用道具 举报

22

主题

2251

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4480
金钱
4480
注册时间
2013-4-22
在线时间
337 小时
发表于 2020-10-10 16:58:47 | 显示全部楼层
没有清中断标志?
回复

使用道具 举报

3

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
160
金钱
160
注册时间
2019-9-16
在线时间
24 小时
 楼主| 发表于 2020-10-10 18:36:20 | 显示全部楼层
三叶草 发表于 2020-10-10 16:58
没有清中断标志?

清了的。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2020-10-11 00:43:43 | 显示全部楼层
试试其他频率,另外,你的中断处理函数没看到,你看下是不是中断服务函数太多内容了?
回复

使用道具 举报

3

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
160
金钱
160
注册时间
2019-9-16
在线时间
24 小时
 楼主| 发表于 2020-10-12 09:49:36 | 显示全部楼层
正点原子 发表于 2020-10-11 00:43
试试其他频率,另外,你的中断处理函数没看到,你看下是不是中断服务函数太多内容了?

其它频率也试了10,100,1K,都是有问题的,还是有些时候会多进一次中断,获取的计数值小一半。

void  TIM1_CC_IRQHandler(void)
{
      
        static u16 this_time_CH2 = 0;
        static u16 last_time_CH2 = 0;
        static u8 capture_number_CH2 = 0;  //μúò»′νøèë
   
    if( flag_test==0)
                {
                         if(TIM_GetITStatus(TIM1, TIM_IT_CC1)!= RESET)
                                {

                                        if(capture_number_CH2 == 0)
                                        {        
                                                capture_number_CH2 = 1;  
                                                last_time_CH2 = TIM_GetCounter(TIM4);
                                        }
                                        else if(capture_number_CH2 == 1)
                                        {         
                                                this_time_CH2 = TIM_GetCounter(TIM4);                                                
                                                 if(this_time_CH2 > last_time_CH2)
                                                {     
                                                        tmp16_CH2 = this_time_CH2 - last_time_CH2;        
                                                }
                                                else
                                                {  
                                                        tmp16_CH2 = ((65000 - last_time_CH2) + this_time_CH2);
                                                }
                                                last_time_CH2=this_time_CH2;
                                                if(Counter<StandardPulseNum_250mm)
                                                {
                                                        Counter++;
                                                        Interval_Sum+=tmp16_CH2;
                                                }
                                                if(flag_speed ==1)
                                                {
                                                        Counter=0;
                                                        Interval_Sum=0;
                                                        flag_speed=0;
                                                }
                                                if(Counter>=StandardPulseNum_250mm)
                                                {
                                                        Counter=0;
                                                        flag_timeout=0;
                                                        flag_StandardPulseNumUp=1;
                                                }       
                                   }
                               
                        }       
                                                           
                }
                else
                {
                        if(TIM_GetITStatus(TIM1, TIM_IT_CC1|TIM_IT_Update)!= RESET)
                        {
                                testR_PulseCount++;
                        }                               
        }       
    TIM_ClearITPendingBit(TIM1, TIM_IT_CC1|TIM_IT_Update);
}  
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-20 03:00

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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