频率测量:测频法--适用于高频信号
测周法--用的频率在两个上升沿内记数得周期为
,取反即为频率
中界频率--上下两式N相等时求解fx得出,fm用于选取用测频法/侧周法
采用测周法:
ICXPS信号每触发一次 ,计数寄存器CNT转存入CCR一次,两次触发计数即可反应周期
TI1 -->滤波(fDTS为滤波器采样频率)-->捕获上升沿/下降沿
从模式
TIM_SelectInputTrigger
从模式选择信号源-->选择从模式功能(从模式中可以设置硬件自动完成计数器清零)
上升沿触发CCR1捕获(同时触发从模式,对CNT先存入CCR1再清零),周期 = fc / CCR1
下降沿触发CCR2捕获
通过CCR2即可得到高电平时间,进而可得占空比(PWMI模式)
每个滤波器和边缘检测器可以输出两路信号,可以设置TI1FP1-->IC1进入捕获通道1,TI2FP1-->IC2进入捕获通道1(直连通道)
捕获通道配置为交叉通道:即选择另一通道信号进入:TI1FP2-->IC2进入捕获通道2,同理对TI2输入。(交叉通道)
即可选择两通道一个引脚输入,也可以一个通道由两个引脚输入。
输入捕获配置顺序:
1、配置RCC时钟,开启GPIO与TIM
2、GPIO配置:输入模式(上拉或者浮空)AF_PP
3、TIM时基单元配置
//配置时基单元
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;//时钟源滤波器采样分频系数选择
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStructure.TIM_Period = 65536 - 1;//0~65535重装载值ARR,给最大值防止溢出
TIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1;//0~65535预分频值PSC
//1mhz计数标准频率
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;//高级计数器才有
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseInitStructure);//此处初始化完成后会立刻产生更新事件,导致立刻进入中断,所以需要置中断标志位为0
4、配置输入捕获单元(滤波器、极性、直连通道/交叉通道、分频器)
//配置输入捕获单元
TIM_ICInitTypeDef TIM_ICInitStructure;
TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
TIM_ICInitStructure.TIM_ICFilter = 0XF; //滤波器设置,数越大,滤波效果越好,对应的采样频率和次数在手册
TIM_ICInitStructure.TIM_ICPolarity =TIM_ICPolarity_Rising;//设置极性设置上升沿
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;//不分频
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;//设置数据选择器,配置直连通道、交叉通道,选择直连
TIM_ICInit(TIM4, &TIM_ICInitStructure);
5、从模式触发源(TRGI)选择(文中为TI1FP1),选择从模式功能
//从模式触发源选择TI1FP1
TIM_SelectInputTrigger(TIM4, TIM_TS_TI1FP1);
//从模式,设置为reset功能,每触发一次高电平就重新开始计数
TIM_SelectSlaveMode(TIM4, TIM_SlaveMode_Reset);
6、TIM_Cmd使能时钟
双通道捕获获取占空比:
void IC_int(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
TIM_InternalClockConfig(TIM4);
//配置时基单元
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;//时钟源滤波器采样分频系数选择
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStructure.TIM_Period = 65536 - 1;//0~65535重装载值ARR,给最大值防止溢出
TIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1;//0~65535预分频值PSC
//1mhz计数标准频率
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;//高级计数器才有
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseInitStructure);//此处初始化完成后会立刻产生更新事件,导致立刻进入中断,所以需要置中断标志位为0
//配置输入捕获单元
//CH1配置
TIM_ICInitTypeDef TIM_ICInitStructure;
TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
TIM_ICInitStructure.TIM_ICFilter = 0xF; //滤波器设置,数越大,滤波效果越好,对应的采样频率和次数在手册
TIM_ICInitStructure.TIM_ICPolarity =TIM_ICPolarity_Rising;//设置极性设置上升沿
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;//不分频
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;//设置数据选择器,配置直连通道、交叉通道,选择直连
TIM_ICInit(TIM4, &TIM_ICInitStructure);
//CH2配置
// TIM_ICInitTypeDef TIM_ICInitStructure2;
// TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
// TIM_ICInitStructure.TIM_ICFilter = 0xF;
// TIM_ICInitStructure.TIM_ICPolarity =TIM_ICPolarity_Falling;//下降沿
// TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
// TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_IndirectTI;//接受通道配置为交叉通道即接受TI1FP2信号
// TIM_ICInit(TIM4, &TIM_ICInitStructure);
//以上代码,等价于
TIM_PWMIConfig(TIM4, &TIM_ICInitStructure);//自动把通道初始化为相反的配置
//从模式触发源选择TI1FP1
TIM_SelectInputTrigger(TIM4, TIM_TS_TI1FP1);
//从模式,设置为reset功能,每触发一次高电平就重新开始计数
TIM_SelectSlaveMode(TIM4, TIM_SlaveMode_Reset);
TIM_Cmd(TIM4, ENABLE);
}