打印
[STM32F1]

定时器PWM输入捕获怎么没配置计数器时钟频率

[复制链接]
2554|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主

这几天一直在弄定时器PWM输入捕获,发现在初始化定时器时,提供的例程没有配置定时器中计数器TIMx_CNT的时钟频率,
下面就是定时器初始化,这是什么原因呢?

void TIM2_Mode_Config(void)
{
        TIM_ICInitTypeDef TIM_ICInitStructure;           //脉冲输入结构体
       
        TIM_ICInitStructure.TIM_Channel=TIM_Channel_2 ;    //通道TIM2_CH2     
        TIM_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising;    //触发输入信号为上升沿,CCR2存脉冲周期,CCR1存占空比
        TIM_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI;         //通道2即TIM2_CH2对应IC2
        TIM_ICInitStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1;       //脉冲输入每个边沿捕获一次
        TIM_ICInitStructure.TIM_ICFilter=0x00;        //选择输入比较滤波器0x0 ,值为0x0---0xF
       
        TIM_PWMIConfig(TIM2, &TIM_ICInitStructure);
       
        TIM_SelectInputTrigger(TIM2, TIM_TS_TI2FP2);          //选择TIM2输入触发源: TIM 经滤波定时器输入 2
        TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset);    //选择从控制器模式:复位模式
        TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable);          //开启复位模式
        TIM_Cmd(TIM2, ENABLE);   
        TIM_ITConfig(TIM2, TIM_IT_CC2, ENABLE);           //开启 CC2 中断       
}


里面只配置了这个
TIM_ICInitStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1;       //脉冲输入每个边沿捕获一次
怎么没有配置像这样TIM_TIMBsaseStructure.TIM_Prescaler=0  //72MHz,这才是配置计数器时钟频率呀?


手册有这么句话  “配置输入预分频器。在本例中,我们希望捕获发生在每一个有效的电平转换时刻,因此预
分频器被禁止(写TIMx_CCMR1寄存器的IC1PS=00)”
同时,库函数给的注解
#define TIM_ICPSC_DIV1                     ((uint16_t)0x0000) /*!< Capture performed each time an edge is detected on the capture input. */
#define TIM_ICPSC_DIV2                     ((uint16_t)0x0004) /*!< Capture performed once every 2 events. */
#define TIM_ICPSC_DIV4                     ((uint16_t)0x0008) /*!< Capture performed once every 4 events. */
#define TIM_ICPSC_DIV8                     ((uint16_t)0x000C) /*!< Capture performed once every 8 events. */

这其中有什么分别,请教!
沙发
mmuuss586| | 2014-11-3 21:46 | 只看该作者
TIM_ICPrescaler这个设置预分频值;
输入捕获:
中断程序中获取了占空比,周期的计数值,再根据PWM的时钟,就可以算出,频率和占空比;

输入频率不高的话,分频值可以设大点,有条件的话再对输入脉冲滤波;

使用特权

评论回复
板凳
jiashijiang|  楼主 | 2014-11-3 22:08 | 只看该作者
mmuuss586 发表于 2014-11-3 21:46
TIM_ICPrescaler这个设置预分频值;
输入捕获:
中断程序中获取了占空比,周期的计数值,再根据PWM的时钟, ...

谢谢你的回答。
TIM_ICInitStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1;/*!< Capture performed each time an edge is detected on the capture input. */
                                                                             //脉冲输入每个边沿捕获一次
也没有设置定时器中计数器的时钟频率呀?没时钟频率也就算不出来PWM的周期和占空比了?

怎么同一个定时器中有好几个分频器?

使用特权

评论回复
地板
mmuuss586| | 2014-11-4 07:43 | 只看该作者
jiashijiang 发表于 2014-11-3 22:08
谢谢你的回答。
TIM_ICInitStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1;/*!< Capture performed each time ...

时钟频率肯定有啊,你不写的话,就是默认的系统时钟;
如果使用内部振荡器,那最大就是64M

使用特权

评论回复
5
mmuuss586| | 2014-11-4 08:12 | 只看该作者
本帖最后由 mmuuss586 于 2014-11-4 08:17 编辑

TIM_TimeBaseStructure.TIM_Period = 50000;   
  TIM_TimeBaseStructure.TIM_Prescaler = 63;           //63+1=64分频,F=1M   
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;   
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
这是我的部分初始化程序,用的内部时钟,再倍频,64分频,也就是1M的时钟源;
脉冲宽度测量:实际就是检测到输入上升源后,时钟计数了多少次;同时还有一个计数器,2个上升沿间的时钟计数;

你说的时钟源,分频你自己设置的,时钟是知道的;当然不设的话,默认就是系统时钟;

使用特权

评论回复
6
jiashijiang|  楼主 | 2014-11-4 13:14 | 只看该作者
谢谢你的mmuuss586的解答,原来是默认使用了时钟。那应该是72MHz,你的64M又是怎么来的?

使用特权

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

本版积分规则

13

主题

44

帖子

0

粉丝