您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > MC9S12XS128之脉冲宽度调制PWM
半年前就开始写PWM的程序了,那时候只是用来控制电机和舵机。最近在烦着摄像头的显示问题,再次探究PWM,看能不能找到出路。我数了一下,整个PWM模块中,总共有37个寄存器。不过把这些寄存器的功能都理了一下,发现:也不过这么一回事。PWM就是脉冲宽度调制,是英文“PulseWidthModulation”的缩写,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。在XS128中,PWM主要就是通过设置相关的寄存器,让PWM0~PWM7引脚输出一定周期一定占空比的矩形波。输出的矩形波的周期和占空比在输出的过程中,可以通过改变相关寄存器的值来改变的。电机和舵机就这利用这点来控制期速度和转向的。不过观察了一下,似乎在112引脚封装的芯片中才有PWM0到PWM7八个通道的引脚输出,而在80引脚封装的芯片中只有七个通道的引脚输出,没有PWM6的引脚输出。接下来写一下各个寄存器的功能和设置方法:一、PWME:各通道使能寄存器明显,当某位置1时,相应通道的PWM就打开了。置0时,就是禁止该通道的PWM。二、PWMPOL:极性设置寄存器这个寄存器可以设置相应通道的PWM波在每个周期内是先出现高电平后低电平,或是先低电平后高电平。PPOLn=1:n通道对外输出波形先是高电平然后再变为低电平。PPOLn=0:n通道对外输出波形先是低电平然后再变为高电平。这个设置与占空比的计算有关。三、PWMCLK:时钟选择寄存器PWM模块中共有四个时钟,分别为A、B、SA、SB。对于第0、1、4、5通道,PCLKn=0时,则其通选择的是时钟A;当PCLKn=1时,其通道选择的是时钟SA。对于2、3、6、7通道,PCLKn=0时,其通道选择的是时钟B,当PCLKn=1时,其通道选择的是时钟SB。对于这四种时钟,后面还有介绍。四、PWMCAE:对齐方式选择寄存器当某位置1时,则该通道为居中对齐输出方式。置0时,则该通道为左对齐输出方式。对齐方式影响PWMCNTx的计数方式。在左对齐方式中,计数器从0计到PWMCNTx-1,然后这样循环下去。在居中对齐方式中,计数器从0计到PWMCNTx中的值,然后再反正过来计到0,再这样循环下去。五、PWMPRCLK:时钟A、B分频寄存器其中PCKB2~PCKB0是设置时钟B的分频的,PCKA2~PCKA0是设置时钟A的分频的。具体分频设置如下表:六、PWMCTL:设置是否联级输出,不设置联级输出的话,就不用管这个寄存器CON67、CON45、CON23、CON01若置1的话,那相应的两个8位通道就组成联级输出了,也就组成一个16位的通道,然的在通道7、5、3、1上输出。联级后的使能、极性、时钟选择、对齐方式等质性,都是由通道7、5、3、1的PWME、PWMPOL、PWMCLK、PWMCAE等寄存器来设置。七、PWMTST:系统保留的寄存器,不用管八、PWMPRSC:系统保留的寄存器,不用管九、PWMSCLA:SA的分频寄存器ClockSA=ClockA/(2*PWMSCLA)当把PWMSCLA设为0X00时,则系统会令PWMSCLA=256。十、PWMSCLB:SB的分频寄存器ClockSB=ClockB/(2*PWMSCLB)当把PWMSCLB设为0X00时,则系统会令PWMSCLB=256。十一、PWMSCNTA:系统保留的寄存器,不用管十二、PWMSCNTB:系统保留的寄存器,不用管十三、PWMCNT0~PWMCNT7(8位寄存器):计数寄存器十四、PWMPER0~PWMPER7:周期寄存器十五、PWMDTY0~PWMDTY7:占空比寄存器在左对齐方式中,计数器PWMCNT从0开始对时钟信号递增计数,当数值与占空比寄存器PWMDTY的值相等时,使输出电平翻转。计数器继续计数,当计数值与周期寄存器PWMPER的值相等时,使输出电平翻转,同时计数器PWMCNT也复位,又从0开始计起。在居中对齐方式中,计数器从0开始递增计数,当计数值与占空比寄存器PWMDTY的值相等时,使输出电平翻转。计数器继续计数,当计数值与周期寄存器PWMPER的值相等时,计数器的计数方向改为递减计数,当再次与占空比寄存器PWMDTY的值相等时,输出电平翻转,直到计数器计数到0,完成一个周期的输出。对于左对齐方式,输出PWM的周期=计数器加1的时间*PWMPER对于居中对齐方式,输出PWM的周期=计数器加1的时间*PWMPER*2占空比的计数,不仅要看对齐方式,还要看PWM输出的极性,在草稿上画一下,就可以很直观地得出结果。十六、PWMSDN:PWM紧急关闭寄存器PWM模块中有唯一一个中断,就是在这个寄存器中设定。现在再总结一下PWM的设置步骤:一、选择极性PWMPOL二、选择及设置时钟PWMCLKPWMPRCLKPWMSCLAPWMSCLB三、对齐方式PWMCAE四、是否联级输出PWMCTL。不使用联级输出的话,就不用管这个。五、周期设定PWMPER六、占空比设定PWMDTY七、打开PWM通道PWME下面是相关的简单程序,把PP0口接上一个发光二极管,可以实现一秒钟亮一次(16M的晶振,不作PLL设置。)#includehidef.h/*commondefinesandmacros*/#includederivative.h/*derivative-specificdefinitions*/voidPWM_init(){//选用通道0,输出的频率等于总线的频率PWMPOL=0x00;//每个周期,先低电平再高电平PWMCLK=0X01;//选择时钟SA//PWMCLK=0X00;//选择时钟APWMPRCLK=0X07;//时钟A是总线时钟的128分频//PWMPRCLK=0X00;//时钟A是为总线时间PWMCAE=0X00;//左对齐方式PWMSCLA=0X00;//时钟SA是A的2*256分频PWMPER0=244;//周期寄存器PWMDTY0=122;//占空比寄存器PWME=0X01;//打开通道0}voidmain(void){/*putyourowncodehere*/PWM_init();//初始化PWM模块EnableInterrupts;for(;;){_FEED_COP();/*feedsthedog*/}/*loopforever*//*pleasemakesurethatyouneverleavemain*/}
本文标题:MC9S12XS128之脉冲宽度调制PWM
链接地址:https://www.777doc.com/doc-7120710 .html