没找到好办法,自己整了个软件PWM波,还蛮好用的,共享一下。
void Init_Timer1(void)
{
/* 定时器0初始化 */
T1CTCR = 0; //定时器模式
T1TC = 0; /* 定时器设置为0 */
T1PR = 0; /* 时钟不分频 */
T1MCR = 0x03; /* 设置T0MR0匹配后复位计数器,并产生中断标志 */
// T1MR0 = (18432000 / 100000)*3; /* 0.01mS秒钟定时计数值 */
T1MR0 = (18432000 / 120000)*3; /* 0.01mS秒钟定时计数值 */
T1TCR = 0x01; /* 启动定时器 */
/* 设置定时器0中断IRQ */
}
#define SIM_PWM5 1<<21 //P0.21
#define SIM_PWM6 1<<9 //P0.9
uint uiPWM5_RatioSetValue;
uint uiPWM6_RatioSetValue;
uint uiPWMPlusLength;
#define SIM_PWM_Plus_MaxLength 1200 //控制波形的周期
uint uiSIM_PWM5_Temp;
uint uiSIM_PWM6_Temp;
void SIM_PWM_PLUS_CTRL(void)
{
if(uiPWMPlusLength)
{
uiPWMPlusLength--;
}
else
{
uiPWMPlusLength = SIM_PWM_Plus_MaxLength;
// ucSIM_PWM_Temp = 98; //占空比控制值
// ucSIM_PWM_Temp = 70; //占空比控制值
uiSIM_PWM5_Temp = uiPWM5_RatioSetValue;
uiSIM_PWM6_Temp = uiPWM6_RatioSetValue;
LightContol(2,1);
IO0SET = SIM_PWM5;
IO0SET = SIM_PWM6;
}
if(uiSIM_PWM5_Temp)
{
uiSIM_PWM5_Temp--;
}
else
{
// LightContol(2,0);
IO0CLR = SIM_PWM5;
// IO0CLR = SIM_PWM6;
}
if(uiSIM_PWM6_Temp)
{
uiSIM_PWM6_Temp--;
}
else
{
// LightContol(2,0);
IO0CLR = SIM_PWM6;
}
}
uchar ucFlag;
void IRQ_Timer1(void) __irq
{
if(ucFlag)
{
ucFlag =0;
}
else
{
ucFlag =1;
}
if(ucFlag)
{
LightContol(1,1);
}
else
{
LightContol(1,0);
}
SIM_PWM_PLUS_CTRL();
T1IR = 0x01;
VICVectAddr = 0x00;
}
//初始化系统中断
void Init_SystemInterrupt(void)
{
/* 设置定时器0中断IRQ */
VICIntSelect = 0x00; /* 所有中断通道设置为IRQ中断 */
VICVectCntl0 = 0x20 | 0x05; /* 设置定时器1中断通道分配最高优先级 */
VICVectAddr0 = (unsigned int)IRQ_Timer1; /* 设置中断服务程序地址 */
VICIntEnable = 1 << 0x05; /* 使能定时器1中断 */
}
有了上述支撑函数
主调函数很简单,如下:
//ID:伺服电机号 1 2
//vecter:角度参数 0-180
void ServerMotor(char ID,char vecter)
{
switch(ID)
{
case 1:
uiPWM5_RatioSetValue = 94+ vecter;
break;
case 2:
uiPWM6_RatioSetValue = 94+ vecter;
break;
}
}
|