飞思卡尔16位单片机(八)——PWM模块测试

一、PWM模块介绍

       PWM在工业领域应用很广,是实现D/A转换和精确脉冲序列输出的有效手段。许多单片机都设置了PWM输出功能。XEP100单片机的PWM模块具有如下特点:

(1)    XEP100单片机具有8个可编程的PWM通道,与单片机的PP0—PP7管脚复用。每个通道的周期和占空比是可以独立控制的,8个通道都是8位精度的。通过设置寄存器PWMCTL可以将相邻的两个通道连接成一个16位精度的PWM通道,因此一个XEP100单片机可以提供4个16位精度的PWM通道;
(2)    每个PWM通道都有独立的计数器;
(3)    每个通道都可以设置为使能或禁能状态;
(4)    每个通道占空比的极性是可以通过软件选择的,通过设置寄存器PWMPOL实现,相应的位置1为高电平有效,清0为低电平有效;
(5)    周期和占空比循环是双缓冲的,在每个周期结束时,更新的设置就可以生效;
(6)    每个通道可以独立的设置为左对齐和中央对齐模式,通过设置寄存器PWMCAE进行设置;
(7)    PWM模块有4个时钟(A、B、SA和SB)能够提供宽范围的频率;
(8)    可编程的时钟选择逻辑;
(9)    紧急停止功能。

       PWM在控制中应用广泛,可以用于电机调速,舵机控制,步进电机控制等,在本实验中,我们只介绍如何使用单片机的PWM模块来产生PWM信号。关于PWM的深层次的应用,读者可以自己研究练习。

二、例程测试

        在这个实验中,我们通过单片机的PWM模块输出一路1Hz的方波信号,并用这个方波型号对LED灯进行控制。

在这个实验的程序中,主要的代码是PWM模块的初始化,如下所示

void init_pwm(void) 
 {
  PWMCTL_CON01= 1;   //联结通道0,1为16位的PWM
  PWMPOL_PPOL1= 1;   //通道01的极性为高电平有效
  PWMPRCLK = 0x55;   //A时钟和B时钟的分频系数为32,频率为1MHz
  PWMSCLA  =  100;   //SA时钟频率为5KHz
  PWMSCLB  =  100;   //SB时钟频率为5KHz
  PWMCLK =0x02;      //通道01用SA时钟作为时钟源
  PWMCAE   = 0x00;   //脉冲模式为左对齐模式
  PWMPER01  = 5000;  //通道01的周期为1Hz 
  PWMDTY01  = 1000;  //通道01的占空比为20%  
  PWME_PWME1 = 1;    //使能通道01
 }

        为了能够看懂代码,我们对PWM模块的工作原理进行简单介绍。XEP100单片机的PWM模块可以独立生成8路8位的PWM信号,可以将这8路PWM信号,两两级联成4路16位的PWM信号,PWMCTL_CON01= 1;这一句就是将0通道和1通道级联成一个16位的PWM通道。PWMPOL_PPOL1= 1;设置级联后的01通道极性为高电平有效。

        PWM模块的时钟来源是总线时钟,为了用来生成PWM信号,PWM模块可以生成自己内部的时钟,它内部有4个时钟,分别为A、B、SA、SB。其中A和B时钟通过总线分频得到,SA和SB时钟通过A和B时钟分频得到。在这个代码中,PWMPRCLK = 0x55;将A和B时钟的分频系数都设置为32,由于总线时钟的频率设置为32MHz,所以A和B时钟的频率为1MHz。PWMSCLA和PWMSCLB寄存器用来设置SA和SB时钟的分频系数,程序中设置为100,以A和SA为例,Clock SA=Clock A/(2*PWMSCLA),所以SA和SB时钟的频率为5KHz。PWMCLK =0x02;这一句将01通道的时钟源设置为SA时钟。

        PWMCAE=0x00; 将脉冲模式为左对齐模式。

        PWMPER01和PWMDTY01分别用来设置PWM的周期和占空比,PWMPER01设置PWM的周期,代码中PWMPER01的值为5000,由于SA时钟的频率为5KHz,时钟的周期为0.2ms,所以PWM的周期为0.2ms*5000=1s。PWMDTY01设置PWM的占空比,占空比的值为PWMDTY01/PWMPER01=1000/5000=20%。

        最后将01通道使能,设置之后01通道就会源源不断的输出方波信号,频率为1Hz,占空比为20%。将PWM信号与LED灯连接起来就可以看到LED以1Hz的频率闪烁。

发布了78 篇原创文章 · 获赞 6 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/bhniunan/article/details/104226164