[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%
|