打印

有用过这种电机码盘做过平衡车的吗?有码盘脉冲计数问题

[复制链接]
10688|31
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tsb151|  楼主 | 2015-3-30 22:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
电机我采用AB相脉冲计数,比如A脉冲接外部中断0,下降沿触发,B相脉冲随便接个IO口,在外部中断0服务函数检测B相脉冲接的IO口的电平状态,如果为高电平,那么应该+1,为低电平(电机反向转)-1,但是我把电机一直往同一个方向转,测出来的脉冲2s中左右就挑到+10000多,然后最大+30000多,然后就会出现负值,按理来说不会出现这个问题啊,最近在做平衡车,在加速度环的时候卡在这里了,求大神帮忙解决下。[

相关帖子

沙发
tsb151|  楼主 | 2015-3-30 22:03 | 只看该作者
C:\Users\Administrator\Desktop

使用特权

评论回复
板凳
tsb151|  楼主 | 2015-3-30 22:05 | 只看该作者
C:\Users\Administrator\Desktop\%5B)5NUOE8C0(WY%5A9G`NU1S

使用特权

评论回复
地板
tsb151|  楼主 | 2015-3-30 22:06 | 只看该作者
ASLONG JGA25-371减速电机 带编码器测速码盘马达

使用特权

评论回复
5
tsb151|  楼主 | 2015-3-30 22:08 | 只看该作者
图片不知道怎么传,给了电机型号,麻烦大家帮我看下。

使用特权

评论回复
6
mmuuss586| | 2015-3-31 08:29 | 只看该作者

现在一般用无刷电机,也有用有刷的;
用小尺寸的轮毂电机也不错;

使用特权

评论回复
7
luofeng2g| | 2015-3-31 09:00 | 只看该作者
码盘什么规格的?多少脉冲一周?

使用特权

评论回复
8
tsb151|  楼主 | 2015-3-31 12:22 | 只看该作者
luofeng2g 发表于 2015-3-31 09:00
码盘什么规格的?多少脉冲一周?

电机转一圈输出334个脉冲。规格是ASLONG JGA25-371  减速比1:34

使用特权

评论回复
9
luofeng2g| | 2015-3-31 12:36 | 只看该作者
tsb151 发表于 2015-3-31 12:22
电机转一圈输出334个脉冲。规格是ASLONG JGA25-371  减速比1:34

就这个,2s+10000多?看你代码有没有问题

使用特权

评论回复
10
tsb151|  楼主 | 2015-3-31 14:07 | 只看该作者
luofeng2g 发表于 2015-3-31 12:36
就这个,2s+10000多?看你代码有没有问题

#include <reg51.h>       
sfr AUXR = 0x8E;        //使用STC12C5A60S2单片机
sfr BRT = 0x9C;
char dis_angle[6]; //定义数组
int   speed_mr;                 //右电机转速
int   speed_ml=0;                 //左电机转速
sbit SPDR = P3^4;         //右电机B相测速,用来判断电机转向
sbit SPDL = P3^5;         //左电机B相测速,用来判断电机转向

void Init_BRT()                                ////9600bps@22.1184MHz
{
  
   PCON &= 0x7F;                //波特率不倍速
   SCON = 0x50;                    //8位数据,可变波特率
   AUXR |= 0x04;                //独立波特率发生器时钟为Fosc,即1T
   BRT = 0xB8;                    //设定独立波特率发生器重装值
   AUXR |= 0x01;                //串口1选择独立波特率发生器为波特率发生器
   AUXR |= 0x10;                //启动独立波特率发生器

}
void send_char(unsigned char txd) //sent out data
{
        SBUF = txd;
        while(!TI);                               
        TI = 0;                                       
}
void display(float temp_dat)
{
          int temp,i;
        if(temp_dat<0)
         {
         dis_angle[0]='-';
         temp_dat=-temp_dat;
         }
         else dis_angle[0]='+';
         temp=temp_dat;
         
         dis_angle[1]=temp/10000+0x30;
     temp=temp%10000;
         dis_angle[2]=temp/1000+0x30;
         temp=temp%1000;
         dis_angle[3]=temp/100+0x30;
         temp=temp%100;
         dis_angle[4]=temp/10+0x30;
         temp=temp%10;
         dis_angle[5]=temp%10+0x30;
                  for(i=0;i<6;i++)
         {
          send_char(dis_angle);
         
         }
         
}
void main()
{
   Init_BRT();
   EX0=1;
   EX1=1;
   IT0=1;
   IT1=1;
   EA=1;       
   while(1)
   {
     
           display(speed_mr);        //显示右边码盘计数脉冲
        display(speed_ml);        //显示左边码盘计数脉冲
        send_char(0x0d);
    send_char(0x0a);//换行,回车
   
   
   }


}

//********左电机中断***********************
void INT_L(void) interrupt 0
{

   if(SPDL == 1)  { speed_ml++; }                 //左电机前进
   else                      { speed_ml--; }                 //左电机后退


}


//********右电机中断***********************

void INT_R(void) interrupt 2
{

   if(SPDR == 1)  { speed_mr++; }                 //右电机前进
   else                      { speed_mr--; }                 //右电机后退
   //LED = ~LED;

}

使用特权

评论回复
11
tsb151|  楼主 | 2015-3-31 14:08 | 只看该作者
luofeng2g 发表于 2015-3-31 12:36
就这个,2s+10000多?看你代码有没有问题

串口显示计数脉冲。这个问题困扰我几天了

使用特权

评论回复
12
luofeng2g| | 2015-3-31 19:05 | 只看该作者
本帖最后由 luofeng2g 于 2015-3-31 19:07 编辑
tsb151 发表于 2015-3-31 14:07
#include         
sfr AUXR = 0x8E;        //使用STC12C5A60S2单片机
sfr BRT = 0x9C;

两边都是一样的么? 看来你后面用LED测试情况怎么样?有示波器的话可以抓一下码盘的波形!

使用特权

评论回复
13
tsb151|  楼主 | 2015-3-31 20:24 | 只看该作者
luofeng2g 发表于 2015-3-31 19:05
两边都是一样的么? 看来你后面用LED测试情况怎么样?有示波器的话可以抓一下码盘的波形! ...

是一样的。示波器是方波

使用特权

评论回复
14
tsb151|  楼主 | 2015-3-31 20:42 | 只看该作者
tsb151 发表于 2015-3-31 20:24
是一样的。示波器是方波

码盘的波形不怎么好,

使用特权

评论回复
15
tsb151|  楼主 | 2015-3-31 20:43 | 只看该作者
luofeng2g 发表于 2015-3-31 19:05
两边都是一样的么? 看来你后面用LED测试情况怎么样?有示波器的话可以抓一下码盘的波形! ...

码盘的波形不怎好。

使用特权

评论回复
16
tsb151|  楼主 | 2015-3-31 20:54 | 只看该作者
tsb151 发表于 2015-3-31 20:24
是一样的。示波器是方波

加个QQ吧,529268786  不是的,刚刚用示波器看了一下,我发图片给你看下

使用特权

评论回复
17
ghost2| | 2015-3-31 20:58 | 只看该作者
最大32767?

使用特权

评论回复
18
tsb151|  楼主 | 2015-3-31 21:57 | 只看该作者

差不多。

使用特权

评论回复
19
tsb151|  楼主 | 2015-3-31 22:00 | 只看该作者

过了32767 就开始负的了,而且脉冲计数2,3秒就到32767了

使用特权

评论回复
20
ghost2| | 2015-3-31 22:09 | 只看该作者
tsb151 发表于 2015-3-31 22:00
过了32767 就开始负的了,而且脉冲计数2,3秒就到32767了

16位数最大就是32767呀,你试试uint16或者uint32

使用特权

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

本版积分规则

1

主题

24

帖子

2

粉丝