智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 2547|回复: 2
打印 上一主题 下一主题

新手讨教

[复制链接]

3

主题

8

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
345
QQ
威望
202
贡献
51
兑换币
0
注册时间
2009-5-10
在线时间
46 小时
跳转到指定楼层
1#
发表于 2010-8-1 22:00:54 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
首先声明之所以在本块发帖 因为积分不够在问答区发悬赏,算是新手第一次正式发帖,遇到问题了;
做一个小车,光电的,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

0

主题

2

帖子

0

精华

注册会员

Rank: 2

积分
122
威望
172
贡献
20
兑换币
0
注册时间
2009-5-16
在线时间
1 小时
3#
发表于 2010-8-5 21:59:24 | 只看该作者
ok
回复 支持 反对

使用道具 举报

3

主题

8

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
345
QQ
威望
202
贡献
51
兑换币
0
注册时间
2009-5-10
在线时间
46 小时
2#
 楼主| 发表于 2010-8-1 22:04:20 | 只看该作者
帖子没有显示完,反正我的QQ:693628381 有一帮忙的请加我,多谢了!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-9-21 10:41 , Processed in 0.415265 second(s), 37 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表