[应用相关]

定时计数器的溢出作为TRGO

[复制链接]
1308|20
手机看帖
扫描二维码
随时随地手机跟帖
zhuhuis|  楼主 | 2017-7-21 23:45 | 显示全部楼层 |阅读模式
我要用测量定时器仪脉冲周期从而计算频率,计数器的时钟在72M时使用一个定时器捕获,只能测量长910us的脉冲周期, 我需要测量的脉冲宽度最大时为20MS,所以一个定时器不够用,所以我想用定时器(TIM2)作为主从模式, 当脉冲宽度超过910US时(计数器溢出)里用这溢出触发输出TRGO, 然后定时器(TIM3)作为从定时器, TIM3采用外部时钟ITR1(TIM2的TRGO)作为时钟,
现在的问题是脉冲宽度低于910US时 TIM3定时器也在计数。
happy_10| | 2017-7-21 23:46 | 显示全部楼层

定时器配置函数看下

使用特权

评论回复
zhuhuis|  楼主 | 2017-7-21 23:47 | 显示全部楼层

void TIM_Configuration(void)
{
/* 定义 TIM_ICInit 初始化结构体 TIM_ICInitStructure */
TIM_ICInitTypeDef  TIM_ICInitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        /*计数器基本配置*/
        TIM_TimeBaseStructure.TIM_Period = 65535; //
        TIM_TimeBaseStructure.TIM_Prescaler = 0;
        TIM_TimeBaseStructure.TIM_ClockDivision = 0;
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
        TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
/*
*  选择 TIM2 第2通道
*  捕获输入上升沿
*  TIM输入2与IC2相连
*  TIM 捕获在捕获输入上每探测到一个边沿执行一次
*  选择输入比较滤波器0x0
*/

     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 = 0x0;   //不虑波
    TIM_PWMIConfig(TIM2, &TIM_ICInitStructure);  //使用PWM输入模式

/* 选择TIM2输入触发源: TIM 经滤波定时器输入 2  */
   TIM_SelectInputTrigger(TIM2, TIM_TS_TI2FP2);//IC2为触发源

/* 选择从机模式:复位模式 */
    TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset); //

/* 开启主从模式模式 */
   TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable);
                      //生成更新事件
  TIM_UpdateRequestConfig(TIM2, TIM_UpdateSource_Regular);
          //更新事件输出触发//
  TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update);  
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//    TIM3   配置 从定时器, 外部时钟,(TIM2的溢出更新事件输出
//   用于转速脉冲的扩展计数。当转速低于1100转时
        /*tim3 为从模式  外部时钟 TIM2 的TRG0 */
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        TIM_TimeBaseStructure.TIM_Period = 65535; //
        TIM_TimeBaseStructure.TIM_Prescaler = 0;
        TIM_TimeBaseStructure.TIM_ClockDivision = 0;
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
        TIM_SelectInputTrigger(TIM3, TIM_TS_ITR1);//ITR1触发源(定时器TIM2的TRO
         TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_External1); //从模式外部时钟模式1
         /* 使能 TIM2  TIM3计数器 */
       TIM_Cmd(TIM2, ENABLE);
      TIM_Cmd(TIM3, ENABLE);

       /*  开启TIM2的CC2 中断*/
       TIM_ITConfig(TIM2, TIM_IT_CC2, ENABLE);
}

使用特权

评论回复
wenfen| | 2017-7-21 23:48 | 显示全部楼层
时钟分频试过吗?

使用特权

评论回复
zhuhuis|  楼主 | 2017-7-21 23:51 | 显示全部楼层

嗯,误差比较大

使用特权

评论回复
zhuhuis|  楼主 | 2017-7-21 23:52 | 显示全部楼层

我觉得你用两个定时器,误差肯定是大的

使用特权

评论回复
tian111| | 2017-7-21 23:55 | 显示全部楼层
你有没有试过那种计数器 ,就是用一个定时器当溢出中断时标志位+1  来计算

使用特权

评论回复
zhuhuis|  楼主 | 2017-7-21 23:56 | 显示全部楼层
怎么搞

使用特权

评论回复
gongche| | 2017-7-21 23:57 | 显示全部楼层
  if(TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)
        {
                TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
                ifalg++;
        }
        if(TIM_GetITStatus(TIM4,  TIM_FLAG_CC2) != RESET)
        {
          TIM_ClearITPendingBit(TIM4, TIM_FLAG_CC2);
                PWM_count.ut_PWM_Period = TIM_GetCapture2(TIM4);
                itemp=ifalg;
                ifalg=0;
        }   

使用特权

评论回复
gongche| | 2017-7-21 23:58 | 显示全部楼层
但是我这样不知道是什么原因  程序一直在溢出中断中出不来 ,清标志位不管用 ,清不了

使用特权

评论回复
huwr| | 2017-7-23 22:08 | 显示全部楼层
可以用两个定时器接力计数的,以前调过,可是忘了例程放哪了

使用特权

评论回复
zhuhuis|  楼主 | 2017-7-23 22:09 | 显示全部楼层
你这样子使用的话 要把定时器进行同步才行  要不肯定有很大误差,

使用特权

评论回复
gongche| | 2017-7-23 22:11 | 显示全部楼层

嗯,单个定时器 你不用定时器溢出 模式  用 捕获比较 模式 的精度 会高一点的

使用特权

评论回复
zhuhuis|  楼主 | 2017-7-23 22:12 | 显示全部楼层

对啊,因为那样是自动装载 不用你软件处理

使用特权

评论回复
huwr| | 2017-7-23 22:13 | 显示全部楼层

其实你不应该是作为触发,而是级联模式,参考手册有,官方例程也有,叫timer cascade

使用特权

评论回复
huanghuac| | 2017-7-23 22:14 | 显示全部楼层

TIM3使用的是触发模式,所有不需要使能TIM3,而是由TIM2的TRGO信号触发计数,所以屏蔽下面这句:   
//TIM_Cmd(TIM3, ENABLE);

使用特权

评论回复
happy_10| | 2017-7-23 22:15 | 显示全部楼层

因为一开始就使能了TIM3,所有脉冲宽度低于910US时 TIM3定时器也在计数。

使用特权

评论回复
chenho| | 2017-7-23 22:16 | 显示全部楼层

TIM3使用的是触发模式,所有不需要使能TIM3

使用特权

评论回复
gongche| | 2017-7-23 22:17 | 显示全部楼层
/* 选择TIM2输入触发源: TIM 经滤波定时器输入 2  */
   TIM_SelectInputTrigger(TIM2, TIM_TS_TI2FP2);//IC2为触发源

/* 选择从机模式:复位模式 */
    TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset); //

/* 开启主从模式模式 */
   TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable);
                      //生成更新事件
  TIM_UpdateRequestConfig(TIM2, TIM_UpdateSource_Regular);
          //更新事件输出触发//
  TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update);  
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//    TIM3   配置 从定时器, 外部时钟,(TIM2的溢出更新事件输出
//   用于转速脉冲的扩展计数。当转速低于1100转时
        /*tim3 为从模式  外部时钟 TIM2 的TRG0 */

使用特权

评论回复
huanghuac| | 2017-7-23 22:18 | 显示全部楼层

应该是配置哪里出了问题。

STM32F1 官方库3.5里有定时器级联应用的历程,你比较参考下。

。。。\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Examples\TIM\Cascade_Synchro

使用特权

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

本版积分规则

728

主题

8464

帖子

6

粉丝