单片机学习!
目录
文章目录
前言
一、输入捕获测频率配置步骤
二、代码示例及注意事项
2.1 RCC开启时钟
2.2 GPIO初始化
2.3 配置时基单元
2.4 配置输入捕获单元
2.5 选择从模式的触发源
2.6 配置从模式为Reset
2.7 开启定时器
总结
前言
博文介绍如何配置输入捕获电路来测量频率。
一、输入捕获测频率配置步骤
第一步、RCC开启时钟,把GPIO和TIM的时钟打开。
第二步、GPIO初始化,把GPIO配置成输入模式。一般选择上拉输入或者浮空输入模式。
第三步、配置时基单元,让CNT计数器在内部时钟的驱动下自增运行。
第四步、配置输入捕获单元,包括滤波器、极性、直连通道还是交叉通道、分频器这些参数。用一个结构体就可以统一进行配置了。
第五步、选择从模式的触发源,触发源选择为TI1FP1,这里调用一个库函数,给一个参数就行。
第六步、选择触发之后执行的操作,执行Reset操作,这里也是调用一个库函数就行了。
第七步、开启定时器,调用TIM_Cmd函数。
按以上步骤配置,所有的电路就能配合起来,按照需求工作。当需要读取最新一个周期的频率时,直接读取CCR寄存器,然后按照 fc/N 计算以下就行了。
二、代码示例及注意事项
2.1 RCC开启时钟
将需要的TIM外设和GPIO外设的时钟打开。打开时钟后定时器的基准时钟和整个外设的工作时钟就会同时打开。
代码示例:
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//使用APB1的开启时钟函数,因为TIM3是APB1总线的外设。RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
2.2 GPIO初始化
GPIO口可以在引脚定义表中查看:
默认复用功能这一列就是片上外设的端口和GPIO的连接关系。可以找到 TIM3的通道1和通道2对应PA6和PA7;TIM3的通道3和通道4对应PB0和PB1.本文举例使用TIM3的通道1引脚,所以就初始化PA6引脚。
GPIO配置成输入模式,选择上拉输入。
代码示例:
GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode= GPIO_Mode_IPU;//这里选择上拉输入GPIO_InitStruct.GPIO_Pin= GPIO_Pin_6;GPIO_InitStruct.GPIO_Speed= GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStruct);
2.3 配置时基单元
配置时基单元,包括时钟源选择的配置。
- 时基单元选择时钟源。
- 配置时基单元,包括预分频器、自动重装器、计数模式等,这些参数可用结构体配置。
代码示例:
TIM_InternalClockConfig(TIM3);TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_TimeBaseInitStructure.TIM_ClockDivision= TIM_CKD_DIV1;//指定时钟分频TIM_TimeBaseInitStructure.TIM_CounterMode= TIM_CounterMode_Up;//计数器模式TIM_TimeBaseInitStructure.TIM_Period= 65536-1;//ARR自动重装器的值TIM_TimeBaseInitStructure.TIM_Prescaler= 72-1;//PSC预分频器的值TIM_TimeBaseInitStructure.TIM_RepetitionCounter= 0;//重复计数器的值TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);
结构体成员:
- TIM_ClockDivision:指定时钟分频,用于信号经过滤波器时的滤波采样频率。
- TIM_CounterMode:计数器模式,这里选择向上计数模式TIM_CounterMode_Up。
- TIM_Period :ARR自动重装器的值,设置大一些防止计数溢出。这里设置65536-1,也就是16位的计数器满量程计数。
- TIM_Prescaler:PSC预分频器的值,这个值决定了测周法的标准频率fc,72M / 预分频,就是计数器自增的频率,就是计数标准频率。这里给 72-1,这样标准频率就是72M / 72 = 1MHz。
- TIM_RepetitionCounter:重复计数器的值,只有高级定时器才有,本文初始化通用寄存器,所以值给0。
2.4 配置输入捕获单元
代码示例:
TIM_ICInitTypeDef TIM_ICInitStructure;
TIM_ICInitStructure.TIM_Channel=TIM_Channel_1;//TIM_Channel选择通道
TIM_ICInitStructure.TIM_ICFilter=0xF;//TIM_ICFilter用来配置输入捕获的滤波器
TIM_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising;//TIM_ICPolarity极性
TIM_ICInitStructure.TIM_ICPrescaler=TIM_ICSelection_DirectTI;//TIM_ICPrescaler分频器
TIM_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI;//TIM_ICSelection配置数据选择器TIM_ICInit(TIM3,&TIM_ICInitStructure);
TIM_Channel选择通道,因为TIM_ICInit函数只有一个,所以要靠结构体的这个参数来指定是配置哪个通道。这里选择通道1.
TIM_ICFilter用来配置输入捕获的滤波器,如果信号有毛刺和噪声,就可以增大滤波器参数,可以有效避免干扰。参数的取值范围0x0到0xF之间,数越大滤波效果越好,每个数值对应的采样频率和采样次数,可查看参考手册。
注意滤波器和分频器的区别,虽然两者都可以计次,但是滤波器计次并不会改变信号的原有频率,一般滤波器的采样频率会远高于信号频率,所以它只会滤除高频噪声,使信号更平滑,1KHz滤波之后仍然是1KHz,信号频率不会变化。而分频器就是对信号本身进行计次了,会改变频率。1KHz,2分频之后就是500Hz,4分频之后就是250Hz。
TIM_ICPolarity极性,这个对应图中边沿检测、极性选择的部分,选择上升沿触发还是下降沿触发。这里需要上升沿触发。
- TIM_ICPolarity_Rising上升沿触发
- TIM_ICPolarity_Falling下降沿触发
- TIM_ICPolarity_BothEdge上升沿下降沿都触发
TIM_ICPrescaler分频器,这个参数配置的是对应图中触发信号分频器。不分频就是每次触发都有效,二分频就是每隔一次有效一次,以此类推。
- TIM_ICPSC_DIV1 不分频
- TIM_ICPSC_DIV2 二分频
- TIM_ICPSC_DIV4 四分频
- TIM_ICPSC_DIV8 八分频
这个分频值不能任意指定,只能选择这4种,这里需要每次出发都有效,所以选择TIM_ICPSC_DIV1不分频。
TIM_ICSelection选择触发信号从哪个引脚输入,这个参数是配置数据选择器的,可以选择直连通道或者交叉通道。示例选择了TIM_ICSelection_DirectTI直连通道输入。
- TIM_ICSelection_DirectTI直连通道的输入
- TIM_ICSelection_IndirectTI交叉通道的输入
最后把TIM_ICInitStructure结构体地址放在TIM_ICInit函数里。
2.5 选择从模式的触发源
配置TRGI的触发源为TI1FP1.
代码示例:
TIM_SelectInputTrigger(TIM3,TIM_TS_TI1FP1);
* @arg TIM_TS_ITR0: Internal Trigger 0* @arg TIM_TS_ITR1: Internal Trigger 1* @arg TIM_TS_ITR2: Internal Trigger 2* @arg TIM_TS_ITR3: Internal Trigger 3* @arg TIM_TS_TI1F_ED: TI1 Edge Detector* @arg TIM_TS_TI1FP1: Filtered Timer Input 1* @arg TIM_TS_TI2FP2: Filtered Timer Input 2* @arg TIM_TS_ETRF: External Trigger input
这里给出的8个可选触发源对应上图触发源选择的8个模式。这里选择TIM_TS_TI1FP1。
2.6 配置从模式为Reset
代码示例:
TIM_SelectSlaveMode(TIM3,TIM_SlaveMode_Reset);
* @arg TIM_SlaveMode_Reset: Rising edge of the selected trigger signal (TRGI) re-initializes* the counter and triggers an update of the registers.* @arg TIM_SlaveMode_Gated: The counter clock is enabled when the trigger signal (TRGI) is high.* @arg TIM_SlaveMode_Trigger: The counter starts at a rising edge of the trigger TRGI.* @arg TIM_SlaveMode_External1: Rising edges of the selected trigger (TRGI) clock the counter.
这里的4种从模式对应上图中的4种从模式。从模式中还有3个Encoder从模式,是给编码器接口用的,有其他函数可以配置。
例子中选择Reset这个模式。
2.7 开启定时器
开启定时器,调用TIM_Cmd函数。
代码示例:
TIM_Cmd(TIM3,ENABLE);
启动定时器之后,CNT就会在内部时钟的驱动下不断自增。即使信号没有过来,它也会不断自增,等到有信号来的时候,会在从模式的作用下自动清零,不会影响测量。
初始化之后整个电路就可以全自动测量了。
总结
以上就是今天要讲的内容,本文仅仅简单介绍了输入捕获的配置步骤和注意事项。