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

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

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

  • 此我们的初始化函数初始化PWM频率为50,定位pwm_init()函数,看其代码:

    01
    ftm_init_struct.FTM_Ftmx=FTM0;//使能FTM0通道
    02
    ftm_init_struct.FTM_Mode=FTM_MODE_PWM;//使能PWM模式
    03
    ftm_init_struct.FTM_PwmFreq=50;//PWM频率50Hz
    04
    LPLD_FTM_Init(ftm_init_struct);
    05
    LPLD_FTM_PWM_Enable(FTM0,//使用FTM0
    06
    FTM_Ch0,//使能Ch0通道
    07
    angle_to_period(0),//初始化角度0度
    08
    PTC1,//使用Ch0通道的PTC1引脚
    09
    ALIGN_LEFT//脉宽左对齐
    10
    );

    Line 1:使能FTM0通道。
    Line 2:配置FTM_Mode成员变量,使用FTM的PWM输出功能。
    Line 3:配置PWM输出的频率为50Hz,你只要直接写频率的数值即可,至于刚才讲的CNTIN、MOD、SC寄存器的值,库函数会自动搞定。而且切记,每个FTMx只能产生一种频率,这个频率在初始化配置时就确定了,如果你想用第二种频率,就使能再初始化FTM1或FTM2了。
    Line 4:调用FTM通用初始化函数初始化该模块。
    Line 5:PWM通道输出使能函数,你光配置了FTM0的PWM输出功能还不够,还要决定用哪个PWM通道来输出波形哦!其中FTM0有8个通道,这里使能通道0 FTM_Ch0,每个通道又可能有不同的物理输出引脚,这里用CH0的PTC1引脚来输出PWM,还要配置占空比,这里我们用了自定义函数angle_to_period()来将舵机的角度值转化为函数需要的占空比值。最后一个参数是PWM脉宽的对其方式,默认是左对齐。关于此函数的参数的具体范围,请参考FTM模块的在线函数手册(点击进入)。

    初始化完成后的代码如下所示:

    1
    delay(1000);
    2
    //初始化延时后改变角度为45度
    3
    LPLD_FTM_PWM_ChangeDuty(FTM0,FTM_Ch0,angle_to_period(45));

    Line 1:在初始化完毕后,首先应该延时一段时间,以保证舵机可以有足够的时间归位。
    Line 3:调用LPLD_FTM_PWM_ChangeDuty()函数来改变CH0通道的占空比,该函数和PWM通道使能函数的个别参数一样,使用时最好先参考在线函数手册。

    输入捕获功能

    IC工作原理

    IC就是Input Capture的英文缩写,即输入捕获。很多新手不仅疑惑FTM,还疑惑他怎么还有这么多功能,更疑惑这么多功能中输入捕获到底干什么用。首先FTM为什么除了能生成PWM,还有其他功能,这都是因为他有这么多给力的小伙伴(寄存器),上面介绍那些小朋友不仅能生成PWM,还能利用自身特长,摇身一变成输入捕获功能。那么输入捕获有什么用呢,输入什么?捕获什么?他就像PWM的逆变一样,通过输入PWM方波,捕获上升沿或者下降沿,来计算出PWM的频率或者占空比。
    那么这几个小朋友是怎么工作,来实现输入捕获功能的呢,且听我一一道来。首先CnV小朋友不再负责记住一个数了,而是随时待命,随时准备记录下CNT小朋友喊的数字。当FTM的输入通道产生一个上升沿或者下降沿的时候,就会产生一个中断,这是CnV小朋友就会立刻记录下CNT小朋友喊的数字,我们只要知道两次中断之间CnV小朋友记录的计数的差,就可以间接计算出中断间隔时间了,从而可以计算出PWM方波的频率。当然CNT小朋友喊号的频率还是有SC小朋友决定的。假设我们知道CNT喊号的频率为fCNT,CnV自从上次中断后记录的计数差为cv,配置捕获上升沿时产生中断,那么两次中断的时间差的倒数就是PWM方波的频率:

    输入PWM频率=fCNT/cv

    同样还是来看一下我从技术文档中截下来的图,原图初出自Figure 39-175。红框圈出来的是FTM的通道输入,这个通道在物理引脚上和PWM的输出通道是共用的,只不过随着功能的不同,输入输出都可以。橙色圈代表的是判断到底是上升沿还是下降沿来触发冲断。深色绿圈代表了CnV在这个事件来临的时候记录下CNT的数值,浅绿色是CNT计数器的值。蓝色圈代表我们即将产生的中断信号。

    IC例程讲解

    打开例程“LPLD_InputCapture”,在这里例程中,我们利用FTM0生成一路PWM,用于测试他的频率,用FTM1配置为输入捕获模块,来采集PWM并计算他的频率。pwm_init()初始化函数的代码我们就不赘述了,相信大家都能看懂,直接看下输入捕获的初始化函数ic_init()的代码:

    1
    ftm1_init_struct.FTM_Ftmx=FTM1;//使能FTM1通道
    2
    ftm1_init_struct.FTM_Mode=FTM_MODE_IC;//使能输入捕获模式
    3
    ftm1_init_struct.FTM_ClkDiv=FTM_CLK_div128;//计数器频率为总线时钟的128分频
    4
    ftm1_init_struct.FTM_Isr=ic_isr;//设置中断函数
    5
    LPLD_FTM_Init(ftm1_init_struct);
    6
    LPLD_FTM_IC_Enable(FTM1,FTM_Ch0,PTB0,CAPTURE_RI);
    7
    LPLD_FTM_EnableIrq(ftm1_init_struct);

    Line 2:配置FTM1为输入捕获模式。
    Line 3:设置计数器的分频系数为128,刚才我们讲过要计算PWM的频率,就要知道CNT计数器的频率,在OSKinetis固件库中,CNT的时钟源为总线时钟,如果这里设置为FTM_CLK_div128,那么CNT的频率就是总线频率/128。
    Line 4:设置FTM的中断函数,用于处理捕获事件。
    Line 6:使能输入捕获的输入通道,和PWM的使能通道同理,这里要设置需要用到的通道号为FTM_Ch0,通道对应的物理引脚为PTB0,捕获边缘为上升沿CAPTURE_RI。关于此函数的参数的具体范围,请参考FTM模块的在线函数手册(点击进入)。
    Line 7:一定要记住使能中断。

    输入捕获初始化完毕后,FTM1就会在PTB0有输入PWM的时候产生中断了,接下来看一下其中断函数是怎么写的:

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

网站地图

Top