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 */
}
//--------------------转速计算:-------------------------------//
//智能车转速子函数
//----------------------------------------------------------------//