打印
[STM32F4]

再讨论学习TIM的输入捕捉问题

[复制链接]
1728|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wenny0000|  楼主 | 2014-1-21 00:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 wenny0000 于 2014-1-21 01:48 编辑

目的:测量输入脉冲信号的脉冲个数,当达到自己希望的个数时,开始处理其他。还需要一直检测信号的频率变换。
实现与思路:采用TIM4_CH2接入脉冲信号。脉冲的测量依赖开通TIM4_CH2为输入捕捉模式。频率的测量还不知道。
问题:看了网页上不通的帖子,整理学习如下
(1)没有理解TIM 对输入捕捉的操作过程。最后捕获输出的是什么?如下函数示
          value = TIM_GetCapture2(TIM4); value代表什么?
(2)TIME的配置
        TIM_TimeBaseStructure.TIM_Period =0xffff; //自动重装载寄存器的值
        TIM_TimeBaseStructure.TIM_Prescaler =0; //TIM4时钟频率除数的预分频值
        TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; //采样分频
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式
        TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
  这里的自动重载寄存器的值,是值当TIM计满后自动重载,那么是输入信号脉冲个数,还是后台时钟的沿个数?
(3)怎么去搞信号频率呢?

晕头转向中
沙发
wenny0000|  楼主 | 2014-1-21 00:50 | 只看该作者
偷个懒,把人家的帖子,整理下,拿来贴出来。请大家帮忙在此基础上给下指导。
//初始化+中断向量
void TIMER_Configuration(void)
{
    TIM_ICInitTypeDef        TIM_ICInitStructure;   // 通道输入初始化结构
     TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;        //定时器初始化结构
         NVIC_InitTypeDef  NVIC_InitStructure;
         
                  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);  
                  NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
                  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
                  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
                  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
                  NVIC_Init(&NVIC_InitStructure);       

        TIM_TimeBaseStructure.TIM_Period =0xffff; //自动重装载寄存器的值,这个怎么设置
        TIM_TimeBaseStructure.TIM_Prescaler =0; //TIM4时钟频率除数的预分频值
        TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; //采样分频
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式
        TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);   

        TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;                   //选择通道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 = 0x01;              //选择输入比较滤波器,滤波设置,经历几个周期跳变认定波形稳定0x0~0xF
        TIM_ICInit(TIM4, &TIM_ICInitStructure);      

        //TIM_PWMIConfig(TIM4, &TIM_ICInitStructure);              //这个怎么用,现在是不用的?

        TIM_SelectInputTrigger(TIM4, TIM_TS_TI2FP2);            //还有这个,直接晕死,没有去看明白
        TIM_SelectSlaveMode(TIM4, TIM_SlaveMode_Reset);
        TIM_SelectMasterSlaveMode(TIM4, TIM_MasterSlaveMode_Enable);                                                                                                                        
//        TIM_ITConfig(TIM2,TIM_IT_CC2,ENABLE);                    //这个是否不对呢?
        TIM_Cmd(TIM4, ENABLE); //开启时钟               
        TIM_ITConfig(TIM4, TIM_IT_CC2, ENABLE);                                                                  
}

//----------------------------配属中断函数
void TIM4_IRQHandler(void)
{  
    u8 i;
     RCC_ClocksTypeDef RCC_Clocks;
     RCC_GetClocksFreq(&RCC_Clocks);
     GPIO_SetBits(GPIOB,GPIO_Pin_7);                  
         TIM_ClearITPendingBit(TIM4, TIM_IT_CC2);
         IC2Value = TIM_GetCapture2(TIM4);         //获取捕获数值  
      //  测量频率呢?
}

使用特权

评论回复
板凳
jjjkkk00| | 2014-1-21 09:01 | 只看该作者
测量频率有两种常用的方式:
一是用TIM或EXTI捕获两个上升(下降)沿,用TIM或SYSTICK计算两次捕获的时间差;
主要的优点是可以捕获任意频率。
二是配置TIM从模式、SMS[2:0]复位模式,用TIM捕获一个上升沿,读取TIM的CCR中的计数值,这个计数值就是时间差;
主要的缺点是捕获的频率范围受TIM的配置影响,对于超出范围的频率无法捕获。

使用特权

评论回复
地板
jjjkkk00| | 2014-1-21 09:17 | 只看该作者
本帖最后由 jjjkkk00 于 2014-1-21 09:20 编辑

附上以前的方式二的配置函数,给你参考优化:
可获取信号周期1~65535us,即频率范围1M~15.25Hz
你在中断函数里读取TIM3->CCR1的值,放入数组,就可以调试了玩了。
//param SysFreq:CPU频率,单位MHz
void TIM3CH1_GetFrequencyConfig(u8 SysFreq)
{
  //配置IO口PA6为浮空输入
  RCC->APB2ENR |= 0x0005; //使能APB2外设时钟:GPIOA, AFIO
  GPIOA->CRL &= 0xF0FFFFFF;
  GPIOA->CRL |= 0x04000000;

  //配置TIM
  RCC->APB1ENR |= 0x00000002; //使能APB1外设时钟:TIM3
  TIM3->PSC = SysFreq-1;//预分频器
  TIM3->ARR = 0xFFFF;//自动重装载的值
  TIM3->CR1 = 0x0000;
  TIM3->CCMR1 &= 0xFF00;//输入捕获设置、捕获边沿设置
  TIM3->CCMR1 |= 0x0001;
  TIM3->CCER &= 0xFFF0;//计数器的值是否能捕获入TIMx_CCR1寄存器
  TIM3->CCER |= 0x0001;
  TIM3->SMCR &= 0xFF00;//从模式、复位模式
  TIM3->SMCR |= 0x00D4;
  TIM3->DIER |= 0x0002;//中断使能
  
  TIM_Cmd(TIM3, ENABLE);
}

使用特权

评论回复
5
wenny0000|  楼主 | 2014-1-22 00:08 | 只看该作者
谢谢,我先消化下先。

使用特权

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

本版积分规则

3

主题

18

帖子

0

粉丝