FTM是一个奇特的模块,他能输出PWM,能输入捕获,能输出比较还能正交解码。英文全称是FlexTimer Module,你能够了解为高档定时器模块、易用定时器模块等等。不只仅在Kinetis 32位处理器中,FTM是个常用的模块,在飞思卡尔的8位处理器中,他也是个常用的模块,只不过名字叫TPM。FTM会用了,飞思卡尔的其他单片机的FTM、TPM你就都会用了。在OSKinetis固件库中,咱们能够用FTM模块来完结PWM、输入捕获和正交解码等常用功用,借用库函数完结功用不难,难的是了解这些功用怎样用、什么原理才是最重要的,下面咱们逐个介绍这3个功用。当然看完本文你就能用寄存器编写FTM的各个功用吗,呵呵,不或许的!否则要那1000多页的技能文档干什么用,可是我期望本文能起到抛砖引玉的功用,在你会用库函数的基础上,对他的内部机制有一个了解。
介绍几个小伙伴(FTM寄存器)
要想搞清楚FTM模块,首要咱们要介绍几个重要的寄存器给咱们,他们就像小伙伴相同,好好运用能够帮大忙呢。
- FTMx_CNT小朋友(计数器寄存器),他担任喊号(计数)。
- FTMx_SC小朋友(状况和操控寄存器),他担任……寄存器名字面意思,详细说便是决议CNT小朋友的喊号的快慢(计数频率,包含时钟源的挑选和分频系数)。他还担任其他一些杂事,比方计数溢出、中止使能等等。
- FTMx_MOD小朋友(模数寄存器),他担任记住一个数字,当CNT小朋友喊道这个数字的时分,他就提示相关人员干一些作业,比方发生溢出中止标志,比方让CNT重新开端喊号。
- FTMx_CNTIN小朋友(计数器初始值寄存器),他告知CNT小朋友哪哪个数开端喊。
- 其间x代表不同的FTM模块的标号,比方MK60D系列单片机,有3个FTM模块,x就为0~2。
PWM输出功用
PWM作业原理
PWM是什么,能做什么用,不是咱们要讲的,信任你也能百度到。这儿咱们主要讲PWM在Kinetis的FTM模块中是怎样作业的。还记得上面介绍的几个小朋友吗,他们只需一同干活,咱们的PWM波就能够生成了,下面我来说说他们是怎样干活的。哦对了,提到PWM还有一个小朋友要介绍,便是FTMx_CnV(通道值寄存器)小朋友。其间n代表FTMx有n个这样的小朋友,关于FTM0模块来说,有8个。他们8个人担任PWM的脉宽(即占空比),他们每个人也会记住一个数字,当CNT喊道这个数字的时分,他就让PWM的输出发生上升或下降沿。
PWM最重要参数便是频率(周期的倒数)和占空比,下面的两个公式解说了他们是怎样确认的:
PWM的周期=(MOD–CNTIN +
PWM的占空比=(CnV − CNTIN)
怎样样,上面的公式成果都是由咱们知道的小朋友决议的吧。下面我来解说下这个作业流程,首要公式中的计数器周期是SC小朋友决议的,前面说了他担任喊号的快慢,因为他担任决议选用哪个频率为输入频率,这些频率候选有体系时钟、固定频率时钟以及外部时钟,他还担任这些输入频率的分频系数,总归SC小朋友决议了计数器周期,也便是CNT小朋友喊号的快慢。然后CNT小朋友从CNTIN小朋友那里知道了要喊的榜首个数,他依照SC决议的快慢一直喊道MOD告知他的数,喊完这些数,一个PWM周期也就发生了!
那么PWM的脉宽是怎样决议的呢,首要假定CNT在喊榜首个数的时分,PWM通道输出高电平,当CNT喊到CnV小朋友告知他的号的时分,PWM输出通道就会变为低电平,直到CNT继续喊道MOD的时分一个PWM周期结束,当重新开端喊CNTIN的号的时分,PWM的输出通道又变为了高电平,这样继续下去,就发生了PWM波形!
你认为一个FTMx模块只能输出一路PWM就错了,咱们方才说了CnV依据x的不同,有n个通道能够输出PWM,假如是x=0,那么FTM0就有8个CnV,C0V到C7V这8个小朋友,因而FTM0能够输出8路不同占空比的PWM,可是因为担任喊号的CNT以及他的其他小伙伴在FTM0中只是各有1人,因而FTM0只能输出一种频率的PWM。
假如上面的描绘让你和你的小伙伴都惊呆了,那么就看看上面这幅图,从技能文档中的Figure 39-181截出来的。红圈后边的波形就行PWM输出通道输出的波形。深绿色的圈代表CNT从CNTIN开端计数,此刻输出高电平。当计数到CnV的时分,浅绿色圈处,发生channel(n)match通道匹配事情,变为低电平。当整个计数周期完结,即蓝圈的规模,CNT计数到MOD时,一个波形输出完结。
PWM例程解说
前面讲了FTM中的几个小伙伴的故事,意图是为了让咱们了解PWM的作业流程,下面咱们来详细看看例程中,是怎样运用库函数来生成PWM的。首要看例程“LPLD_ServoControl”,这是一个操控舵机滚动的例程,咱们知道舵机的操控PWM频率一般是50Hz,其他的舵机有或许不同,因而咱们的初始化函数初始化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计数器的值。蓝色圈代表咱们行将发生的中止信号。
%&&&&&%例程解说
翻开例程“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:一定要记住使能中止。