您的当前位置:首页正文

PWM模块介绍

2021-09-01 来源:爱站旅游
导读PWM模块介绍
手把手教你写S12XS128程序--PWM模块介绍

该教程以MC9S12XS128单片机为核心进行讲解,全面阐释该16位单片机资源。本文为第一讲,开始介绍该MCU的PWM模块。

PWM 调制波有 8 个输出通道,每一个输出通道都可以独立的进行输出。每 一个输出通道都有一个精确的计数器(计算脉冲的个数),一个周期控制寄存器 和两个可供选择的时钟源。每一个 PWM 输出通道都能调制出占空比从 0—100% 变化的波形。

PWM 的主要特点有: 1、它有 8 个独立的输出通道,并且通过编程可控制其输出波形的周期。 2、每一个输出通道都有一个精确的计数器。 3、每一个通道的 PWM 输出使能都可以由编程来控制。 4、PWM 输出波形的翻转控制可以通过编程来实现。 5、周期和脉宽可以被双缓冲。当通道关闭或 PWM 计数器为 0 时,改变周期和脉宽才起作用。

6、8 字节或 16 字节的通道协议。 7、有 4 个时钟源可供选择(A、SA、B、SB),他们提供了一个宽范围的时 钟频率。

8、通过编程可以实现希望的时钟周期。 9、具有遇到紧急情况关闭程序的功能。

10、每一个通道都可以通过编程实现左对齐输出还是居中对齐输出。 1、PWM启动寄存器PWME

PWME 寄存器每一位如图 1 所示:

复位默认值:0000 0000B

图 1 PWME 寄存器

每一个PWM 的输出通道都有一个使能位 PWMEx 。它相当于一个开关,用来启动和关闭相应通道的 PWM 波形输出。当任意的 PWMEx 位置 1,则相关的 PWM 输出通道就立刻可用。

用法: PWME7=1 --- 通道7 可对外输出波形

PWME7=0 --- 通道7 不能对外输出波形

注意:在通道使能后所输出的第一个波形可能是不规则的。当输出通道工作在串联模式时(PWMCTL 寄存器中的 CONxx 置1),那么)使能相应的 16 位 PWM 输出通道是由 PWMEx 的高位控制的,例如 :设置 PWMCTL_CON01 = 1,通道0、1级联,形成一个16位 PWM 通道,由通道 1 的使能位控制 PWM 的输出。

2、PWM时钟选择寄存器PWMCLK

PWMCLK 寄存器每一位如图3 所示:

复位默认值:0000 0000B

图2 PWMCLK 寄存器

S12的PWM 共有四个时钟源,每一个 PWM 输出通道都有两个时钟可供选择(ClockA、ClockSA 或Clock B、ClockSB))。其中0、1、4、5 通道可选用ClockA和ClockSA,2、3、6、7 通道可选用ClockB、ClockSB 通道。该寄存器用来实现几个通道时钟源的选择。

用法: PCLK0 = 1 --- 通道0(PTP0)的时钟源设为ClockSA PCLK2 = 0 --- 通道2(PTP2)的时钟源设为ClockB 1、PWM预分频寄存器PWMPRCLK

PWMPRCLK 寄存器每一位如图3 所示:

复位默认值:0000 0000B

图 3 PWMPRCLK 寄存器

PWMPRCLK 寄存器包括ClockA预分频和ClockB预分频的控制位。ClockA、

n

ClockB的值为总线时钟的1/2(0≤n≤7),具体设置参照图4和图5

图 4 Clock A 预分频设置

图5 Clock B 预分频设置

PCKB0~PCKB2 是对ClockB进行预分频。 PCKA0~PCKA2 是对ClockA进行预分频。 2、PWM分频寄存器PWMSCLA、PWMSCLB

PWMSCLA 寄存器每一位如图 6所示:

图6 PWMSCLA寄存器

Clock SA 是通过对 PWMSCLA 寄存器的设置来对ClockA 进行分频而产生的。其计算公式为:

Clock SA=Clock A /(2*PWMSCLA)

PWMSCLB 寄存器与PWMSCLA 寄存器相似,Clock SB 就是通过对PWMSCLB 寄存器的设置来对 ClockB 进行分频而产生的。其计算公式为: Clock SB=Clock B /(2*PWMSCLB) 1、PWM极性选择寄存器PWMPOL

PWMPOL 寄存器每一位如图7 所示:

该寄存器是0~7通道PWM输出起始极性控制位,用来设置PWM输出的起始电平。 用法:PWMPOL_PPOL0=1--- 通道 0 在周期开始时输出为高电平,当计数器等于占空比寄存器的值时,输出为低电平。对外输出波形先是高电平然后再变为低电平。

2、PWM波形对齐寄存器PWMCAE

PWMCAE 寄存器每一位如图 8 所示:

图 8 PWMCAE 寄存器

PWMCAE 寄存器包含 8 个控制位来对每个 PWM 通道设置左对齐输出或中心对齐输出。

用法: PWMCAE_CAE0 = 1 --- 通道0 中心对齐输出 PWMCAE_CAE7 = 0 --- 通道7 左对齐输出 注意:只有输出通道被关闭后才能对其进行设置,即通道被激活后不能对其进行设置。

1、PWM控制寄存器PWMCTL

PWMCTL 寄存器每一位如图 9 所示:

图 9 PWMCTL 寄存器

该控制寄存器设定通道的级联和两种工作模式:等待模式和冻结模式。这两种模式如图10和图11所示。

图10 等待模式 图11 冻结模式

只有当相应的通道关闭后,才能改变 这些控制字。 用法:

PWMCTL_CON67=1 --- 通道 6、7 级联成一个16位的PWM通道。此时只有 7 通道的控制字起作用,原通道7的使能位、PWM输出极性选择位、时钟选择控制位以及对齐方式选择位用来设置级联后的PWM输出特性

PWMCTL_CON67=0 --- 通道 6,7 通道不级联 CON45、CON23、CON01 的用法同 CON67 相似。设置此控制字的意义在于扩大了 PWM 对外输出脉冲的频率范围。

PSWAI=1 --- MCU 一旦处于等待状态,就会停止时钟的输入。这样就不会因时钟在空操作而费电;当它置为 0,则 MCU 就是处于等待状态,也允许时钟的输入。 PFRZ=1 --- MCU 一旦处于冻结状态,就会停止计数器工作。

S12微控制器PWM模块是由独立运行的8位脉冲计数器PWMCNT、两个比较寄存器PWMPER和PWMDTY组成。 1、左对齐方式

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

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

图14 PWM左对齐方式

2、中心对齐方式

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

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

相等时,比较器1再一次输出有效,使触发器再次翻转,而PWMCNT继续递减计数,等待PWMCNT减回至0,完成一个输出周期。原理参照图15:

图15 中心对齐方式

3、周期计算方法

左对齐方式:

输出周期 = 通道周期 × PWMPERx 中心对齐方式:

输出周期 = 通道周期 × PWMPERx × 2 4、脉宽计算方法

左对齐方式:

占空比 = [ (PWMPERx - PWMDTYx) / PWMPERx ] × 100% 中心对齐方式:

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

1、PWM通道计数寄存器 PWMCNTx

PWMCNTx 寄存器共有 8个,每一个通道都有一个8位PWM加/减双向计数器,通道级联后可变成16位PWM加/减双向计数器。下面以PWMCNT0为例对 PWMCNTx 寄存器进行介绍。 PWMCNT0 寄存器如图 12 所示:

图 12 PWMCNT0 寄存器

计数器以所选时钟源的频率运行。计数器在任何时候都可以被读,而不影响计数,也不影响对 PWM 通道的操作。

任何值写入 PWMCNT0 寄存器都会导致计数器复位置 0,且其计数方向会 被设置为向上计数,并且会立刻从缓冲器载入任务和周期值,并会根据翻转极性的设置来改变输出。当计数器达到计数值后,会自动清零。只有当通道使能后,计数器才开始计数。

2、PWM通道周期寄存器PWMPERx PWMPERx 寄存器共有 8 个,每一个通道都有一个这样的周期寄存器。这个 寄存器的值就决定了相关 PWM 通道的周期。每一个通道的周期寄存器都

是双缓 冲的,因此如果当通道使能后,改变他们的值,将不会发生任何作用,除非当下列情况之一发生:

*有效的周期结束。

*对计数器进行写操作(计数器复位) *通道不可用(PWMEx = 0)

这样就会使 PWM 输出波形要么是新波形要么是旧波形,并不会在两者之间 进行交替变换。如果通道不可用,那么对周期寄存器进行写操作,将会直接 图表 1

导致 周期寄存器同缓冲器一起闭锁。图 13 所示的是 PWMPER0 寄存器:

图 13 PWMPER0 寄存器 3、PWM通道占空比寄存器PWMDTYx

PWMDTYx 寄存器也有 8 个,每一个通道都有一个这样的占空比常数寄存 器。这个寄存器的值就决定了相关 PWM 通道输出波形的占空比。每一个通道的 占空比寄存器都是双缓冲的,因此如果当通道被激活后,改变他们的值将不会发生任何作用,除非当下列情况之一发生:

*有效的周期结束。

*对计数器进行写操作(计数器复位) *通道不可用(PWMEx = 0) 这样就会使 PWM 输出波形要么是新波形要么是旧波形,并不会在两者之间 进行交替变换。如果通道没有被激活,那么对占空比常数寄存器进行写操作,将会直接导致周期寄存器同缓冲器一起闭锁。 当计数值与占空比常数 PWMDTY 相等时,则比较输出器有效,这时就会将触发器置位,然后 PWMCNT 继续计数,当计数值与周期常数 PWMPER 相等时,比较器输出有效,将触发器复位,同时也使 PWMCNT 复位,结束一个输出周期。 S12微控制器PWM模块是由独立运行的8位脉冲计数器PWMCNT、两个比较寄存器PWMPER和PWMDTY组成。 1、左对齐方式

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

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

图14 PWM左对齐方式

2、中心对齐方式

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

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

图15 中心对齐方式

3、周期计算方法

左对齐方式:

输出周期 = 通道周期 × PWMPERx 中心对齐方式:

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

4、脉宽计算方法

左对齐方式:

占空比 = [ (PWMPERx - PWMDTYx) / PWMPERx ] × 100% 中心对齐方式:

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

PWM 初始化步骤总结

1、禁止PWM PWME = 0

2、选择时钟 PWMPRCLK,PWMSCLA,PWMSCLB,PWMCLK 3、选择极性 PWMPOL 4、选择对齐方式 PWMCAE

5、选择占空比和周期 PWMDTYx, PWMPERx 6、使能PWM PWME = 1 【例程1】

//------------------------------------------------------------------------------------------------------------------// //功能说明:MC9S12XS128--PWM例程

//使用说明:实现通道3(PTP3)输出频率为1KHz,占空比为50%的方波,用示波

器观察

//程序设计:电子设计吧【www.dzsj8.com】 //设计时间:2010.01.21

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

#include /* common defines and macros */

#include \"derivative.h\" /* derivative-specific definitions */ //--------------初始化函数----------------// //-----时钟初始化程序--------//

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) {

/* put your own code here */ PLL_Init(); PWM_Init();

EnableInterrupts; for(;;) {

_FEED_COP(); /* feeds the dog */ } /* loop forever */

/* please make sure that you never leave main */ }

因篇幅问题不能全部显示,请点此查看更多更全内容