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

[复制链接]
11395|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减速电机 带编码器测速码盘马达
 楼主| tsb151 发表于 2015-3-30 22:08 | 显示全部楼层
图片不知道怎么传,给了电机型号,麻烦大家帮我看下。
mmuuss586 发表于 2015-3-31 08:29 | 显示全部楼层

现在一般用无刷电机,也有用有刷的;
用小尺寸的轮毂电机也不错;
luofeng2g 发表于 2015-3-31 09:00 | 显示全部楼层
码盘什么规格的?多少脉冲一周?
 楼主| tsb151 发表于 2015-3-31 12:22 | 显示全部楼层
luofeng2g 发表于 2015-3-31 09:00
码盘什么规格的?多少脉冲一周?

电机转一圈输出334个脉冲。规格是ASLONG JGA25-371  减速比1:34
luofeng2g 发表于 2015-3-31 12:36 | 显示全部楼层
tsb151 发表于 2015-3-31 12:22
电机转一圈输出334个脉冲。规格是ASLONG JGA25-371  减速比1:34

就这个,2s+10000多?看你代码有没有问题
 楼主| 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;

}
 楼主| tsb151 发表于 2015-3-31 14:08 | 显示全部楼层
luofeng2g 发表于 2015-3-31 12:36
就这个,2s+10000多?看你代码有没有问题

串口显示计数脉冲。这个问题困扰我几天了
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测试情况怎么样?有示波器的话可以抓一下码盘的波形!
 楼主| tsb151 发表于 2015-3-31 20:24 | 显示全部楼层
luofeng2g 发表于 2015-3-31 19:05
两边都是一样的么? 看来你后面用LED测试情况怎么样?有示波器的话可以抓一下码盘的波形! ...

是一样的。示波器是方波
 楼主| tsb151 发表于 2015-3-31 20:42 | 显示全部楼层
tsb151 发表于 2015-3-31 20:24
是一样的。示波器是方波

码盘的波形不怎么好,
 楼主| tsb151 发表于 2015-3-31 20:43 | 显示全部楼层
luofeng2g 发表于 2015-3-31 19:05
两边都是一样的么? 看来你后面用LED测试情况怎么样?有示波器的话可以抓一下码盘的波形! ...

码盘的波形不怎好。
 楼主| tsb151 发表于 2015-3-31 20:54 | 显示全部楼层
tsb151 发表于 2015-3-31 20:24
是一样的。示波器是方波

加个QQ吧,529268786  不是的,刚刚用示波器看了一下,我发图片给你看下
ghost2 发表于 2015-3-31 20:58 来自手机 | 显示全部楼层
最大32767?
 楼主| tsb151 发表于 2015-3-31 21:57 | 显示全部楼层
 楼主| tsb151 发表于 2015-3-31 22:00 | 显示全部楼层

过了32767 就开始负的了,而且脉冲计数2,3秒就到32767了
ghost2 发表于 2015-3-31 22:09 来自手机 | 显示全部楼层
tsb151 发表于 2015-3-31 22:00
过了32767 就开始负的了,而且脉冲计数2,3秒就到32767了

16位数最大就是32767呀,你试试uint16或者uint32
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

24

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部