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;
}