智能车制作

标题: 飞思卡尔智能车S12XS128PWM控制程序编写 [打印本页]

作者: septstrings    时间: 2011-6-3 13:16
标题: 飞思卡尔智能车S12XS128PWM控制程序编写

[size=+0]对于飞思卡尔智能车,电机和舵机的控制通常使用的都是以PWM脉冲宽度调制的方法实现的,其可行性基于电机可以由占空比控制转速,而舵机也由脉宽控制摆动。PWM 调制波有 8 个输出通道,每一个输出通道都可以独立的进行输出。每一个输出通道都有一个精确的计数器(计算脉冲的个数),一个周期控制寄存器和两个可供选择的时钟源。每一个 PWM 输出通道都能调制出占空比从 0—100% 变化的波形。

PWM控制程序的编写一般按照以下的一种流程:

1,禁止PWM模块;//这是由于改变周期和脉宽等操作需要在PWM禁止的情况下才能被设置

2,PWM级联选择,是否级联通道67,45,23,01;//最多单独使用8个8位和级联使用4个16位

3,给通道选择时钟源控制位;//0,1,4,5通道可选择ClockA和ClockSA;2,3,6,7通道可选择ClockB和ClockSB

4,给时钟源A\B预分频;//可对总线时钟进行预分频,确定ClockA和ClockB,满足1,2,4,8,16,32,64,128这8个分频量

5,根据时钟源A\B确定时钟源SA\SB;//由ClockA和ClockB、分频设值来确定ClockA和ClockB,满足1-255的分频量

6,输出极性的选择;//也就是选择输出极性先低后高还是先高后低

7,对齐方式的选择;//可设置为左对齐或者中间对齐方式

8,实际通道频率的计算;//也就是周期的设定

9,占空比寄存器的设置;//占空比常数的设定,可以以此决定占空比

10,使能PWM模块。//你已经首尾呼应了,有木有!!!

接下来通过寄存器的介绍,以上面流程为大纲,详细地说明一下该如何操作~~

【PWME】寄存器

PWME = (PWME~7 | PWME~6 | PWME~5 | PWME~4 | PWME~3 | PWME~2 | PWME~1 | PWME~0)

将每一位设置为1即可使能该位,0对应的既是禁止。要注意的是,当选择了级联方式输出的话,1,3,5,7分别是级联单元的控制字,也就是接下来的操作需要对应这些位才可生效。

现在把8个通道都禁止,得到语句 PWME = 0x00;

【PWMCTL】寄存器

PWMCTL = (CON67 | CON45 | CON23 | CON01 | PSWAI | PFRZ | 0 | 0)

若CON67 = 1,那么通道6和7即是级联输出,新单元由通道7的控制字决定属性。若CON67 = 0,那么两者还是相互分立的8位输出通道。其他级联通道操作也是同理。

为保持简洁性,对某些位的赋值略过,PSWAI和PFRZ通常设为0。

现在将8个通道两两相级联,得到语句 PWMCTL = 0xF0;

【PWMCLK】寄存器

PWMCLK = ( PCLK~7 | PCLK~6 | PCLK~5 | PCLK~4 | PCLK~3 | PCLK~2 | PCLK~1 | PCLK~0)

其中0,1,4,5通道可选择ClockA和ClockSA;2,3,6,7通道可选择ClockB和ClockSB。

若将某位设值为1,则该位选择的是ClockSA或ClockSB时钟。

现在全部选择ClockSA或ClockSB时钟,则得到语句 PWMCLK = 0xFF;

【PWMPRCLK】寄存器

PWMPRCLK = (0 | PCKB2 | PCKB1 | PCKB0 | 0 | PCKA2 | PCKA1 | PCKA0)

PCKA2 PCKA1 PCKA0分别对应ClockA预分频系数的三个数位,假设其分别为1 0 0,则对应十进制数是4,也就是分频系数为2~4=16,若总线频率16MHz,则ClockA = BusClock/(2~4) = 16MHz/16 = 1MHz;

PCKB2 PCKB1 PCKB0分别对应ClockB时钟,设值方法同上。

ClockA = BusClock/(2~na)

ClockB = BusClock/(2~nb)

现在设值预分频系数都为1,得到语句 PWMPRCLK = 0x00;

【PWMSCLA&PWMSCLB】寄存器

可以认为是纯数值寄存器,一共八位。如果ClockA为24MHz,现需要600KHz的ClockSA,则通过ClockSA = ClockA / (2*PWMSCLA)可得,PWMSCLA = ClockA/(2*ClockSA)= 24MHz/(2*0.6MHz) = 20;

PWMSCLB的设值也同上,二者的公式相同:

ClockSA = ClockA / (2*PWMSCLA)

ClockSB = ClockB / (2*PWMSCLB)

上面例子可以得到语句 PWMSCLA = 20;

【PWMPOL】寄存器

PWMPOL = (PPOL~7 | PPOL~6 | PPOL~5 | PPOL~4 | PPOL~3 | PPOL~2 | PPOL~1 | PPOL~0)

分别对每个通道的极性进行设置。若置1则先输出高电平,遇到触发置位变为低电平;置0则相反。

现在设置所有通道为先低后高极性,则得到语句 PWMPOL = 0x00;

【PWMCAE】寄存器

PWMCAE = (CAE~7 | CAE~6 | CAE~5 | CAE~4 | CAE~3 | CAE~2 | CAE~1 | CAE~0)

分别对每个通道进行输出方式设置。输出方式分为两种:左对齐和居中对齐。

这里的区别将在占空比寄存器之后详细地说明。

【PWMPERXX】寄存器

共有八个这样的寄存器,名字PWMPER0 - PWMPER7;若级联使用,则为PWMPER01,PWMPER23,PWMPER45,PWMPER67。


【PWMDTYXX】寄存器

共有八个这样的寄存器,名字PWMDTY0 - PWMDTY7;若级联使用,则为PWMDTY01,PWMDTY23,PWMDTY45,PWMDTY67。

上面提到的对齐方式区别在于:

左对齐方式:计数器PWMCNT从0开始对时钟信号递增计数,当PWMCNT = PWMDTY时,比较器1输出有效,触发器置位,输出电平翻转。当PWMCNT = PWMPER时,比较器2输出有效,触发器复位,输出电平翻转。同时PWMCNT复位,一个周期结束。

输出周期 = 通道周期*PWMPERx

居中对齐方式:计数器PWMCNT从0开始对时钟信号递增计数,当PWMCNT = PWMDTY时,比较器输出有效,触发器置位,输出电平翻转。当PWMCNT = PWMPER时,PWMCNT从当前值开始递减计数,当再次满足PWMCNT = PWMDTY时,比较器输出有效,触发器复位,输出电平翻转。

输出周期 = 2*通道周期*PWMPERx

同时占空比的计算方法:

PPOL = 0(先低后高):占空比 = [(PWMPERx-PWMDTYx)/PWMPERx]*100%

PPOL = 1(先高厚):占空比 = [(PWMDTYx)/PWMPERx]*100%




作者: clong_2010    时间: 2011-6-10 13:43
感谢!
作者: tutufanfan    时间: 2011-6-15 14:12
感谢!
作者: Rukelir    时间: 2011-6-16 17:44
膜拜LZ大大
作者: lujiongjianl    时间: 2011-10-30 13:37
提示: 作者被禁止或删除 内容自动屏蔽
作者: 810215729    时间: 2011-11-7 14:34
谢了
作者: 清明    时间: 2011-11-20 17:43
gao.
作者: someday    时间: 2011-11-29 13:12
果然是狠人~~
作者: 春风    时间: 2012-2-16 17:45
今天下午看了一下午的英文资料。。 早知道看看版主的就不要那么费事了。。
作者: 龙游天下明    时间: 2012-2-24 14:16

作者: 想下载此文档吗    时间: 2012-3-1 18:48
人才!!!!
作者: dyingendless    时间: 2012-3-3 01:02
谢谢!!!
作者: 0蓝色精灵0    时间: 2012-3-6 14:55

作者: 戏少及    时间: 2012-3-27 13:42
我擦!!!!!!!!!!!!!

作者: imfgz1990    时间: 2012-3-30 23:46
\(^o^)/~
作者: imfgz1990    时间: 2012-3-31 00:00
仔细一看,好像没什么用
作者: jyzj1825    时间: 2012-3-31 21:15
顶下
作者: dongpinbo    时间: 2012-4-1 19:23

作者: imfgz1990    时间: 2012-4-2 20:18
不是吧?
作者: 蜈蚁蝗    时间: 2012-9-7 19:25

作者: qxdzhidao    时间: 2012-9-27 16:41
怎样设置多路PWM啊
作者: 可欣    时间: 2012-9-28 12:42

作者: HHHvictor    时间: 2012-11-9 21:40
如果想让舵机转动几次,如何编写主程序
作者: 周旭春    时间: 2012-11-13 13:34
谢谢~
作者: 杂志    时间: 2012-12-8 17:29
果然高人!膜拜一下!
作者: 10010    时间: 2012-12-10 16:18
不错不错
作者: ybcqujx    时间: 2012-12-10 19:45
写的不错,顶一个。
作者: zhugedaxia    时间: 2012-12-14 02:00
楼主很简洁,很详细,不错!
作者: camphor    时间: 2012-12-16 13:37
O(∩_∩)O谢谢
作者: kofee    时间: 2012-12-20 11:18
太感谢了
作者: 疾速魅影    时间: 2012-12-23 15:58

作者: liuyuliuyu1216    时间: 2012-12-23 19:46
谢谢
作者: Raphael    时间: 2013-1-22 20:20
谢谢~
作者: 二硫碘化钾    时间: 2013-3-6 21:50

作者: 惗,卟说    时间: 2013-3-6 22:05
谢谢楼主!!
作者: zhangguanghui    时间: 2013-3-8 12:27
顶一下
作者: paul16    时间: 2013-3-9 22:27

作者: athletics    时间: 2013-7-28 22:19
就为这个PWM的初始化弄了几个小时,找了N多资料,思路还是相当混乱,看到楼主的文章真是有种拨开云雾见青天的感觉,绝对要顶。谢谢楼主了
作者: 空相救心    时间: 2013-7-29 07:52
感谢
作者: 1042390174    时间: 2013-8-16 11:55

作者: 彼岸花开洒落    时间: 2013-9-5 20:03
谢谢,正好用到呢。
作者: ぢ夏☆亞ざ    时间: 2013-10-16 23:31
强大啊!!!!!!
作者: 中华旺仔    时间: 2013-10-22 18:08
好人啊啊,,感动,,希望能继续其他模块
作者: 冬晨夏夜    时间: 2013-10-30 20:15
:D:D:D:D:D:D:D:D:D:D:D
作者: 会错意)。    时间: 2013-11-17 18:35
高人呀
作者: wangsh123    时间: 2013-12-11 00:04

作者: 空相救心    时间: 2013-12-12 09:11





欢迎光临 智能车制作 (http://dns.znczz.com/) Powered by Discuz! X3.2