Download - MC9S12 单片机 PWM 模块

Transcript
Page 1: MC9S12 单片机 PWM 模块

第八章 ATD 模块和 PWM 模块

MC9S12 单片机 PWM 模块

山东大学控制科学与工程学院

2010.8

Page 2: MC9S12 单片机 PWM 模块

第八章 ATD 模块和 PWM 模块脉冲宽度调制 PWM 模块

PWM( Pulse Width Modulate)即脉宽调制,脉宽调制波是一种可用程序来控制波形占空比、周期、相位的波形。它在电动机驱动、 D/A 变换等场合有着广泛的应用。

周期,占空比,相位。周期指上图中的 τ,占空比为 t/ τ,相位指高低电平。

Page 3: MC9S12 单片机 PWM 模块

第八章 ATD 模块和 PWM 模块9S12 PWM 模块特性

对于 DG128( 80pin): 7个周期、占空比可编程的 PWM

通道 (PP0-PP5,PP7);对于 112引脚的,有 8个 PWM通道。 专用的 PWM计数器 PWM功能的软件使能和禁止(允许寄存器) 软件选择脉冲极性 PWM波形输出对齐方式分为左对齐和居中对齐 可以两个通道级联以获得更高的精度 可选择 4个时钟源, 4个时钟源均为独立的分频设置 紧急关断功能

Page 4: MC9S12 单片机 PWM 模块

第八章 ATD 模块和 PWM 模块1. 时钟

四个时钟源 CLOCKA 、 CLOCKB 、 CLOCKSA 、 CLOCKSB 。

总线时钟

CLOCKA

CLOCKB

CLOCKSA

CLOCKSB

分频

分频

分频

分频

CLOCKA ( B )可以把总线时钟进行 1 、 2 、 4 、 8 、 16 、 32 、 64 、 128 分频。 Clock A 的预分频因子通过 PWMPRCLK 寄存器中的 PCKA2 、 PCKA1

和 PCKA0 来选择 Clock B 的预分频因子通过 PWMPRCLK 寄存器中的 PCKB2 、 PCKB1

和 PCKB0 来选择。

Page 5: MC9S12 单片机 PWM 模块

第八章 ATD 模块和 PWM 模块

CLOCKSA ( B ) 从 CLOCKA ( B )进行分频的比例因子可以为 1 、

2 、 4 、 8 、 16 、 32 、 64 、 128 、 256 ,最大可以进行 512 分频。计算公式为:CLOCKSA ( B ) =CLOCKA ( B ) / ( 2*PRESCALER )

通道 0 、 1 、 4 、 5 可选 CLOCKA 或 CLOCKSA

通道 2 、 3 、 6 、 7 可选 CLOCKB 或 CLOCKSB

时钟的选择 PWMCLK 寄存器中的 PCLKx 位来控制

Page 6: MC9S12 单片机 PWM 模块

第八章 ATD 模块和 PWM 模块2. 允许控制

PWM 的允许位相当于“开关”,可以允许和禁止相应通道的 PWM 输出。

每个 PWM 通道都对应一个允许位( PWMEx ),只有 PWMEx=1 时,对应的通道才输出波形。

计数器计数结束的那一刻,只要 PWMEx 为高电平,则会自动开始下一个波形的输出。

Page 7: MC9S12 单片机 PWM 模块

第八章 ATD 模块和 PWM 模块3. 极性控制

每个 PWM 通道都对应一个极性设置位,决定了 P

WM 波的输出首先是高电平还是低电平。PPOLx=1 时,对应的通道首先输出高电平,直到

计数器计数到占空比寄存器的值后变为低电平PPOLx=0 时,对应的通道首先输出低电平,直到

计数器计数到占空比寄存器的值后变为高电平。

Page 8: MC9S12 单片机 PWM 模块

第八章 ATD 模块和 PWM 模块4. 周期和占空比

每个通道都有一个独立周期寄存器一个独立的占空比寄存器

输出波形的周期受周期寄存器的控制,当计数器的计数值等于周期寄器的值时, PWM 波周期结束。

当计数器的计数值等于占空比寄存器的值时, PW

M 输出波形的极性改变。

Page 9: MC9S12 单片机 PWM 模块

第八章 ATD 模块和 PWM 模块5. 计数器

每个通道都有一个 8 位的加法 / 减法计数器计数器的计数频率 = 选择的时钟频率

Page 10: MC9S12 单片机 PWM 模块

第八章 ATD 模块和 PWM 模块6. 左对齐的输出波型

PWMCAE 寄存器中的 CAEx 位是输出格式的控制位。 CAEx=0 ,则对应通道的输出格式是左对齐的。 CAEx=1 ,则对应通道的输出格式是居中对齐的。

当使用左对齐格式输出时, 8 位的计数器只使用加法计数。 当计数器加法计数到占空比寄存器中的值时, PWM 通道输出波形的电平就发生变化;当计数器加法计数到周期寄存器中的值时,计数器复位,输出波形电平发生变化。然后再次读取占空比和周期寄存器中的值作为下次计数参考使用。注意,计数器是从 0 开始计数的,直到周期寄存器中的值。

Page 11: MC9S12 单片机 PWM 模块

第八章 ATD 模块和 PWM 模块

PWM 波形频率的计算:

用时钟源的频率除以周期寄存器中的值

PWMx 频率 = Clock(A, B, SA, or SB) / PWMPERx

Page 12: MC9S12 单片机 PWM 模块

第八章 ATD 模块和 PWM 模块

PWM 波形占空比的计算:(高电平占得百分比)若 Polarity = 0 (PPOLx=0) :首先输出低电平

Duty Cycle = [(PWMPERx-PWMDTYx)/PWMPERx] × 100%

若 Polarity = 1 (PPOLx=1) :首先输出高电平

Duty Cycle = [PWMDTYx / PWMPERx] × 100%

Page 13: MC9S12 单片机 PWM 模块

第八章 ATD 模块和 PWM 模块

下面举一个左对齐输出的例子:假设时钟源频率 =10MHz (周期 =100ns ), PPOLx=0 (首先输出低电平), PWMPERx=4 (周期寄存器), PWMDTYx=1

(占空比寄存器)。所以, PWMx 的频率 = 10MHz/4 = 2.5MHz , PWMx 的周期 =4

00ns , PWMx 的占空比 =3/4×100% = 75% 。

Page 14: MC9S12 单片机 PWM 模块

第八章 ATD 模块和 PWM 模块居中对齐的输出波型

• CAEx=1 ,则对应通道的输出格式是居中对齐的。

计数器既进行加法计数也进行减法计数。 当计数器加法计数到占空比寄存器中的值时, PWM 通道输出波形的电

平发生变化; 当加法计数到周期寄存器中的值时,计数器会从加法计数改变为减法计

数; 当计数器再次减法计数到占空比寄存器中的值时, PWM 通道输出波形

的电平再次发生变化; 当计数器继续减法计数到 $00 时,计数器重新变为加法计数器,然后再

次读取占空比和周期寄存器中的值作为下次计数参考使用。

Page 15: MC9S12 单片机 PWM 模块

第八章 ATD 模块和 PWM 模块

PWM 输出波形的频率:时钟源的频率除以周期寄存器中值的 2 倍PWMx Frequency = Clock(A, B, SA, or SB) / (2×PWMPERx)

若 Polarity = 0 (PPOLx=0)

Duty Cycle = [(PWMPERx-PWMDTYx)/PWMPERx] × 100%若 Polarity = 1 (PPOLx=1)

Duty Cycle = [PWMDTYx / PWMPERx] × 100%

Page 16: MC9S12 单片机 PWM 模块

第八章 ATD 模块和 PWM 模块

下面举一个居中对齐输出的例子:假设时钟源频率 =10MHz (周期 =100ns ), PPOLx=0 , P

WMPERx=4 , PWMDTYx=1 。所以, PWMx 的频率 = 10MHz/8 = 1.25MHz , PWMx 的周期 =800ns , PWMx 的占空比 =3/4×100% = 75% 。

Page 17: MC9S12 单片机 PWM 模块

第八章 ATD 模块和 PWM 模块9S12 PWM 模块的通道级联

如果需要 PWM 输出波形的精度更高,则可以把 2 个 8 位 P

WM 通道级联起来组成 1 个 1

6 位通道。 PWMCTL 寄存器中有 4 个控

制位,可以完成这个级联的功能。 CON67 、 CON45 、 CO

N23 和 CON01 可以把相应的两个通道级联起来。

Page 18: MC9S12 单片机 PWM 模块

第八章 ATD 模块和 PWM 模块

级联后的寄存器 6 和 7 级联时, 6 的寄存器为级联后寄存器的高 8 位 4 和 5 级联时, 4 的寄存器为级联后寄存器的高 8 位 2 和 3 级联时, 2 的寄存器为级联后寄存器的高 8 位 0 和 1 级联时, 0 的寄存器为级联后寄存器的高 8 位

级联后的控制寄存器 时钟是受低 8 位对应通道的寄存器的控制 6 和 7 级联时, 7 的寄存器为级联后控制寄存器 4 和 5 级联时, 5 的寄存器为级联后控制寄存器 2 和 3 级联时, 3 的寄存器为级联后控制寄存器 0 和 1 级联时, 0 的寄存器为级联后控制寄存器

Page 19: MC9S12 单片机 PWM 模块

第八章 ATD 模块和 PWM 模块

PWM 波形是从低 8 位对应通道的外部引脚上输出的。

– 1 、 3 、 5 、 7

PWM 波形的允许、极性、对齐方式、也是由低 8 位对应通道的寄存器控制的。

Page 20: MC9S12 单片机 PWM 模块

第八章 ATD 模块和 PWM 模块寄存器介绍

允许控制寄存器— PWME

极性寄存器— PWMPOL

时钟选择寄存器— PWMCLK

预分频时钟选择寄存器 -PWMPRCLK

居中对齐允许寄存器— PWMCAE

控制寄存器— PWMCTL

比例因子寄存器 A—PWMSCLA

比例因子寄存器 B—PWMSCLB

计数寄存器— PWMCNTx

周期寄存器— PWMPERx

占空比寄存器— PWMDTYx

关断寄存器 --PWMSDN

Page 21: MC9S12 单片机 PWM 模块

第八章 ATD 模块和 PWM 模块允许控制寄存器 --PWME

PWMEx :通道有效选择位。 1= 允许 PWM 输出, 0= 禁止。 当 PWMEx 被置位后, PWM 输出就会立即开始。但是直到 PWM 模块时钟的下一个周期到来之时,才可以输出正确的波形,而在这之前的波形可能会是无效的。当处于级联模式时, 8 个 8 位 PWM 通道组成 4 个 16 位的 PWM 通道, PWME1 、 PWME3 、 PWME5 和 PWME7

对这 4 个通道进行控制,而其它控制位处于无效状态。

Page 22: MC9S12 单片机 PWM 模块

第八章 ATD 模块和 PWM 模块极性寄存器 --PWMPOL

PPOLx :通道 x 的输出极性。1= 先高后低,0= 先低后高。

PWMPOL 寄存器随时都可以进行设置。如果某 PWM 通道在输出波形的过程中,波形的极性发生了改变,那么在两组波形的连接处可能会出现缩短或者拉伸了的不正常波形。

Page 23: MC9S12 单片机 PWM 模块

第八章 ATD 模块和 PWM 模块时钟选择寄存器 --PWMCLK

通道 0 、 1 、 4 、 5 可选 CLOCKA 或 CLOCKSA ;通道 2 、 3 、 6 、 7 可选 CLOCKB 或 CLOCKSB 。PCLK7 : PWM 通道 7 时钟源选择。 1=Clock SB ; 0=Clock BPCLK6 : PWM 通道 6 时钟源选择。 1=Clock SB ; 0=Clock BPCLK5 : PWM 通道 5 时钟源选择。 1=Clock SA ; 0=Clock APCLK4 : PWM 通道 4 时钟源选择。 1=Clock SA ; 0=Clock APCLK3 : PWM 通道 3 时钟源选择。 1=Clock SB ; 0=Clock BPCLK2 : PWM 通道 2 时钟源选择。 1=Clock SB ; 0=Clock BPCLK1 : PWM 通道 1 时钟源选择。 1=Clock SA ; 0=Clock APCLK0 : PWM 通道 0 时钟源选择。 1=Clock SA ; 0=Clock A

Page 24: MC9S12 单片机 PWM 模块

第八章 ATD 模块和 PWM 模块预分频时钟选择寄存器 -PWMPRCLK

此寄存器用来选择 Clock A ( B ) 的预分频因子 Clock B 预分频因子的选择

PCKB2 、 PCKB1 、 PCKB0 : Clock A 预分频因子的选择

PCKA2 、 PCKA1 、 PCKA0

详细列表见课本 P266

Page 25: MC9S12 单片机 PWM 模块

第八章 ATD 模块和 PWM 模块居中对齐允许寄存器 --PWMCAE

此寄存器控制每个 PWM 通道输出波形的对齐方式, 可以是左对齐或者居中对齐。CAEx : 1= 对应 x 通道为居中对齐模式 0= 对应 x 通道为左对齐模式 注意只有当对应通道被禁止输出时,才可以设置此寄存器。

Page 26: MC9S12 单片机 PWM 模块

第八章 ATD 模块和 PWM 模块控制寄存器 --PWMCTL

此寄存器可以实现把 8 个 8 位 PWM 通道级联为 4 个 16 位通道。

CONxy : x 通道和 y 通道级联,以获得更高的输出精度。

1= 级联模式0= 非级联模式

x 通道作为高 8 位, y 通道作为低 8 位。只有通道 y 的时钟选择位、极性控制位、输出允许位和对齐方式选择位才有效;通道 x 的相应寄存器均无效。PFRZ :冻结模式 PWM 计数器停止,(程序调试时有用)

1= 停止, 0= 继续运行。

Page 27: MC9S12 单片机 PWM 模块

第八章 ATD 模块和 PWM 模块比例因子寄存器 A--PWMSCLA

此寄存器用来提供产生时钟 Clock SA 的比例因子Clock SA 是由 Clock A 经过一系列运算得来的,公式:

Clock SA = Clock A / (2×PWMSCLA)

当 PWMSCLA=0 时,默认比例因子为 256 ,此时 Cloc

k SA 的频率等于 Clock A 的频率除以 512 。

Page 28: MC9S12 单片机 PWM 模块

第八章 ATD 模块和 PWM 模块比例因子寄存器 B--PWMSCLB

此寄存器用来提供产生时钟 Clock SB 的比例因子Clock SB 是由 Clock B 经过一系列运算得来的,公式如下:

Clock SB = Clock B / (2×PWMSCLB)

当 PWMSCLB=0 时,默认比例因子为 256 ,此时Clock SB 的频率等于 Clock B 的频率除以 512 。

Page 29: MC9S12 单片机 PWM 模块

第八章 ATD 模块和 PWM 模块x 通道计数寄存器 --PWMCNTx

每个 PWM 通道都有一个独立的加法 / 减法计数器,计数器的频率 = 时钟源的频率。可以在任意时刻来读取计数器里的值,而计数器的工作不会受到影响。

★ 注意左 / 居中对齐方式时,计数器的计数方式。对计数寄存器进行写操作将使它复位,计数器会立即开始加法计数,从周期寄存器和占空比寄存器的缓冲区里得到周期和占空比值,然后根据设置的极性来输出。当相应的 PWM 通道被禁止输出( PWMEx=0 )时,计数器不工作;当 PWM 通道允许时,计数器会以计数寄存器中的值为起点开始计数。

Page 30: MC9S12 单片机 PWM 模块

第八章 ATD 模块和 PWM 模块周期寄存器 --PWMPERx

每个 PWM 通道都有一个独立的周期寄存器,周期寄 存器中的值对应 PWM 通道输出波形的周期。此寄存器具有双重缓存功能,新输入的值被送到缓冲区,而不是立即生效,到下一个有效周期开始时才会有效,所以 PWM 输出波形的周期在改变时不会产生无效波形。

Page 31: MC9S12 单片机 PWM 模块

第八章 ATD 模块和 PWM 模块占空比寄存器 --PWMDTYx

每个 PWM 通道都有一个独立的占空比寄存器。此寄存器同样是双重缓存的。

Page 32: MC9S12 单片机 PWM 模块

第八章 ATD 模块和 PWM 模块关断寄存器 --PWMSDN

在有紧急情况发生时,立即关断 PWM 的输出。PWM7ENA : PWM 紧急关断允许

当此位为 1 时,通道 7 会被强制配置为输入端口,并且允许紧急关断。只有当此位为 1 时,寄存器中的其它位才有意义。

PWM7INL : 紧急关断通道 7 的有效电平。 1= 高电平, 0= 低电平。PWM7IN : PWM 通道 7 的输入电平状态。PWMLVL : PWM 紧急关断后的输出电平。 1= 高, 0= 低。PWMRSTRT :PWM 重新启动。只有在当 PWM 通道 7 处于无效状态(非紧急关闭)时,才可以重新启动 PWM 模块。把 PWMRSTRT 置一,当计数器返回 0 时, PWM 通道才开始运行。PWMIE : PWM 中断允许。 1= 允许, 0= 禁止。PWMIF : PWM 中断标志。当 PWM7ENA 被置位时, PWM 通道 7 上电平的任意变化将产生中断并使 PWMIF 置位。

1=PWM7IN 输入有变化。 0=PWM7IN 输入无变化。

Page 33: MC9S12 单片机 PWM 模块

第八章 ATD 模块和 PWM 模块PWM 的复位和中断

复位复位时,计数器配置为加法计数器所有通道被禁止,计数器不工作

中断PWM 模块仅有一个中断源,在紧急关断时使用

Page 34: MC9S12 单片机 PWM 模块

第八章 ATD 模块和 PWM 模块PWM 的综合举例

利用 PWM5 通道来做 DA 转换输出变化的电压控制小灯的亮度。灯会从暗逐渐变亮。

void PWM_Init(void){PWMPOL=0x20; // 脉冲先高后低PWMCLK=0x20; // 使用 SA 时钟源PWMPRCLK=0x07; // 时钟 A 为总线 128 分频PWMCAE=0x00; // 通道 5 为左对齐输出模式PWMCTL=0x00; //单独使用通道 5, 非级联PWMSCLA=0x05; //Clock SA=Clock A/(2*PWMSCLA)PWMPER5=0x64; // 设定周期}

Page 35: MC9S12 单片机 PWM 模块

第八章 ATD 模块和 PWM 模块

void main(void){

unsigned char i;unsigned long j=10000;SET_PLL(); // 设置锁相环EnableInterrupts;PWMInit(); //初始化 PWMfor(i=0;i<0x64;i++){

while(j--);j=10000;while(j--);j=10000;PWMDTY5=i; // 设定占空比PWME=0x20; // 使能 PWM

}}

Page 36: MC9S12 单片机 PWM 模块

第八章 ATD 模块和 PWM 模块

谢 谢!