微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > FTM的PWM、输入捕获、正交解码

FTM的PWM、输入捕获、正交解码

时间:11-27 来源:互联网 点击:

  • 01
    voidic_isr(void)
    02
    {
    03
    uint32cnt;
    04
    if(LPLD_FTM_IsCHnF(FTM1,FTM_Ch0))
    05
    {
    06
    cnt=LPLD_FTM_GetChVal(FTM1,FTM_Ch0);
    07
    Freq1=(g_bus_clock/LPLD_FTM_GetClkDiv(FTM1))/cnt;
    08
    LPLD_FTM_ClearCounter(FTM1);
    09
    LPLD_FTM_ClearCHnF(FTM1,FTM_Ch0);
    10
    }
    11
    }

    Line 4:首先调用LPLD_FTM_IsCHnF()函数判断是不是FTM1的Ch0通道产生的捕获事件,因为每个FTMx的所有通道中断都是公用一个中断函数的,所以为了安全,必须在中断中判断是哪个通道产生的中断。
    Line 6:获得Ch0通道的计数值,并存到临时变量cnt中。这个值就是C0V小朋友在事件来临的一瞬间,从CNT那里记录下来的计数值。
    Line 7:用上将讲到的频率计算公式来计算出PWM的频率。这里LPLD_FTM_GetClkDiv()可以得到我们初始化时设置的计数器分频系数,g_bus_clock变量是总线频率的数值,用(g_bus_clock/LPLD_FTM_GetClkDiv(FTM1))就得到了计数器CNT的技术频率,在除以cnt计数值,得到的就是输入方波的频率。
    Line 8:用LPLD_FTM_ClearCounter()函数清空CNT小朋友的计数值,以便我们下次中断获取的值是从0开始的,方便计算。
    Line 9:用LPLD_FTM_ClearCHnF()函数清除Ch0通道的中断标志。

    正交解码

    正交解码原理

    讲到正交解码,其实并没有什么神秘的,名字听起来挺高端大气上档次的,其实实现起来非常简单,我觉得反而是FTM模块中最简单的功能。首先要清楚正交解码是干嘛用的,举个栗子?霍尔编码器是常用的电机测速传感器,他不仅可以测速,还可以知道电机的正转还是反转,靠的就是他能输出两路正交信号,我们可以通过正交信号的相位差来识别出当前电机的转动方向。因此有了FTM模块,我们就可以将这两路正交信号PhA和PhB输入到FTM的正交输入通道,通过正交解码功能,直接读取脉冲的计数值,这个计数值是有符号的,正数代表正转,负数则代表反转。

    具体到FTM内部时怎样工作的,还要提到CNT小朋友,在正交解码模式下,他不再按照SC给定的规则喊号了,而是根据两路PhA和PhB正交信号的状态来计数。你也可以理解为CNT小朋友是一个解码员,当然具体是增计数还是减计数,不是CNT说了算,FTM内部有一套复杂的机制决定。而且这个正交解码功能有两种解码方法可以选择,分别是计数和方向编码、相位A和相位B编码。他们的解码方法如下面两图所示:
    上图是计数和方向编码方法,红框后面的波形是FTM输入通道PhB的波形,它代表计数方向,篮框后面的波形是FTN输入通道PhA的波形,它代表计数个数,这是一种编码方法,当PhB为高电平时,CNT加计数,当PhB低电平时,CNT减计数,计数频率由PhA决定。从图中还可以看出,CNTIN小朋友决定从什么数开始计数,MOD小朋友决定计数到什么时候产生溢出中断。
    上图是相位A和相位B编码方法,这个是我们常用的正交解码模式,也是霍尔编码传感器两路波形输出的方式。从图中可以看到,当PhA和PhB处于特定的电平和边沿时,他们的状态共同决定了CNT是增还是减。具体原则如下:
    CNT小朋友增计数时看到的是:
    A上升沿,B逻辑低
    B上升沿,A逻辑高
    B下降沿,A逻辑低
    A下降沿,B逻辑高
    CNT小朋友减计数时看到的是:
    A下降沿,B逻辑低
    B下降沿,A逻辑高
    B上升沿,A逻辑低
    A上升沿,B逻辑高

    正交解码例程讲解

    要测试正交解码例程,首先你要准备两路正交信号,可以用霍尔编码器的信号直接输入。打开例程“LPLD_QuadratureDecoder”,看正交解码初始化函数qd_init()的代码:

    1
    ftm_init_struct.FTM_Ftmx=FTM1;//只有FTM1和FTM2有正交解码功能
    2
    ftm_init_struct.FTM_Mode=FTM_MODE_QD;//正交解码功能
    3
    ftm_init_struct.FTM_QdMode=QD_MODE_PHAB;//AB相输入模式
    4
    LPLD_FTM_Init(ftm_init_struct);
    5
    LPLD_FTM_QD_Enable(FTM1,PTB0,PTB1);

    Line 2:配置FTM1为正交解码功能,这里需要注意的是,FTM中只有FTM1和FTM2具有正交解码输入通道,FTM0是没有的。
    Line 3:选择解码模式为AB相输入模式解码QD_MODE_PHAB。
    Line 5:使能FTM1的正交解码物理输入引脚,调用LPLD_FTM_QD_Enable()函数,第二个参数是PhA相的物理引脚,第三个参数的PhB的。关于此函数的参数的具体范围,请参考FTM模块的在线函数手册(点击进入)。

    正交解码初始化完毕后,还要初始化定时中断模块,因为我们要在固定的间隔时间内获取计数值才能计算出频率,所以就务必会用到PIT模块。pit_init()函数是PIT初始化函数,相信大家都能读懂,这里我就不重复解释了。下面直接看PIT的中断函数代码:

    1
    qd_result=LPLD_FTM_GetCounter(FTM1);
    2
    LPLD_FTM_ClearCounter(FTM1);

    Line 1:LPLD_FTM_GetCounter()

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top