K60-脉冲计数采集
之前在做智能车的时候需要对LC振荡电路进行频率采集(其实如果频率变化率比较大,直接选择去掉整流电路采集电压的变化也可行),研究了一段时间的K60脉冲计数。K60本身的配置和功能就不多说了,就直接切入正题吧。(以下的所有代码都是基于LPLD库实现的,野火或者山外的就自己去论坛找找,有相应的实现代码)
FTM脉冲计数
FTM模块是一个多功能定时器模块,主要功能有PWM输出、输入捕捉、输出比较、定时中断、脉冲加减计数、脉冲周期脉宽测量。K60中包含有3个互相独立的FTM模块:FTM0、FTM1、FTM2,其中MK60F系列还含有额外的FTM3模块。FTM模块最常用的功能是实现PWM输出,但是只有FTM1、FTM2模块具备正交解码功能,而正交解码功能正是我们实现脉冲计数采集所需要的。
PS:实际上FTM的输入捕获也是可以实现脉冲计数的,但是一方面考虑到是通过软件中断,本身程序中已经有设置了一个中断进行K60控制,担心会影响主要程序的运行,另一方面,输入捕捉在频率较高的情况下采集精度不高,不适合对脉冲数进行处理。
正交解码听起来挺厉害的,但是实际上实现起来恨简单(反正都是调用库函数),正交解码最常用的是用来采集编码器的正反信号,那个就是采集的脉冲信号,如果我们只考虑编码器的正转的话就完全可以等效为脉冲计数采集,同时及时在较高频率的情况下也能保证精度。
下面就给出具体的代码:
//初始化FTM的正交解码模块,其中通道0为需要采集的脉冲端口,通道1接地
void Qd_Init(void)
{
FTM_InitTypeDef ftm_init_struct;
ftm_init_struct.FTM_Ftmx = FTM2; //只有FTM1和FTM2有正交解码功能
ftm_init_struct.FTM_Mode = FTM_MODE_QD; //正交解码功能
ftm_init_struct.FTM_QdMode = QD_MODE_CNTDIR; //计数和方向解码模式
ftm_init_struct.FTM_ClkDiv = FTM_CLK_DIV64; //128分频
LPLD_FTM_Init(ftm_init_struct); //初始化FTM
}
//获取脉冲数
short int pulseCount = LPLD_FTM_GetCounter(FTM2); //获取计数器中采集到脉冲数
LPLD_FTM_ClearCounter(FTM2); //每次采集之后都要对FTM计数器清零
PS:如果出现采集的数据一直是65535之类的,很有可能是数据类型出错了,尝试一下其他的整数类型