1. 程式人生 > >飛思卡爾PWM模組

飛思卡爾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 <hidef.h>     
#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();
  }
 
}

  始終初始化去掉同樣可以產生出波形