一、原理
通过计算两个上升沿之间的时间间隔,计算输入转速信号的频率,计算得到转速。
二、开发环境
开发平台:S32 Design Studio for ARM Version 2018.R1(S32DS)
单片机型号:S32K116
转速信号频率:最小值2KHz+
三、配置
1.引脚界面的配置
这里我使用的是PTD15引脚
2.初始化界面的配置
前提当然要添加FTM_IC模块
3.配置界面的配置
有的通道不支持测量的选项,具体哪些引脚我也没细看,不过配置的时候会提示不支持,如果是自己硬撸代码,需要格外注意一下,不过我想,都能硬撸代码了,应该也看不到我这篇博文了
四、关键代码
1.初始化
static ftm_state_t ftm1StateStruct;
FTM_DRV_Init(INST_FLEXTIMER_IC1, &flexTimer_ic1_InitConfig, &ftm1StateStruct);
FTM_DRV_InitInputCapture(INST_FLEXTIMER_IC1, &flexTimer_ic1_InputCaptureConfig);
2.计算频率
uint32_t inputCaptureMeas = 0;
uint8_t channel = flexTimer_ic1_InputCaptureChannelConfig->hwChannelId;
uint32_t frequency = FTM_DRV_GetFrequency(INST_FLEXTIMER_IC1);
while (1)
{
/* Get values */
inputCaptureMeas = FTM_DRV_GetInputCaptureMeasurement(INST_FLEXTIMER_IC1, channel);
/* Calculate the signal frequency using recorded data*/
inputCaptureMeas = frequency / (inputCaptureMeas);
OSIF_TimeDelay(1000);
}
五、注意事项
1.引脚的选择
要选择引脚描述如FTMx_CHx的引脚。最初我那硬件工程师选了FTM0_FLT2。看了下手册这是故障检测引脚,预想的我那输入频率只有几HZ,就用了中断自己计数,量了一下输入频率后,中断已经不适用了。
2.可检测的最小输入频率
为什么会有最小输入频率。首先说一下计算频率的原理。第一步是获取到两个上升沿的计数值,第二步是通过计数频率(也就是配置界面的Counter clock frequency)除以计数值,得到输入信号的频率。
两个上升沿的计数值怎么来,在两个上升沿的过程中,计数器会持续进行计数,计数频率越高,同一时间内计数值累加的越快。通过函数FTM_DRV_GetInputCaptureMeasurement可以获取到计数值。当超过最大计数值65535过后,计数值会翻转从0开始。
那么对应就会有一个异常情况,计数翻转过后,用计数频率除以计数值,就会得到一个很大的值。
为了避免这样的情况发生,我这里列了一张表格供参考