飞思卡尔PWM模块

 产生PWM波形的方法主要有两种,软件输出比较和PWM硬件模块,利用飞思卡尔的内部资源可以很随意的去控制输出波形,通过一些寄存器的设置可以达到对波形的控制,主要用到的寄存器有通道的使能、极性的设置,对齐方式,周期和脉宽的初始化,对时钟源的分频,主要不好理解的是有关时钟的分频,先通过设置预分频寄存器PWMPRCLK设置预分频比,再通过PWMSCLA/PWMSCLB设置分频比,这两部分分别有相关的计算公式,可以参考datasheet。特别注意左对齐、中间对齐和极性对占空比的影响。

PWM 的主要特点有:

1、它有 8 个独立的输出通道,并且通过编程可控制其输出波形的周期。

2、每一个输出通道都有一个精确的计数器。

3、每一个通道的 PWM 输出使能都可以由编程来控制。

4、PWM输出波形的翻转控制可以通过编程来实现。

5、周期和脉宽可以被双缓冲。当通道关闭或 PWM计数器为 0时,改变周期和脉宽才起作用。

6、8 字节或 16 字节的通道协议。

7、有 4 个时钟源可供选择(A、SA、B、SB),他们提供了一个宽范围的时 钟频率。

8、通过编程可以实现希望的时钟周期。

9、具有遇到紧急情况关闭程序的功能。

     10、每一个通道都可以通过编程实现左对齐输出还是居中对齐输出。

PWM 初始化步骤总结

1、禁止PWM PWME = 0

2、选择时钟 PWMPRCLKPWMSCLAPWMSCLBPWMCLK

3、选择极性 PWMPOL

4、选择对齐方式 PWMCAE

5、选择占空比和周期   PWMDTYx PWMPERx

6、使能PWM PWME = 1

 

功能说明:MC9S12XS128--PWM例程
//使用说明:实现通道3(PTP3)输出频率为1KHz,占空比为50%的方波,用示波器观察
//程序设计:电子设计吧
//设计时间:2010.01.21
//----------------------------------------------------------------------------------------------------------------//

#include      
#include "derivative.h"     


//--------------初始化函数----------------//

//-----时钟初始化程序--------//

void PLL_Init(void)   //PLLCLK=2*OSCCLK*(SYNR+1)/(REFDV+1)

{                     //锁相环时钟=2*16*(2+1)/(1+1)=48MHz

  REFDV=1;            //总线时钟=48/2=24MHz
  SYNR=2;
  while(!(CRGFLG&0x08));
  CLKSEL=0x80;        //选定锁相环时钟

}


//-----PWM初始化程序------//

void PWM_Init(void)

{

  PWME_PWME3=0x00;  // Disable  PWM            禁止            
  PWMPRCLK=0x33;    // 0011 0011 A=B=24M/8=3M  时钟预分频寄存器设置
  PWMSCLA=150;      // SA=A/2/150=10k          时钟设置
  PWMSCLB=15;       // SB=B/2/15 =100k         时钟设置                   
  PWMCLK_PCLK3=1;   // PWM3-----SB             时钟源的选择
  PWMPOL_PPOL3=1;   // Duty=High Time          极性设置
  PWMCAE_CAE3=0;    // Left-aligned            对齐方式设置
  PWMCTL=0x00;      // no concatenation        控制寄存器设置
  PWMPER3=100;      // Frequency=SB/100=1K     周期寄存器设置
  PWMDTY3=50;       // Duty cycle = 50%        占空比寄存器设置
  PWME_PWME3=1;     // Enable  PWM             使能

}
 
//-----------------主函数--------------------//

void main(void)

{
 
 
  PLL_Init();
  PWM_Init();

 EnableInterrupts;


  for(;;) {
    _FEED_COP();
  }
 
}

 

  始终初始化去掉同样可以产生出波形

 

你可能感兴趣的:(硬件知识,concatenation,编程,2010)