370 likes | 709 Views
MC9S12 单片机 PWM 模块. 山东大学控制科学与工程学院 2010.8. 脉冲宽度调制 PWM 模块. PWM ( Pulse Width Modulate )即脉宽调制,脉宽调制波是一种可用程序来控制波形 占空比 、 周期 、 相位 的波形。它在电动机驱动、 D/A 变换等场合有着广泛的应用。 周期,占空比,相位。 周期指上图中的 τ ,占空比为 t/ τ ,相位指高低电平。. 9S12 PWM 模块特性.
E N D
MC9S12单片机PWM模块 山东大学控制科学与工程学院 2010.8
脉冲宽度调制PWM模块 • PWM(Pulse Width Modulate)即脉宽调制,脉宽调制波是一种可用程序来控制波形占空比、周期、相位的波形。它在电动机驱动、D/A 变换等场合有着广泛的应用。 • 周期,占空比,相位。 • 周期指上图中的τ,占空比为t/ τ,相位指高低电平。
9S12 PWM模块特性 • 对于DG128(80pin):7个周期、占空比可编程的PWM通道(PP0-PP5,PP7);对于112引脚的,有8个PWM通道。 • 专用的PWM计数器 • PWM功能的软件使能和禁止(允许寄存器) • 软件选择脉冲极性 • PWM波形输出对齐方式分为左对齐和居中对齐 • 可以两个通道级联以获得更高的精度 • 可选择4个时钟源,4个时钟源均为独立的分频设置 • 紧急关断功能
1. 时钟 • 四个时钟源 • CLOCKA、CLOCKB、CLOCKSA、CLOCKSB。 分频 总线时钟 CLOCKA 分频 CLOCKSA 分频 分频 CLOCKSB CLOCKB • CLOCKA(B) • 可以把总线时钟进行1、2、4、8、16、32、64、128分频。 • Clock A 的预分频因子通过PWMPRCLK寄存器中的PCKA2、PCKA1和PCKA0来选择 • Clock B 的预分频因子通过PWMPRCLK 寄存器中的PCKB2、PCKB1和PCKB0 来选择。
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位来控制
2. 允许控制 • PWM的允许位相当于“开关”,可以允许和禁止相应通道的PWM输出。 • 每个PWM 通道都对应一个允许位(PWMEx),只有PWMEx=1 时,对应的通道才输出波形。 • 计数器计数结束的那一刻,只要PWMEx 为高电平,则会自动开始下一个波形的输出。
3. 极性控制 • 每个PWM 通道都对应一个极性设置位,决定了PWM 波的输出首先是高电平还是低电平。 • PPOLx=1时,对应的通道首先输出高电平,直到计数器计数到占空比寄存器的值后变为低电平 • PPOLx=0时,对应的通道首先输出低电平,直到计数器计数到占空比寄存器的值后变为高电平。
4. 周期和占空比 • 每个通道都有 • 一个独立周期寄存器 • 一个独立的占空比寄存器 • 输出波形的周期受周期寄存器的控制,当计数器的计数值等于周期寄器的值时,PWM波周期结束。 • 当计数器的计数值等于占空比寄存器的值时,PWM输出波形的极性改变。
5. 计数器 • 每个通道都有一个8位的加法/减法计数器 • 计数器的计数频率=选择的时钟频率
6. 左对齐的输出波型 • PWMCAE 寄存器中的CAEx 位是输出格式的控制位。 • CAEx=0,则对应通道的输出格式是左对齐的。 • CAEx=1,则对应通道的输出格式是居中对齐的。 • 当使用左对齐格式输出时,8 位的计数器只使用加法计数。 • 当计数器加法计数到占空比寄存器中的值时,PWM 通道输出波形的电平就发生变化; • 当计数器加法计数到周期寄存器中的值时,计数器复位,输出波形电平发生变化。然后再次读取占空比和周期寄存器中的值作为下次计数参考使用。 • 注意,计数器是从0开始计数的,直到周期寄存器中的值。
PWM波形频率的计算: • 用时钟源的频率除以周期寄存器中的值 • PWMx 频率= Clock(A, B, SA, or SB) / PWMPERx
PWM波形占空比的计算:(高电平占得百分比) • 若Polarity = 0 (PPOLx=0):首先输出低电平 • Duty Cycle = [(PWMPERx-PWMDTYx)/PWMPERx] × 100% • 若Polarity = 1 (PPOLx=1):首先输出高电平 • Duty Cycle = [PWMDTYx / PWMPERx] × 100%
下面举一个左对齐输出的例子: • 假设时钟源频率=10MHz(周期=100ns),PPOLx=0(首先输出低电平),PWMPERx=4(周期寄存器),PWMDTYx=1(占空比寄存器)。 • 所以,PWMx 的频率 = 10MHz/4 = 2.5MHz,PWMx 的周期=400ns,PWMx 的占空比=3/4×100% = 75%。
居中对齐的输出波型 • CAEx=1,则对应通道的输出格式是居中对齐的。 • 计数器既进行加法计数也进行减法计数。 • 当计数器加法计数到占空比寄存器中的值时,PWM 通道输出波形的电平发生变化; • 当加法计数到周期寄存器中的值时,计数器会从加法计数改变为减法计数; • 当计数器再次减法计数到占空比寄存器中的值时,PWM 通道输出波形的电平再次发生变化; • 当计数器继续减法计数到$00 时,计数器重新变为加法计数器,然后再次读取占空比和周期寄存器中的值作为下次计数参考使用。
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%
下面举一个居中对齐输出的例子: 假设时钟源频率=10MHz(周期=100ns),PPOLx=0,PWMPERx=4,PWMDTYx=1。 所以,PWMx 的频率 = 10MHz/8 = 1.25MHz,PWMx 的周期=800ns,PWMx 的占空比=3/4×100% = 75%。
9S12 PWM模块的通道级联 • 如果需要PWM 输出波形的精度更高,则可以把2 个8 位PWM 通道级联起来组成1 个16 位通道。 • PWMCTL寄存器中有4 个控制位,可以完成这个级联的功能。CON67、CON45、CON23 和CON01 可以把相应的两个通道级联起来。
级联后的寄存器 • 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的寄存器为级联后控制寄存器
PWM波形是从低8位对应通道的外部引脚上输出的。PWM波形是从低8位对应通道的外部引脚上输出的。 • 1、3、5、7 • PWM波形的允许、极性、对齐方式、也是由低8位对应通道的寄存器控制的。
寄存器介绍 • 允许控制寄存器—PWME • 极性寄存器—PWMPOL • 时钟选择寄存器—PWMCLK • 预分频时钟选择寄存器-PWMPRCLK • 居中对齐允许寄存器—PWMCAE • 控制寄存器—PWMCTL • 比例因子寄存器A—PWMSCLA • 比例因子寄存器B—PWMSCLB • 计数寄存器—PWMCNTx • 周期寄存器—PWMPERx • 占空比寄存器—PWMDTYx • 关断寄存器--PWMSDN
允许控制寄存器--PWME • PWMEx:通道有效选择位。1=允许PWM输出,0=禁止。 • 当PWMEx 被置位后,PWM 输出就会立即开始。但是直到PWM 模块时钟的下一个周期到来之时,才可以输出正确的波形,而在这之前的波形可能会是无效的。 • 当处于级联模式时,8 个8 位PWM 通道组成4 个16 位的PWM 通道,PWME1、PWME3、PWME5 和PWME7 对这4 个通道进行控制,而其它控制位处于无效状态。
极性寄存器--PWMPOL • PPOLx:通道x的输出极性。 • 1=先高后低, • 0=先低后高。 • PWMPOL 寄存器随时都可以进行设置。如果某PWM 通道在输出波形的过程中,波形的极性发生了改变,那么在两组波形的连接处可能会出现缩短或者拉伸了的不正常波形。
时钟选择寄存器--PWMCLK • 通道0、1、4、5可选CLOCKA或CLOCKSA; • 通道2、3、6、7可选CLOCKB或CLOCKSB。 • PCLK7:PWM 通道7 时钟源选择。1=Clock SB ;0=Clock B • PCLK6:PWM 通道6 时钟源选择。1=Clock SB ;0=Clock B • PCLK5:PWM 通道5 时钟源选择。1=Clock SA ;0=Clock A • PCLK4:PWM 通道4 时钟源选择。1=Clock SA ;0=Clock A • PCLK3:PWM 通道3 时钟源选择。1=Clock SB ;0=Clock B • PCLK2:PWM 通道2 时钟源选择。1=Clock SB ;0=Clock B • PCLK1:PWM 通道1 时钟源选择。1=Clock SA ;0=Clock A • PCLK0:PWM 通道0 时钟源选择。1=Clock SA ;0=Clock A
预分频时钟选择寄存器-PWMPRCLK • 此寄存器用来选择Clock A (B) 的预分频因子 • Clock B 预分频因子的选择 • PCKB2、PCKB1、PCKB0: • Clock A 预分频因子的选择 • PCKA2、PCKA1、PCKA0 详细列表见课本P266
居中对齐允许寄存器--PWMCAE • 此寄存器控制每个PWM 通道输出波形的对齐方式, • 可以是左对齐或者居中对齐。 • CAEx: 1=对应x通道为居中对齐模式 • 0=对应x通道为左对齐模式 • 注意只有当对应通道被禁止输出时,才可以设置此寄存器。
控制寄存器--PWMCTL • 此寄存器可以实现把8 个8 位PWM 通道级联为4 个16 位通道。 • CONxy:x通道和y通道级联,以获得更高的输出精度。 • 1=级联模式 • 0=非级联模式 • x通道作为高8位,y通道作为低8位。 • 只有通道y的时钟选择位、极性控制位、输出允许位和对齐方式选择位才有效;通道x 的相应寄存器均无效。 • PFRZ:冻结模式PWM 计数器停止,(程序调试时有用) • 1=停止,0=继续运行。
比例因子寄存器A--PWMSCLA • 此寄存器用来提供产生时钟Clock SA 的比例因子 • Clock SA 是由Clock A 经过一系列运算得来的,公式: • Clock SA = Clock A / (2×PWMSCLA) • 当PWMSCLA=0 时,默认比例因子为256,此时Clock SA 的频率等于Clock A 的频率除以512。
比例因子寄存器B--PWMSCLB • 此寄存器用来提供产生时钟Clock SB 的比例因子 • Clock SB 是由Clock B 经过一系列运算得来的,公式如下: • Clock SB = Clock B / (2×PWMSCLB) • 当PWMSCLB=0 时,默认比例因子为256,此时Clock SB 的频率等于Clock B 的频率除以512。
x通道计数寄存器--PWMCNTx • 每个PWM 通道都有一个独立的加法/减法计数器,计数器的频率=时钟源的频率。可以在任意时刻来读取计数器里的值,而计数器的工作不会受到影响。 ★注意左/居中对齐方式时,计数器的计数方式。 • 对计数寄存器进行写操作将使它复位,计数器会立即开始加法计数,从周期寄存器和占空比寄存器的缓冲区里得到周期和占空比值,然后根据设置的极性来输出。 • 当相应的PWM通道被禁止输出(PWMEx=0)时,计数器不工作;当PWM 通道允许时,计数器会以计数寄存器中的值为起点开始计数。
周期寄存器--PWMPERx • 每个PWM 通道都有一个独立的周期寄存器,周期寄 存器中的值对应PWM 通道输出波形的周期。 • 此寄存器具有双重缓存功能,新输入的值被送到缓冲区,而不是立即生效,到下一个有效周期开始时才会有效,所以PWM 输出波形的周期在改变时不会产生无效波形。
占空比寄存器--PWMDTYx • 每个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 输入无变化。
PWM的复位和中断 • 复位 • 复位时,计数器配置为加法计数器 • 所有通道被禁止,计数器不工作 • 中断 • 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; //设定周期 }
void main(void) { unsigned char i; unsigned long j=10000; SET_PLL(); //设置锁相环 EnableInterrupts; PWMInit(); //初始化PWM for(i=0;i<0x64;i++) { while(j--); j=10000; while(j--); j=10000; PWMDTY5=i; //设定占空比 PWME=0x20; //使能PWM } }