版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、跟我学OSKinetis第8课-FTM的PWM、输入捕获、正交解码Posted on2013 年 11 月 18 日bylpldcnFTM是一个神奇的模块,他能输出PWM,能输入捕获,能输出比较还能正交解码。英文全称是FlexTimer Module,你可以理解为高级定时器模块、易用定时器模块等等。不仅仅在Kinetis 32位处理器中,FTM是个常用的模块,在飞思卡尔的8位处理器中,他也是个常用的模块,只不过名字叫TPM。FTM会用了,飞思卡尔的其他单片机的FTM、TPM你就都会用了。在OSKinetis固件库中,我们可以用FTM模块来实现PWM、输入捕获和正交解码等常用功能,借用库函数实现
2、功能不难,难的是理解这些功能怎么用、什么原理才是最重要的,下面我们一一介绍这3个功能。当然看完本文你就能用寄存器编写FTM的各个功能吗,呵呵,不可能的!否则要那1000多页的技术文档干什么用,但是我希望本文能起到抛砖引玉的功能,在你会用库函数的基础上,对他的内部机制有一个了解。 介绍几个小伙伴(FTM寄存器)要想搞清楚FTM模块,首先我们要介绍几个重要的寄存器给大家,他们就像小伙伴一样,好好利用可以帮大忙呢。 FTMx_CNT小朋友(计数器寄存器),他负责喊号(计数)。 FTMx_SC小朋友(状态和控制寄存器),他负责寄存器名字面意思,具体说就是决定CNT小朋友的喊号的快慢(计数频率,包括时钟
3、源的选择和分频系数)。他还负责其他一些杂事,比如计数溢出、中断使能等等。 FTMx_MOD小朋友(模数寄存器),他负责记住一个数字,当CNT小朋友喊道这个数字的时候,他就提醒相关人员干一些事情,比如产生溢出中断标志,比如让CNT重新开始喊号。 FTMx_CNTIN小朋友(计数器初始值寄存器),他告诉CNT小朋友哪哪个数开始喊。 其中x代表不同的FTM模块的标号,比如MK60D系列单片机,有3个FTM模块,x就为02。PWM输出功能PWM工作原理PWM是什么,能做什么用,不是我们要讲的,相信你也能百度到。这里我们主要讲PWM在Kinetis的FTM模块中是怎么工作的。还记得上面介绍的几个小朋友吗
4、,他们只要一起干活,我们的PWM波就可以生成了,下面我来说说他们是怎么干活的。哦对了,说到PWM还有一个小朋友要介绍,就是FTMx_CnV(通道值寄存器)小朋友。其中n代表FTMx有n个这样的小朋友,对于FTM0模块来说,有8个。他们8个人负责PWM的脉宽(即占空比),他们每个人也会记住一个数字,当CNT喊道这个数字的时候,他就让PWM的输出产生上升或下降沿。PWM最重要参数就是频率(周期的倒数)和占空比,下面的两个公式解释了他们是怎么确定的:PWM的周期=(MODCNTIN +1)x计数器周期PWM的占空比=(CnV CNTIN)/ PWM的周期怎么样,上面的公式结果都是由我们认识的小朋友决
5、定的吧。下面我来解说下这个工作流程,首先公式中的计数器周期是SC小朋友决定的,前面说了他负责喊号的快慢,因为他负责决定采用哪个频率为输入频率,这些频率候选有系统时钟、固定频率时钟以及外部时钟,他还负责这些输入频率的分频系数,总之SC小朋友决定了计数器周期,也就是CNT小朋友喊号的快慢。然后CNT小朋友从CNTIN小朋友那里知道了要喊的第一个数,他按照SC决定的快慢一直喊道MOD告诉他的数,喊完这些数,一个PWM周期也就产生了!那么PWM的脉宽是怎么决定的呢,首先假定CNT在喊第一个数的时候,PWM通道输出高电平,当CNT喊到CnV小朋友告诉他的号的时候,PWM输出通道就会变为低电平,直到CNT
6、继续喊道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截出来的。红圈后面的波形就行PW
7、M输出通道输出的波形。深绿色的圈代表CNT从CNTIN开始计数,此时输出高电平。当计数到CnV的时候,浅绿色圈处,产生channel(n)match通道匹配事件,变为低电平。当整个计数周期完成,即蓝圈的范围,CNT计数到MOD时,一个波形输出完成。PWM例程讲解前面讲了FTM中的几个小伙伴的故事,目的是为了让大家了解PWM的工作流程,下面我们来具体看看例程中,是如何利用库函数来生成PWM的。首先看例程“LPLD_ServoControl”,这是一个控制舵机转动的例程,我们知道舵机的控制PWM频率一般是50Hz,其他的舵机有可能不同,因此我们的初始化函数初始化PWM频率为50,定位pwm_ini
8、t()函数,看其代码: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频率50Hz04 LPLD_FTM_Init(ftm_init_struct);05 LPLD_FTM_PWM_Enable(FTM0, /使用FTM006 FTM_Ch0, /使能Ch0通道07 angle_to_period(0), /初始化角度0度08 PTC1, /使用Ch0通道的PTC1引脚
9、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通道来输出波形哦!其中
10、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:在初始化完
11、毕后,首先应该延时一段时间,以保证舵机可以有足够的时间归位。Line 3:调用LPLD_FTM_PWM_ChangeDuty()函数来改变CH0通道的占空比,该函数和PWM通道使能函数的个别参数一样,使用时最好先参考在线函数手册。输入捕获功能IC工作原理IC就是Input Capture的英文缩写,即输入捕获。很多新手不仅疑惑FTM,还疑惑他怎么还有这么多功能,更疑惑这么多功能中输入捕获到底干什么用。首先FTM为什么除了能生成PWM,还有其他功能,这都是因为他有这么多给力的小伙伴(寄存器),上面介绍那些小朋友不仅能生成PWM,还能利用自身特长,摇身一变成输入捕获功能。那么输入捕获有什么用呢,输
12、入什么?捕获什么?他就像PWM的逆变一样,通过输入PWM方波,捕获上升沿或者下降沿,来计算出PWM的频率或者占空比。那么这几个小朋友是怎么工作,来实现输入捕获功能的呢,且听我一一道来。首先CnV小朋友不再负责记住一个数了,而是随时待命,随时准备记录下CNT小朋友喊的数字。当FTM的输入通道产生一个上升沿或者下降沿的时候,就会产生一个中断,这是CnV小朋友就会立刻记录下CNT小朋友喊的数字,我们只要知道两次中断之间CnV小朋友记录的计数的差,就可以间接计算出中断间隔时间了,从而可以计算出PWM方波的频率。当然CNT小朋友喊号的频率还是有SC小朋友决定的。假设我们知道CNT喊号的频率为fCNT,C
13、nV自从上次中断后记录的计数差为cv,配置捕获上升沿时产生中断,那么两次中断的时间差的倒数就是PWM方波的频率:输入PWM频率=fCNT/cv同样还是来看一下我从技术文档中截下来的图,原图初出自Figure 39-175。红框圈出来的是FTM的通道输入,这个通道在物理引脚上和PWM的输出通道是共用的,只不过随着功能的不同,输入输出都可以。橙色圈代表的是判断到底是上升沿还是下降沿来触发冲断。深色绿圈代表了CnV在这个事件来临的时候记录下CNT的数值,浅绿色是CNT计数器的值。蓝色圈代表我们即将产生的中断信号。IC例程讲解打开例程“LPLD_InputCapture”,在这里例程中,我们利用FTM
14、0生成一路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 =
15、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的中断函
16、数,用于处理捕获事件。Line 6:使能输入捕获的输入通道,和PWM的使能通道同理,这里要设置需要用到的通道号为FTM_Ch0,通道对应的物理引脚为PTB0,捕获边缘为上升沿CAPTURE_RI。关于此函数的参数的具体范围,请参考FTM模块的在线函数手册(点击进入)。Line 7:一定要记住使能中断。输入捕获初始化完毕后,FTM1就会在PTB0有输入PWM的时候产生中断了,接下来看一下其中断函数是怎么写的:01void ic_isr(void)0203 uint32 cnt;04 if(LPLD_FTM_IsCHnF(FTM1, FTM_Ch0)05 06 cnt=LPLD_FTM_GetCh
17、Val(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 11Line 4:首先调用LPLD_FTM_IsCHnF()函数判断是不是FTM1的Ch0通道产生的捕获事件,因为每个FTMx的所有通道中断都是公用一个中断函数的,所以为了安全,必须在中断中判断是哪个通道产生的中断。Line 6:获得Ch0通道的计数值,并存到临时变量cnt中。这个值就是C0V小朋友在事件来临的
18、一瞬间,从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通道的中
19、断标志。正交解码正交解码原理讲到正交解码,其实并没有什么神秘的,名字听起来挺高端大气上档次的,其实实现起来非常简单,我觉得反而是FTM模块中最简单的功能。首先要清楚正交解码是干嘛用的,举个栗子?霍尔编码器是常用的电机测速传感器,他不仅可以测速,还可以知道电机的正转还是反转,靠的就是他能输出两路正交信号,我们可以通过正交信号的相位差来识别出当前电机的转动方向。因此有了FTM模块,我们就可以将这两路正交信号PhA和PhB输入到FTM的正交输入通道,通过正交解码功能,直接读取脉冲的计数值,这个计数值是有符号的,正数代表正转,负数则代表反转。具体到FTM内部时怎样工作的,还要提到CNT小朋友,在正交解
20、码模式下,他不再按照SC给定的规则喊号了,而是根据两路PhA和PhB正交信号的状态来计数。你也可以理解为CNT小朋友是一个解码员,当然具体是增计数还是减计数,不是CNT说了算,FTM内部有一套复杂的机制决定。而且这个正交解码功能有两种解码方法可以选择,分别是计数和方向编码、相位A和相位B编码。他们的解码方法如下面两图所示:上图是计数和方向编码方法,红框后面的波形是FTM输入通道PhB的波形,它代表计数方向,篮框后面的波形是FTN输入通道PhA的波形,它代表计数个数,这是一种编码方法,当PhB为高电平时,CNT加计数,当PhB低电平时,CNT减计数,计数频率由PhA决定。从图中还可以看出,CNT
21、IN小朋友决定从什么数开始计数,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_
22、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()函数,第二个参数
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年山西老区职业技术学院单招职业技能考试题库带答案详解(综合题)
- 2026年广元中核职业技术学院单招职业倾向性考试题库含答案详解(精练)
- 2026年山西省朔州市单招职业适应性测试题库附参考答案详解(b卷)
- 2026年广东省湛江市单招职业倾向性考试题库带答案详解(突破训练)
- 2026年广西农业职业技术大学单招职业适应性测试题库带答案详解(综合题)
- 2026年广州体育职业技术学院单招综合素质考试题库附答案详解(精练)
- 2026年广东科贸职业学院单招职业技能测试题库含答案详解(基础题)
- 2026年山西省忻州市单招职业适应性测试题库及一套完整答案详解
- 2026年广东省潮州市单招职业适应性考试题库附答案详解(a卷)
- 2026年山西艺术职业学院单招职业技能考试题库带答案详解(考试直接用)
- 2026年保安员考试题库及答案(1000题)
- 2026年江西工业贸易职业技术学院单招职业适应性测试必刷测试卷附答案
- 2026年江西科技学院单招(计算机)测试模拟题库附答案
- 2025至2030地热供暖行业项目调研及市场前景预测评估报告
- “互联网”背景下老字号品牌的新媒体营销策略-以大白兔品牌为例
- 人才招聘选拔多维度评分模型参考模板
- Windows7基础操作培训教程
- 《上海市人民防空地下室施工图技术性专项 审查指引(试行)》
- 人工智能通识教程第6章具身智能
- 2025年体育教育专升本真题解析试卷(含答案)
- 钢板桩围堰专项施工方案
评论
0/150
提交评论