智能车制作

标题: 新手讨教 [打印本页]

作者: 山寨本色    时间: 2010-8-1 22:00
标题: 新手讨教
首先声明之所以在本块发帖 因为积分不够在问答区发悬赏,算是新手第一次正式发帖,遇到问题了;
做一个小车,光电的,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
作者: 山寨本色    时间: 2010-8-1 22:04
帖子没有显示完,反正我的QQ:693628381 有一帮忙的请加我,多谢了!
作者: yxll0825    时间: 2010-8-5 21:59
ok




欢迎光临 智能车制作 (http://111.231.132.190/) Powered by Discuz! X3.2