ImageVerifierCode 换一换
格式:DOCX , 页数:18 ,大小:674.96KB ,
资源ID:6500431      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6500431.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(飞思卡尔处理器PWM模块精讲.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

飞思卡尔处理器PWM模块精讲.docx

1、飞思卡尔处理器PWM模块精讲一、手把手教你写S12XS128程序-PWM模块介绍注:第二部分在第10页。该教程以MC9S12XS128单片机为核心进行讲解,全面阐释该16位单片机资源。本文为第一讲,开始介绍该MCU的PWM模块。PWM 调制波有 8 个输出通道,每一个输出通道都可以独立的进行输出。每 一个输出通道都有一个精确的计数器(计算脉冲的个数),一个周期控制寄存器 和两个可供选择的时钟源。每一个 PWM 输出通道都能调制出占空比从 0100% 变化的波形。PWM 的主要特点有:1、它有 8 个独立的输出通道,并且通过编程可控制其输出波形的周期。2、每一个输出通道都有一个精确的计数器。3、

2、每一个通道的 PWM 输出使能都可以由编程来控制。4、PWM 输出波形的翻转控制可以通过编程来实现。5、周期和脉宽可以被双缓冲。当通道关闭或 PWM 计数器为 0 时,改变周期和脉宽才起作用。6、8 字节或 16 字节的通道协议。7、有 4 个时钟源可供选择(A、SA、B、SB),他们提供了一个宽范围的时 钟频率。8、通过编程可以实现希望的时钟周期。9、具有遇到紧急情况关闭程序的功能。 10、每一个通道都可以通过编程实现左对齐输出还是居中对齐输出。1、PWM启动寄存器PWMEPWME 寄存器每一位如图 1 所示: 复位默认值:0000 0000B图 1 PWME 寄存器每一个PWM 的输出通道

3、都有一个使能位 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、

4、PWM时钟选择寄存器PWMCLKPWMCLK 寄存器每一位如图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)的时钟源设为ClockB1、PWM预分频寄存

5、器PWMPRCLKPWMPRCLK 寄存器每一位如图3 所示: 复位默认值:0000 0000B图 3 PWMPRCLK 寄存器PWMPRCLK 寄存器包括ClockA预分频和ClockB预分频的控制位。ClockA、ClockB的值为总线时钟的1/2n (0n7),具体设置参照图4和图5图 4 Clock A 预分频设置图5 Clock B 预分频设置PCKB0PCKB2 是对ClockB进行预分频。PCKA0PCKA2 是对ClockA进行预分频。2、PWM分频寄存器PWMSCLA、PWMSCLBPWMSCLA 寄存器每一位如图 6所示:图6 PWMSCLA寄存器Clock SA 是通过对

6、 PWMSCLA 寄存器的设置来对ClockA 进行分频而产生的。其计算公式为:Clock SA=Clock A /(2*PWMSCLA)PWMSCLB 寄存器与PWMSCLA 寄存器相似,Clock SB 就是通过对PWMSCLB 寄存器的设置来对 ClockB 进行分频而产生的。其计算公式为:Clock SB=Clock B /(2*PWMSCLB)1、PWM极性选择寄存器PWMPOLPWMPOL 寄存器每一位如图7 所示:该寄存器是07通道PWM输出起始极性控制位,用来设置PWM输出的起始电平。 用法:PWMPOL_PPOL0=1- 通道 0 在周期开始时输出为高电平,当计数器等于占空比

7、寄存器的值时,输出为低电平。对外输出波形先是高电平然后再变为低电平。2、PWM波形对齐寄存器PWMCAEPWMCAE 寄存器每一位如图 8 所示:图 8 PWMCAE 寄存器PWMCAE 寄存器包含 8 个控制位来对每个 PWM 通道设置左对齐输出或中心对齐输出。用法: PWMCAE_CAE0 = 1 - 通道0 中心对齐输出 PWMCAE_CAE7 = 0 - 通道7 左对齐输出注意:只有输出通道被关闭后才能对其进行设置,即通道被激活后不能对其进行设置。1、PWM控制寄存器PWMCTLPWMCTL 寄存器每一位如图 9 所示:图 9 PWMCTL 寄存器该控制寄存器设定通道的级联和两种工作模

8、式:等待模式和冻结模式。这两种模式如图10和图11所示。 图10 等待模式 图11 冻结模式只有当相应的通道关闭后,才能改变 这些控制字。用法:PWMCTLCON67=1 - 通道 6、7 级联成一个16位的PWM通道。此时只有 7 通道的控制字起作用,原通道7的使能位、PWM输出极性选择位、时钟选择控制位以及对齐方式选择位用来设置级联后的PWM输出特性PWMCTLCON67=0 - 通道 6,7 通道不级联CON45、CON23、CON01 的用法同 CON67 相似。设置此控制字的意义在于扩大了 PWM 对外输出脉冲的频率范围。PSWAI=1 - MCU 一旦处于等待状态,就会停止时钟的输

9、入。这样就不会因时钟在空操作而费电;当它置为 0,则 MCU 就是处于等待状态,也允许时钟的输入。PFRZ=1 - MCU 一旦处于冻结状态,就会停止计数器工作。S12微控制器PWM模块是由独立运行的8位脉冲计数器PWMCNT、两个比较寄存器PWMPER和PWMDTY组成。1、左对齐方式在该方式下,脉冲计数器为循环递增计数,计数初值为0 。当PWM使能后,计数器PWMCNT从0开始对时钟信号递增计数,开始一个输出周期。当计数值与占空比常数寄存器PWMDTY相等时,比较器1输出有效,将触发器置位,而PWMCNT继续计数;当计数值与周期常数寄存器PWMPER相等时,比较器2输出有效,将触发器复位,

10、同时PWMCNT也复位,结束一个输出周期。原理参照图14:图14 PWM左对齐方式2、中心对齐方式在该方式下,脉冲计数器为双向计数,计数初值为0 。当PWM使能后,计数器PWMCNT从0开始对时钟信号递增计数,开始输出一个周期。当计数器与占空比常数寄存器PWMDTY相等时,比较器1输出有效,触发器翻转,而PWMCNT继续计数,当计数值与周期常数PWMPER相等时,比较器2输出有效,此时改变PWMCNT的计数方向,使其递解计数;当PWMCNT再次与PWMDTY相等时,比较器1再一次输出有效,使触发器再次翻转,而PWMCNT继续递减计数,等待PWMCNT减回至0,完成一个输出周期。原理参照图15:

11、图15 中心对齐方式3、周期计算方法左对齐方式:输出周期 = 通道周期 PWMPERx中心对齐方式:输出周期 = 通道周期 PWMPERx 24、脉宽计算方法左对齐方式:占空比 = (PWMPERx - PWMDTYx) / PWMPERx 100%中心对齐方式:占空比 = PWMDTYx / PWMPERx 100%1、PWM通道计数寄存器 PWMCNTxPWMCNTx 寄存器共有 8个,每一个通道都有一个8位PWM加/减双向计数器,通道级联后可变成16位PWM加/减双向计数器。下面以PWMCNT0为例对 PWMCNTx 寄存器进行介绍。PWMCNT0 寄存器如图 12 所示:图 12 PW

12、MCNT0 寄存器 计数器以所选时钟源的频率运行。计数器在任何时候都可以被读,而不影响计数,也不影响对 PWM 通道的操作。任何值写入 PWMCNT0 寄存器都会导致计数器复位置 0,且其计数方向会 被设置为向上计数,并且会立刻从缓冲器载入任务和周期值,并会根据翻转极性的设置来改变输出。当计数器达到计数值后,会自动清零。只有当通道使能后,计数器才开始计数。2、PWM通道周期寄存器PWMPERxPWMPERx 寄存器共有 8 个,每一个通道都有一个这样的周期寄存器。这个 寄存器的值就决定了相关 PWM 通道的周期。每一个通道的周期寄存器都是双缓 冲的,因此如果当通道使能后,改变他们的值,将不会发

13、生任何作用,除非当下列情况之一发生:*有效的周期结束。*对计数器进行写操作(计数器复位)*通道不可用(PWMEx = 0)这样就会使 PWM 输出波形要么是新波形要么是旧波形,并不会在两者之间 进行交替变换。如果通道不可用,那么对周期寄存器进行写操作,将会直接图表 1导致 周期寄存器同缓冲器一起闭锁。图 13 所示的是 PWMPER0 寄存器:图 13 PWMPER0 寄存器3、PWM通道占空比寄存器PWMDTYxPWMDTYx 寄存器也有 8 个,每一个通道都有一个这样的占空比常数寄存 器。这个寄存器的值就决定了相关 PWM 通道输出波形的占空比。每一个通道的 占空比寄存器都是双缓冲的,因此

14、如果当通道被激活后,改变他们的值将不会发生任何作用,除非当下列情况之一发生:*有效的周期结束。*对计数器进行写操作(计数器复位)*通道不可用(PWMEx = 0)这样就会使 PWM 输出波形要么是新波形要么是旧波形,并不会在两者之间 进行交替变换。如果通道没有被激活,那么对占空比常数寄存器进行写操作,将会直接导致周期寄存器同缓冲器一起闭锁。当计数值与占空比常数 PWMDTY 相等时,则比较输出器有效,这时就会将触发器置位,然后 PWMCNT 继续计数,当计数值与周期常数 PWMPER 相等时,比较器输出有效,将触发器复位,同时也使 PWMCNT 复位,结束一个输出周期。S12微控制器PWM模块

15、是由独立运行的8位脉冲计数器PWMCNT、两个比较寄存器PWMPER和PWMDTY组成。1、左对齐方式在该方式下,脉冲计数器为循环递增计数,计数初值为0 。当PWM使能后,计数器PWMCNT从0开始对时钟信号递增计数,开始一个输出周期。当计数值与占空比常数寄存器PWMDTY相等时,比较器1输出有效,将触发器置位,而PWMCNT继续计数;当计数值与周期常数寄存器PWMPER相等时,比较器2输出有效,将触发器复位,同时PWMCNT也复位,结束一个输出周期。原理参照图14:图14 PWM左对齐方式2、中心对齐方式在该方式下,脉冲计数器为双向计数,计数初值为0 。当PWM使能后,计数器PWMCNT从0

16、开始对时钟信号递增计数,开始输出一个周期。当计数器与占空比常数寄存器PWMDTY相等时,比较器1输出有效,触发器翻转,而PWMCNT继续计数,当计数值与周期常数PWMPER相等时,比较器2输出有效,此时改变PWMCNT的计数方向,使其递解计数;当PWMCNT再次与PWMDTY相等时,比较器1再一次输出有效,使触发器再次翻转,而PWMCNT继续递减计数,等待PWMCNT减回至0,完成一个输出周期。原理参照图15:图15 中心对齐方式3、周期计算方法左对齐方式:输出周期 = 通道周期 PWMPERx中心对齐方式:输出周期 = 通道周期 PWMPERx 24、脉宽计算方法左对齐方式:占空比 = (P

17、WMPERx - PWMDTYx) / PWMPERx 100%中心对齐方式:占空比 = PWMDTYx / PWMPERx 100%PWM 初始化步骤总结1、禁止PWM PWME = 02、选择时钟 PWMPRCLK,PWMSCLA,PWMSCLB,PWMCLK3、选择极性 PWMPOL4、选择对齐方式 PWMCAE5、选择占空比和周期 PWMDTYx, PWMPERx6、使能PWM PWME = 1【例程1】/-/功能说明:MC9S12XS128-PWM例程/使用说明:实现通道3(PTP3)输出频率为1KHz,占空比为50%的方波,用示波器观察/程序设计:电子设计吧【】/设计时间:2010

18、.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初始化程序-

19、/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; / n

20、o 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

21、make sure that you never leave main */二、手把手教你飞思卡尔MC9S12HZ系列MCU PWM模块作者:盛多铮单位:安徽师范大学电子信息工程系寒假的时候开始接触9S12XS128这款片子,并在寒假掌握了codewarrior开发环境的基本使用和SCI模块串口收发方面的编程。新学期一开始由于一直在忙着另外一个采集方面的课题,所以飞思卡尔的学习进展不是很快,今天看了PWM模块和PIT模块的相关资料,并自己写了一些小小的程序,在示波器上看到了理想的波形,所以趁着今晚有空,将这方面的学习感悟总结一下,在自我总结的同时,也希望给你的学习带来一些帮助,所谓赠人玫瑰,手

22、留余香呵呵。废话不多说,进入正题PWM模块 9S12XS128共有8个独立的可编程的PWM通道,可配置成8个8位或4个16位的PWM通道,共有4个时钟源,可软件设置对齐方式和极性,这里所谓的极性就是说PWM一开始输出的是高电平还是低电平。下面就我们常用的寄存器作简单介绍(因为别的寄存器我也没用到呵呵。)1、PWM Enable Register(PWME) PWME7:0分别控制着对应的8个通道的使能,例如: PWME_PWME0=0:禁止通道0的PWM输出 PWME_PWME7=1: 使能通道7的PWM输出2、PWM Polarity Register(PWMPOL) ZAPWMPOL寄存器

23、是用来控制PWM一开始输出时的信号高低情况,假如PPOLX设为1,则与之相应的PWM通道在开始的时候输出为高电平,然后等到计数器的值与你设置的那个PWM信号的值(PWMDTYx)相等的时候就输出低电平。PPOL的值为0的时候正好与这相反。3、PWM Clock Select Register(PWM 时钟选择)PWMCLK寄存器是用来设置每个通道的参考时钟源的,每个通道都有2个时钟源,具体的为CLOCK A,CLOCK SA(0,1,4,5);CLOCK B,CLOCK SB(2,3,6,7),例如:PWMCLK_PCLK0=0;则通道0选择CLOCK A作为时钟源PWMCLK_PCLK6=1

24、;则通道6选择CLOCK SB作为参考时钟源4、PWM Prescale Clock Select Regisrer(PWMPRCLK) PWMPRCLK的第3位和第7位没有定义,低三位用来设置CLOCK A的分频,4-6位则设置CLOCK B的分频,以CLOCK A为例,具体值的计算如下表: 假如说,外部晶振为12M,SYNR为1,REFDV的值为0,则总线时钟为24M,然后你将PWMPRCLK设为0x03,那么你这个CLOCK A的频率就为3M5、PWM Center Align Enable Register(PWMCAE)PWMCAE寄存器用来设置每个通道的对齐方式,CAEx为0时,设

25、置相应的通道为左对齐,CAEx为1时,设置相应的通道为中心对齐,例如:PWMCAE_PCAE=0,则通道0设置为左对齐,那么左对齐和中心对齐有什么不同呢,别急,这个等讲到PWMDTYx和PWMPERx这两个寄存器后要好解释一点。6、PWM Control Register (PWMCTL) PWMCTL寄存器可以控制相应通道之间的两两级联情况,以便将PWM口设置成16位的输出,这样有利于提高精度,比如你设置PWMCTL_CON01=1;那么通道0和通道1就级联成一个16位的PWM输出通道,这个16位的PWM通道的输出端为通道1的输出端口,其配置情况也由通道1的相应寄存器去设置。除此之外,PWM

26、CTL寄存器还可以设置PWM的运行模式,具体的解释为:当PSWAI=0的时候,则始终在等待模式下继续运行,当PFRZ=1的时候,则禁止PWM模块在Freeze模式下的运行7、PWM Scale A Rerister(PWMSCLA)PWMSCLA寄存器是用来将CLOCK A寄存器继续压缩分频,以产生CLOCK SA,具体的计算公式如下:CLOCK SA=CLOCK/2*PWMSCLA注意:当PWMSCLA为0的时候实际上是满标度值,也就是将COLCK A 512分频寄存器各位如下所示8、PWM Scale B Register(PWMSCLB)该寄存器的使用情况和PWMSCLA一样,这里不累述

27、,具体可参考上面一段9、PWM Channel Period Registers(PWMPERx) 每个通道都有一个专用的用来设置周期情况的寄存器(PWMPERx),这个寄存器的值就决定了PWM通道输出信号周期的长短,如果我们已经知道的参考时钟源的值,那么就可以计算出PWM输出信号的周期了,计算方法如下:PWMxPeriod=ChannelClockPeriod*PWMPERx(左对齐情况下)PWMxPeriod=ChannelClockPeriod*PWMPERx*2(左对齐情况下)10、PWM Channel Duty Registers(PWMDTYx) 每个通道都有一个专用的用来设置占

28、空比的寄存器PWMDTYx,PWMDTYx和PWMPERx的值共同决定了占空比的值,就是说当每个通道的count的值计数到与PWMDTYx的值相等时,相应的输出信号就发生一次翻转。如果你设置PWMPOL寄存器的某位PPOLx的值为1,也就是开始的时候输出为高电平,然后当计数器数到与PWMDTYx的值后就翻转为低电平,那么PWMDTY寄存器的值就包含了高电平的时间,再结合占空比说明一下吧PPOLx=1:占空比=(PWMDTYx/PWMPERx)*100%PPOLx=0:占空比=(PWMPERx-PWMDTYx)/PWMPERx*100%这样讲应该就懂了吧. 好了,要是我自己在做项目的用到这一块的

29、时候当然不会这么繁琐的看一遍了,直接看看着手册,然后把每个寄存器配置的值往记事本里一写,所有的寄存器都配置完后把这些个值往模块初始化函数里一贴,搞定。所以这里花了这么多的篇幅,充其量也只是希望对正出于飞思门槛上的一些朋友一点帮助罢了。下面附上一段PWM模块的子函数: #include void PWMInit() PWME_PWME0=0; PWMCLK_PCLK0=1; /选择COLCK SA PWMPOL_PPOL0=1; /开始的时候输出高电平 PWMPRCLK=0x03; /预分频,CLOCK=BUS CLOCK/8; PWMCAE_CAE0=0; /左对齐 PWMCTL=0x00; /不级联,等待模式和冻结模式下允许时钟继续运行 PWMSCLA=245; PWMDTY0=200;/根据你的需要在适当的位置改变PWMDTYx的值即可。 PWMPER0=100;/此处可设计占空比 PWME_PWME0=1; 这是产生PWM的一个程序,使用时应加上设置BUS CLOCK的程序(这部分在时钟模块中讲到,此处就不多说了)。不过直接使用上述函数,不添加BUS CLOCK的程序也是可以的,这时候BUS CLOCK为系统默

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1