打印

关于电机行程漂移的问题

[复制链接]
5022|23
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
chenyongand|  楼主 | 2011-3-23 19:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我这是普通的24v直流有刷电机,大概100w,用在车库门上面,电机带蜗轮减速的,电机转子轴上有磁环,有霍尔元件,电机转的时候会输出方波到单片机,单片机外部中断,计数那个边沿,通过计得的数来表示电机行程长短,电机可以正传,反转,停止,通过继电器切换。
    前两天我在一位前辈的指导下,收获匪浅,使得电机如果自己从头走到尾的话,行程不错,
但是,车库门带遥控的,按下遥控,门的运行状态要反向,如果门走到半路停止,然后再返回来,如此循环几次后,会发现,门的起始位置漂移了,这个问题一直还么解决,现在我贴出来部分代码,请求哪位有空帮我分析分析
变量p表示电机的状态 p=1正传,p=3反转,p=0或2停止


    switch(p)        //修改电机运行方向
     {
      case 1:
       {
     PORTA=(1<<PA3);//开门继电器
     PORTC&=~(1<<PC0);//运行灯亮
     Count_allow=1;
     
     if(Set_allow==0)
     {
       if(x==0)
              Slowstart();
             if(Idata2.countss<100)
             {
               x=1;
                //slowstop();
               OCR1B=0;Stop_flag=1;
             }
     }
    }break;
   
      case 3:
       {
     PORTA=(1<<PA2);//关门继电器
     PORTC&=~(1<<PC0);//运行灯亮
     Count_allow=3;
     
     if(Set_allow==0)
     {
       if(x==0)
             Slowstart();
             if(Idata2.countss>Idata1.counter-100)
             {
               x=1;
               //slowstop();
               OCR1B=0;Stop_flag=1;
             }
     }
    }break;
   
      default:
       {
    if(Set_allow==1)  //设置中
    {
       PORTC|=(1<<PC0);//运行灯灭
     
       PORTA&=~((1<<PA2)|(1<<PA3));//释放两个继电器
     
       OCR1B=0;
     
       x=0;
       Set_allow=0;
       studyed=1;
       //Count_allow=0;
    }
    else
     {
      
      if(Stop_allow>150)
       {
   
         PORTC|=(1<<PC0);//运行灯灭
     
         PORTA&=~((1<<PA2)|(1<<PA3));//释放两个继电器
     
         OCR1B=0;
     
         x=0;
     Stop_allow=0;
     // Count_allow=0;
       }
    //  else{}
   
     }
    }break;
     }


那个p值在运行中可以通过遥控改变的,遥控有单独的高频板接受,输出个电平给单片机的一个管脚
下面这段是收到遥控信号后的处理:

if((PINA&0x10)==0x10) //收到高电平
       {
     Remote_flag=1;
     if(Remote_allow==1)
     {
      Remote_allow=0;
      if(p<3) p++;
      else p=0;
     if((p==1)||(p==3)) {Stop_flag=0;Stop_allow=0;}
     if((p==0)||(p==2)) {m=0;OCR1B=0;Stop_flag=1;}
   
      }
   
    }
   else Remote_flag=0;



Stop_flag=1后,开始t0计时,大概1s后,才允许下一次操作,目的是让电机完全停止,



在脉冲计数中断函数中根据p的值进行加计数或者减计数,目前,我只保留了这一个中断源,其他都是查询标志位来进行的
下面是中断函数:

void Int_INT2(void)
        {
  m=0;
  if((p==1)||(p==2))  Idata2.countss--;
  if((p==3)||(p==0))  Idata2.countss++;  
  
  }

我贴出以上部分,欢迎各位讨论,只讨论程序,不讨论硬件问题,硬件运行正常,不改动。我用的是avr的m16芯片

相关帖子

沙发
aihe| | 2011-3-23 22:24 | 只看该作者
硬件问题要软件弥补,累啊

使用特权

评论回复
板凳
yewuyi| | 2011-3-24 00:52 | 只看该作者
查询我原来有一个光电编码器的使用中丢步的分析和解决办法。

解决办法很简单,倍频检查那两个脉冲信号。

使用特权

评论回复
地板
chenyongand|  楼主 | 2011-3-24 07:51 | 只看该作者
2# aihe
硬件没问题,运行正常,是软件没有处理好,不是靠软件弥补

使用特权

评论回复
5
chenyongand|  楼主 | 2011-3-24 07:52 | 只看该作者
3# yewuyi
麻烦详细点好吗,我想知道你那个倍频是怎么用的,不知道我这里能不能用

使用特权

评论回复
6
airwill| | 2011-3-24 08:57 | 只看该作者
这是单位置信号导致的问题啊
"电机转子轴上有磁环,有霍尔元件,电机转的时候会输出方波到单片机,单片机外部中断,计数那个边沿,通过计得的数来表示电机行程长短"
在电机反复换向过程中有个问题:
比如正在向下行进中, 突然因遥控命令, 继电器切换到向上.  但是由于惯性, 电机和执行机构不能立刻反向动作. 而是先减速到零,然后再反向动作.
你的程序没有识别减速到零的过程, 而简单地把它算到了向上的行程里去了, 导致你的行程记录出现了偏差.

使用特权

评论回复
7
chenyongand|  楼主 | 2011-3-24 09:07 | 只看该作者
6# airwill
这位老兄考虑的问题周到
关于惯性这个问题我是这么处理的:收到遥控信号后,门先停止再反向,不是立即反向,我给了大约1s的时间用来停止,这个时间电机早就彻底停止了,在这1
s的时间里,我继续按照刚才的运行方向计数霍尔脉冲,等到1s时间后,才运行下一次遥控操作

使用特权

评论回复
8
chenyongand|  楼主 | 2011-3-24 16:13 | 只看该作者
唉,思路很简单,为啥老是不能很准确的控制行程呢

使用特权

评论回复
9
hxy6951| | 2011-3-24 19:36 | 只看该作者
几个磁钢?每发送一个信号门移动距离多大?

使用特权

评论回复
10
hxy6951| | 2011-3-24 19:38 | 只看该作者
可以在霍尔检测的圆周上多放磁钢,磁钢放的越多分辨率越高

使用特权

评论回复
11
chenyongand|  楼主 | 2011-3-25 08:10 | 只看该作者
10# hxy6951
一个信号门能移动多少,这个我没仔细测过,不过会很短,电机转子速度全速两千多转,减速比59,一个信号,门移动的距离或许都看不出来

另外,轴上的是磁环,目前的分辨率就足够了,主要是咋保证能不漏计就行,尤其是经过遥控改变电机状态后,行程就有点漂移,怀疑是我的遥控那段程序没处理好,会不会跟变量的使用有关??我用的都是全局变量,遥控实际上就是管脚上接的一个按键,查询方式判断是否按下

使用特权

评论回复
12
bald| | 2011-3-25 10:16 | 只看该作者
如果正反转都用上升沿/或下降沿记数会出现这个问题
简单的讲:如果只在磁钢的一个边缘反复运行,那你的计数器只可能向一个方向增加。
合理的做法是用磁钢的同一侧边沿记数,这样如果正转用上升沿记数
的 话,反转就应该用下降沿记数。

使用特权

评论回复
13
chenyongand|  楼主 | 2011-3-25 13:59 | 只看该作者
12# bald
我用的是双边沿计数,也就是上升沿和下降沿都有效,这样情况,不会出现你说的那种情况,
我如果不用遥控停止,而是让其按照设置的脉冲总数行走,脉冲走完自然停止,行程就不会错,而一旦中间用遥控停止了,在反过来运行,如此循环几次后,就能发现行程漂移

看来是遥控那里的程序问题,简单的几句话但我找不出原因

使用特权

评论回复
14
t.jm| | 2011-3-25 17:55 | 只看该作者
把遥控操作功能说一说,p值在其它地方有改变的吗?

使用特权

评论回复
15
acgean| | 2011-3-25 21:44 | 只看该作者
双边沿计数也解决不了这个问题. 比较好的办法是用 2 个传感器, 信号相位差 90°, 根据电平变换次序, 判断出转动方向来, 进行加或减计数.

使用特权

评论回复
16
yewuyi| | 2011-3-25 23:21 | 只看该作者
请使用类似光电编码器的原理来做这个,并且一定要保证至少以A\B相频率的2倍以上检测脉冲信号。

使用特权

评论回复
17
chenyongand|  楼主 | 2011-3-26 07:58 | 只看该作者
14# t.jm

遥控的作用就是把p值加1,p值在0---3之间循环嘛,p值还有两个地方可以改变,就是行程的起始位置和结束位置,这两个位置是自动让p值加1,电机停止

遥控那段程序主要就是这么一个if语句改变p值:
   if(p<3)p++;
  else p=0;

我在最上面贴的有代码,遥控按一下,p值只增加一次

使用特权

评论回复
18
chenyongand|  楼主 | 2011-3-26 08:09 | 只看该作者
15楼  16楼的:

你们说的方法是管用,但我这里用不了,硬件不让改动,因为有别的人已经做出了符合要求的东西,

使用特权

评论回复
19
t.jm| | 2011-3-26 08:47 | 只看该作者
14# t.jm  

遥控的作用就是把p值加1,p值在0---3之间循环嘛,p值还有两个地方可以改变,就是行程的起始位置和结束位置,这两个位置是自动让p值加1,电机停止

遥控那段程序主要就是这么一个if语句改变p值:
   if ...
chenyongand 发表于 2011-3-26 07:58

这个我看到了。
你的功能是不是:
1:手动开门,中间没遥控时到顶就停?(Idata2.countss>Idata1.counter-100)
2: 手动关门,中间没遥控时到底就停?(Idata2.countss<100)
3: 测试时是手动开,遥控停,遥控关门,再手动开,遥控停,遥控关门吧?
感觉需加这两个修改P值得语句。
if(Idata2.countss<100)
             {
               x=1;
                //slowstop();
               p = 2;           // 电机已经停止,修改状态标志。
               OCR1B=0;Stop_flag=1;
             }

if(Idata2.countss>Idata1.counter-100)
             {
               x=1;
               //slowstop();
               p = 0;           // 电机已经停止,修改状态标志。
               OCR1B=0;Stop_flag=1;
             }

使用特权

评论回复
20
chenyongand|  楼主 | 2011-3-26 14:11 | 只看该作者
本帖最后由 chenyongand 于 2011-3-26 14:14 编辑

19# t.jm

你的理解基本是这样的,只是开门命令也是遥控操作的,遥控操作一下,p加1,p为1或者3 时候,电机就是开门或者关门,,到顶或者到底就停,中间如果遥控不操作,这个停的位置不会漂移,如果中间遥控又按 了一下,把p值变成了停止了,下次再按,电机又启动,这时候到顶或者到底的位置就变了

另外,你给改的那段,中间按下遥控停止的时候,不会执行的,只有到底或者到顶了,
if(Idata2.countss>Idata1.counter-100)或者if(Idata2.countss<100)
这时候,才能执行这段,
加的那个p=0和p=2这句,我早就有的,只是不管用,一样会飘

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

514

帖子

8

粉丝