中级会员
- 积分
- 345
- 威望
- 202
- 贡献
- 51
- 兑换币
- 0
- 注册时间
- 2009-5-10
- 在线时间
- 46 小时
|
首先声明之所以在本块发帖 因为积分不够在问答区发悬赏,算是新手第一次正式发帖,遇到问题了;
做一个小车,光电的,STC12C5A60S2单片机,自带两路PCA_PWM模块,我用于电机控制了,我这个车子有特殊要求就是在停车之后要开门——延时——关门,我在这块遇到问题了,车子不能开门,开门和方向控制的舵机型号和参数的设定一样,按一般的做法就是舵机的控制用定时器加中断模拟PWM,我已经用掉一个定时器在传感器数组那里了,就是在一个0.5MS周期内更新一次数组的值。如下程序:
void timer1() interrupt 3 using 1 /*设置光电管采样周期为0.5ms,传递变量为light光电管采样程序*/
{ j=0;
count=0;
i=0;
tab[0]=a0; /*数组更新赋值*/
tab[1]=a1;
tab[2]=a2;
tab[3]=a3;
tab[4]=a4;
tab[5]=a5;
tab[6]=a6;
tab[7]=a7;
tab[8]=a8;
while(i<9)
{ if(tab[i]==0)
{ position[j]=i;
count=count+1;
j=j+1;
}
i=i+1;
}
TH1=(65536-500)/256;
TL1=(65536-500)%256;
}
那么就只有一个定时器了,要控制两个舵机,我该怎么做了呢?
我的做法是,在一个定时器家中断的服务程序里设定两个输出端口p12,p13,P12用于输出控制方向舵机,p13则是控制开门舵机,如下:
void timer0(void) interrupt 1 using 1 /*设置定时器中断产生舵机控制pwm控制变量为 width*/
{ p12=~p12;p13=~p13; if(p12==1&&p13==1)
c=65536-width;
else
c=65536-(10000-width);
TH0=(c/256);
TL0=(c%256);
a=a+1;
}
然后我设置一个停车参数STOP,当是STOP%2==0即是偶数时候表明第二次检测到停车线,此时我让p12=0,即关闭方向多级的输出,程序如下:
while(1)
{
if(count>4) //停车程序.....
{
{ stop=stop+1;
delay(30);
} //检测到第一条黑线,延时避免重复检测
if(stop%2==0)//检测停车线是偶数
{
p12=0; 、、//关闭方向舵机端口
int_delay();
width=center; //保持舵机角度?
speed=0xff;
CCAP0L=speed;
CCAP0H=speed;
CR=1;
CCAPM0=0x42;
kaimen();//具体如下面的城里面的开门程序
CR=0;
EA=0;
while(1)
{ ;}
如果STOP%2==1,表明是奇数则前进状态,程序如下:
else //反之检测停车线是奇数时
p13=0; 、、// 关闭开门舵机端口
if(a4==0)
{width=center; //舵机角度不变
speed=0x00; //占空比为90%
}
else if(a3==0)
{ width=center+50;
speed=0x00;}
等等 省略一些了
CCAP0L=speed;
CCAP0H=speed;
CR=1;
CCAPM0=0x42;
上述程序编译成功但是运行不出效果;
我也想过不用那个传感器定时器,而是用这个定时器来做另一个舵机的中断服务程序,分别控制开门舵机和方向舵机,这两个程序结构一样,只是变量不一样,一个是width1,一个是width2;如下:
void timer0(void) interrupt 1 using 1 /*设置定时器中断产生方向舵机控制pwm控制变量为 width1*/
{ p1=~p12;
if(p12==1)
c=65536-width1;
else
c=65536-(10000-width1);
}
void timer1(void) interrupt 2 using 1 /*设置定时器中断产生开门舵机控制pwm控制变量为 width2*/
{ p17=~p17;
if(p17==1)
c=65536-width2;
else
c=65536-(10000-width2);
%0 |
|