找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4648|回复: 1
收起左侧

基于平衡车主板电机脉冲采集----------moyuqilin

[复制链接]
ID:77578 发表于 2016-1-29 21:26 | 显示全部楼层 |阅读模式
       上次做了PWM驱动电机,平衡小车光是用MPU6050做的角度环控制不足以满足对稳定性的要求,所以要加上速度环控制,需要采集电机运行的速度,喵呜平衡车上电机所带的是霍尔传感器,电机带动轮子转一圈,共输出374个脉冲信号,我们只需要将脉冲信号让单片机采集回来,就可计算出电机的转速,码盘的输出分a,b两相,主板上分别将两个电机的两相输出接到了int0,time3,int1,time4引脚。所以我们可以使用计数器采集数据,也可以用外部中断采集。
        喵呜的程序使用的是计数器采集电机的脉冲,使用计数器采集脉冲,外部引脚接收到一个脉冲,计数器就会加1,在程序中只需读取计数器的数值便可得到脉冲的个数,使用计数器3,4需要进行如下配置
       void Time3And4Init()
       {
            T4T3M |=0xcc;       //T3T4控制寄存器允许T3T4做计数器运行
            IE2 &=0x1F;         //禁止定时器3,4产生中断
       }
      在初始化后,计数器就开始了运作了,在使用的时候,我们只需读取计数器的高8位和低8位寄存器,
      将高8位左移8位后加上低8位
       i=(T3H<<8)+T3L;
       j=(T4H<<8)+T4L;  
       这就将数据读回去了,然后需要将计数器清零在清零前先关闭计数器吗,然后再启动
                T4T3M &=0x77;  //关闭定时器
                T4H=T4L=0;                //计数器清零
                T3H=T3L=0;                //计数器清零
                T4T3M |= 0xCC;        //启动计数器
       然后这就是计数器采集电机的方法了。
       下面介绍下我写的使用外部中断采集脉冲的程序,这里我们使用int0和int1进行采集
        外部中断配置起来更加的方便,首先int0和int1具有两种出发方式,0上升沿和下降沿都触发,1仅下降沿触发,在这里我们使用仅下降沿出发方式
例如我们配置int0,
         P32=1;
        IT0=1;                //设置中断类型,仅下降沿触发
        EX0=1;                //int0中断使能
        EA=1;                //开总中断
       这就完成了配置,下面编写终端处理函数,int0的中断序号为0
          void exint0() interrupt 0
         {
             Mflag++;
          }
      当int0引脚每检测的一个下降沿,就会进去一次中断,这样我们就可以采集到脉冲的个数了,int1与int0是一样的,不过对于平衡车中将会世道定时器中断,当一个程序中的中断多的时候就是一个很头疼的问题了,在我写完数据采集后,我就写了一个测速的程序,里面就用到time0的定时器中断进行即使,结果在中的配置上出现了问题,导致我查了很久。所以还是要合理的去使用中断,
     下面负上我写的几个程序,
      INT0&amp;INT1getMot.zip (41.44 KB, 下载次数: 28)
回复

使用道具 举报

ID:392493 发表于 2018-9-2 09:41 | 显示全部楼层
楼主使用的是STC15W4KS32系列吗,我之前用STC15F2K60S2系列单片机做的平衡小车出现电机抖动的问题,当时设置的KP,KI值也不算大,但是不知为什么就出现了抖动,抖动很异常,也很奇怪,找了很久也没有找到问题所在,我用的时PCA计数器产生PWM波的。
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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