注册 登录
亿加合和智能车制作 返回首页

0蓝色精灵0的个人空间 http://www.znczz.com/?84043 [收藏] [复制] [分享] [RSS]

日志

飞思卡尔智能车S12XS128PWM控制程序编写

热度 2已有 1312 次阅读2012-3-6 21:55 | 智能, 卡尔, s12, pwm

   本人表示,这不是原创,是偶尔看到,觉得好就复制发表了!下面是原创链接:http://www.znczz.com/thread-41950-1-1.html 
      对于飞思卡尔智能车,电机和舵机的控制通常使用的都是以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%


路过

鸡蛋

鲜花
1

握手

雷人

刚表态过的朋友 (1 人)

发表评论 评论 (1 个评论)

回复 tp0771 2012-3-9 23:52
  

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

关于我们|联系我们|小黑屋|亿加合和智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-5-4 14:28 , Processed in 0.044803 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

返回顶部