|
上次做了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&INT1getMot.zip
(41.44 KB, 下载次数: 28)
|
|