XS128 的PWM用来控制舵机和电机。XS128 的PWM调制波有8个独立的输出通道,每个通道有一个计数器,一个周期控制器和两个可供选择的时钟源,通过编程可以实现的时钟周期和左对齐输出或者居中对齐输出。
现在简单的介绍一下我用到寄存器
PWM启动寄存器PWME 通过使能位PWMEx可控制相应通道PWM的波形输出和关闭
PWM时钟选择寄存器PWMCLK 其中0、1、4、5通道可选用ClockA和CLockSA 2、3、6、7通道可选择ClockB、ClockSB
PWM的预分频寄存器PWMPRCLK 可以对ClockA和ClockB预分频,为总线时钟的1/(2^n)
PWM的分频寄存存器PWMSCLA PWMSCLB 通过分频可得到CLockSA =ClockA/(2*PWMSCLA ) CLockSB =ClockB/(2*PWMSCLB)
PWM的极性选择器PWMPOL 例如PWMPOL-PPL0=1,即为通道0在周期开始时输出为高电平。
PWM波形对齐寄存器PWMCAE 即为 PWMCAE-CAE0=1时,通道0中心对齐输出,PWMCAE-CAE0=0时左对齐输出
PWM控制寄存器PWMCTL 通过此寄存器可以实现通道的级联,扩大了PWM对外输出脉冲的频率范围
PWM通道周期寄存器PWMPERx 每个通道都有一个这样的寄存器
PWM通道占空比寄存器PWMDTYx 每个通道都有这样的占空比寄存器
//pwm初始化的程序,总线频率为40Mhz
//舵机用PWM12,电机用PWM23 PWM67
void InitPWM() { PWME=0;//通道全部禁止 PWMCLK_PCLK1=1;//时钟选择CLOCKSA PWMCLK_PCLK3=0;//时钟选择CLOCKB PWMCLK_PCLK7=0;//时钟选择CLOCKB PWMPRCLK = 0x04; // A=40M/16=2.5M ,B=40M PWMSCLA=5; //SA=2.5M/2/5=250K PWMSCLB=5; //SB=40/5/2=4M PWMPOL_PPOL1=1;//初始电平为高 PWMPOL_PPOL3=1;//初始电平为高 PWMPOL_PPOL7=1;//初始电平为高 PWMCAE=0x00;//左对齐输出 PWMCTL=0xf0;//01,23,67 级联 PWMPER01=5000; // 周期为 500K/5000=50HZ PWMPER23=10000; // 周期为 40M/10000=4k PWMPER67=10000; // 周期为 40M/10000=4k PWMDTY01=0 // 占空比为0% PWMDTY23=0; // 占空比为0% PWMDTY67=0; // 占空比为0% PWME_PWME1=1; //01使能通道 PWME_PWME3=1; //23使能通道 PWME_PWME7=1; //67使能通道}
void ChangePWM1(unsigned int a) { PWMDTY01=a;}
void ChangePWM23(unsigned int a) { PWMDTY23=a;}void ChangePWM67(unsigned int a) { PWMDTY67=a;}