打印
[STM32F1]

求助,TIM4通道1用于捕获一路信号频率,通道2用于捕获另一路信号高电平宽度

[复制链接]
1584|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sallychen|  楼主 | 2014-10-17 14:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
菜鸟一枚,用stm32f103同时捕获两路信号的频率和高电平宽度时,频率不对,脉冲宽度也偏小,不清楚是哪里问题,还请各位大神帮忙,程序如下:

void CAPTURE_GPIO_Configuration(void)
{
    GPIO_InitTypeDef GPIO_InitStructure; /

   
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
  
        /*频率捕获IO口配置*/
                  
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;         
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOB,&GPIO_InitStructure);
       
        GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_7;   
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
         
        GPIO_Init(GPIOB, &GPIO_InitStructure);
        GPIO_ResetBits(GPIOB,GPIO_Pin_7);       

}
  
  void SetTIM4_NVIC(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;

        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
       
        NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQChannel;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}
  void TIM4_Configuration(void)
{
                   
        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
           TIM_ICInitTypeDef TIM_ICInitStructure ;

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
   
       TIM_TimeBaseStructure.TIM_Prescaler = 72-1;
  
        TIM_TimeBaseStructure.TIM_Period = 0XFFFF;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up ;        
    TIM_TimeBaseStructure.TIM_ClockDivision =0 ;
    TIM_TimeBaseInit( TIM4, &TIM_TimeBaseStructure);
       
        /*频率捕获寄存器配置TIM1_Channel_1*/
        TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
       
        TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising ;
        TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI ;
        TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1 ;
        TIM_ICInitStructure.TIM_ICFilter = 0x0;
        TIM_ICInit( TIM4, &TIM_ICInitStructure);
       
        TIM_ARRPreloadConfig(TIM4,ENABLE);
        TIM_ITConfig(TIM4, TIM_IT_CC1, ENABLE) ;
        TIM_ClearFlag(TIM4, TIM_FLAG_Update);          

        /*高电平脉宽寄存器配置TIM1_Channel_2*/
        TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
    TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising ;
        TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI ;
        TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1 ;
        TIM_ICInitStructure.TIM_ICFilter = 0x0;
        TIM_ICInit( TIM4, &TIM_ICInitStructure);  

        TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE) ;
        TIM_ITConfig(TIM4, TIM_IT_CC2, ENABLE) ;
        TIM_Cmd(TIM4, ENABLE);
                  
}
void TIM4_IRQHandler(void)                 
{
    if(TIM_GetITStatus( TIM4, TIM_IT_CC1)==SET)
   {
         /* Clear TIM4 update interrupt */
               TIM_ClearITPendingBit(TIM4,TIM_IT_CC1);
        if(Capture_number==0)
           {
              Ic1_Read_Value = TIM_GetCapture1(TIM4);
                  Capture_number = 1 ;
                 }
            if(Capture_number==1)
               {
              Ic2_Read_Value= TIM_GetCapture1(TIM4) ;
                  if(Ic2_Read_Value>Ic1_Read_Value)
                  {
                    Capture = (Ic2_Read_Value-Ic1_Read_Value);
                 }
                else
                   {
                    Capture = (65536 -Ic1_Read_Value + Ic2_Read_Value) ;
                  }
                     Capture_number = 0 ;
            }
        }         

         /*脉宽捕获*/
        else if((TIM4CH2_CAPTURE_STA&0X8000)==0)
               
        {          
                if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)
                 
                {
                             
                        if(TIM4CH2_CAPTURE_STA&0X4000)
                        {
                                if((TIM4CH2_CAPTURE_STA&0X3FFF)==0X3FFF
                                {
                                        TIM4CH2_CAPTURE_STA|=0X8000;
                                        TIM4CH2_CAPTURE_VAL=0XFFFF;
                                }
                                else
                                TIM4CH2_CAPTURE_STA++;
                        }         
                }
            else if (TIM_GetITStatus(TIM4, TIM_IT_CC2) != RESET)/
                {
                       
                        if(TIM4CH2_CAPTURE_STA&0X4000)                               
                        {                                 
                                TIM4CH2_CAPTURE_STA|=0X8000;               
                                TIM4CH2_CAPTURE_VAL=TIM_GetCapture2(TIM4);
                                   TIM_OC2PolarityConfig(TIM4,TIM_ICPolarity_Rising);
                        }
                        else                                                                 
                        {
                                TIM4CH2_CAPTURE_STA=0;                       
                                TIM4CH2_CAPTURE_VAL=0;
                                 TIM_SetCounter(TIM4,0);
                                TIM4CH2_CAPTURE_STA|=0X4000;               
                                   TIM_OC2PolarityConfig(TIM4,TIM_ICPolarity_Falling);       
                        }                    
                }
                 TIM_ClearITPendingBit(TIM4,TIM_IT_Update); //中断结束后,清除中断标志位
                 TIM_ClearITPendingBit(TIM4,TIM_IT_CC2); //中断结束后,清除中断标志位                                                                                   
        }

        /*脉宽捕获计算*/
        if(TIM4CH2_CAPTURE_STA&0X8000)
                   {
                        temp=TIM4CH2_CAPTURE_STA&0X3FFF;
                        temp*=65536;
                        temp+=TIM4CH2_CAPTURE_VAL;
                        TIM4CH2_CAPTURE_STA=0;
                   }        
}


沙发
mmuuss586| | 2014-10-17 18:46 | 只看该作者
关掉一路可以吗?
可以的话,就是2路同时开有影响,那只能提高代码效率了;

使用特权

评论回复
板凳
sallychen|  楼主 | 2014-10-20 10:42 | 只看该作者
mmuuss586 发表于 2014-10-17 18:46
关掉一路可以吗?
可以的话,就是2路同时开有影响,那只能提高代码效率了; ...

两路信号同时捕获时,脉宽偏小,频率显示inf;频率捕获的管脚不接信号时,高电平测出来是准确的,请问下如何提高代码效率?

使用特权

评论回复
地板
mmuuss586| | 2014-10-20 18:18 | 只看该作者
sallychen 发表于 2014-10-20 10:42
两路信号同时捕获时,脉宽偏小,频率显示inf;频率捕获的管脚不接信号时,高电平测出来是准确的,请问下 ...

少用固件库,读写寄存器;
提高系统时钟频率;

使用特权

评论回复
5
sallychen|  楼主 | 2014-10-21 15:45 | 只看该作者
mmuuss586 发表于 2014-10-20 18:18
少用固件库,读写寄存器;
提高系统时钟频率;

请问一下,中断服务函数这样写有影响么?

使用特权

评论回复
6
mmuuss586| | 2014-10-21 20:06 | 只看该作者
你这中断函数,内容也太多了;
中断函数尽量短;
很多判断尽量放主程序判断;

比如你计算频率,可以放主程序计算;

使用特权

评论回复
7
sallychen|  楼主 | 2014-10-22 13:23 | 只看该作者
恩,是中断函数的问题,谢谢你的回复

使用特权

评论回复
8
sallychen|  楼主 | 2014-10-22 21:59 | 只看该作者
mmuuss586 发表于 2014-10-21 20:06
你这中断函数,内容也太多了;
中断函数尽量短;
很多判断尽量放主程序判断;

这个要怎么结贴啊?分数给不了呢

使用特权

评论回复
9
mmuuss586| | 2014-10-23 08:26 | 只看该作者

使用特权

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

本版积分规则

2

主题

6

帖子

0

粉丝