MC9S12超详细中文资料(补充)

  • 格式:doc
  • 大小:296.55 KB
  • 文档页数:25

PWM工作原理

S12微控制器PWM模块是由独立运行的

8位脉冲计数器PWMCNT和两个比较寄存器PWMPER和PWMDTY组成。

1、左对齐方式

在该方式下,脉冲计数器为循环递增计数,计数初值为0 。

当PWM使能后,计数器PWMCNT从0开始对时钟信号递增计数,开始一个输出周期。当计数值与占空比常数寄存器PWMDTY相等时,比较器1输出有效,将触发器置位,而PWMCNT继续计数;当计数值与周期常数寄存器PWMPER相等时,比较器2输出有效,将触发器复位,同时PWMCNT也复位,结束一个输出周期。原理参照图1:

图1 PWM左对齐方式

2、中心对齐方式

在该方式下,脉冲计数器为双向计数,计数初值为0 。

当PWM使能后,计数器PWMCNT从0开始对时钟信号递增计数,开始输出一个周期。当计数器与占空比常数寄存器PWMDTY相等时,比较器1输出有效,触发器翻转,而PWMCNT继续计数,当计数值与周期常数PWMPER相等时,比较器2输出有效,此时改变PWMCNT的计数方向,使其递解计数;当PWMCNT再次与PWMDTY相等时,比较器1再一次输出有效,使触发器再次翻转,而PWMCNT继续递减计数,等待PWMCNT减回至0,完成一个输出周期。原理参照图1:

图1 中心对齐方式

3、周期计算方法

左对齐方式:

输出周期 = 通道周期 × PWMPERx

中心对齐方式:

输出周期 = 通道周期 × PWMPERx × 2

4、脉宽计算方法

左对齐方式:

占空比 = [ (PWMPERx - PWMDTYx) / PWMPERx ] × 100%

中心对齐方式:

占空比 = [ PWMDTYx / PWMPERx ] × 100%

S12XS128

【例程】

程序描述:由通道PTP3口输出频率为1K,占空比为50%的方波

程序如下:

#include /* common defines and macros */

#include /* derivative information */

#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"

/***********初始化函数*************/

/*时钟初始化程序*/

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();

/* put your own code here */

EnableInterrupts;

for(;;) {} /* wait forever */

/* please make sure that you never leave this function */

}

增强型定时器模块(ECT)的结构框图如下,ECT功能相当于高速的I/O口,由

一个4位预分频器、一个16位自由运行计数器,八个16位IC/OC通道,

二个16位脉冲累加器以及一个16位模数递减计数器组成。

ECT实际上是一个16位的可编程计数器,它的基本时钟频率可以通过预分频器设置,用于产生波形输出,测量输入波形,统计脉冲个数,可以作为定时中断功能和独立时钟基准。

S12XS128

Timer模块应用实例(XS128)

输入捕捉(IC)编程步骤:

初始化函数

TIOS --- 选择工作方式为IC

TCTLx --- 设置对应位输入捕捉的方式(x=3、4,高位是3,低位是4)

TSCRx --- 控制寄存器设置,包括工作使能、确定工作方式(x=1)、中断 允许、预分频

TIE --- 中断使能

中断函数

清除标志位 --- TFLG1

处理函数

【例程】

//---------------------------------------------------------------------------//

//功能说明:利用PP3通道产生40Hz,占空比为50%的方波

// 利用PT0采集方波的个数,并在PB口显示

//程序设计:电子设计吧

//设计时间:2010.01.13

//---------------------------------------------------------------------------//

#include /* common defines and macros */

#include /* derivative information */

#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"

unsigned int Input_Num;

//----------------------时钟初始化------------------------------//

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;

}

//--------------------通道0输入捕捉初始化-------------------//

void ECT0_Init(void)

{

TSCR2=0x06; //禁止溢出中断,分频系数64(24/64MHz)

TIOS_IOS0=0; //通道0为输入捕捉

TCTL4=0x01; //捕捉上升沿

TIE_C0I=1; //通道0输入捕捉中断允许

TSCR1=0x80; //使能定时器

} //---------------------PWM通道3初始化程序-------------------//

void PWM_Init(void)

{

PWME_PWME3=0x00; // PWW is disabled 禁止

PWMPRCLK=0x33; // 0b0011 0011 A=B=24M/8=3M时钟预分频寄存器设置

PWMSCLA=150; // SA=A/2/150=10k 时钟设置

PWMSCLB=150; // SB=B/2/15 =10k 时钟设置

PWMCTL=0x00; // no concatenation 控制寄存器设置

PWMCLK_PCLK3=1; // PWM3-----SB 时钟源的选择

PWMPOL_PPOL3=1; // Duty=High Time 极性设置

PWMCAE_CAE3=0; //left-aligned 对齐方式设置

PWMPER3=250; // Frequency=SB/250=40 周期寄存器设置

PWMDTY3=125; // Duty cycle = 50% 占空比寄存器设置

PWME_PWME3=1; // enable 使能

}

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

void main(void)

{

PLL_Init();

PWM_Init();

ECT0_Init();

DDRB=0XFF;

PORTB=0X00;

EnableInterrupts;

for(;;)

{

} /* wait forever */

/* please make sure that you never leave this function */

}

//--------------------转速计算:-------------------------------//

//智能车转速子函数

//----------------------------------------------------------------//