标题:
基于平衡车主板电机脉冲采集----------moyuqilin
[打印本页]
作者:
moyuqilin
时间:
2016-1-29 21:26
标题:
基于平衡车主板电机脉冲采集----------moyuqilin
上次做了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)
2016-1-29 21:25 上传
点击文件名下载附件
下载积分: 黑币 -5
time4&3getMot.zip
(42.08 KB, 下载次数: 26)
2016-1-29 21:25 上传
点击文件名下载附件
下载积分: 黑币 -5
下一个
MPU6050数据采集
作者:
CT任你
时间:
2018-9-2 09:41
楼主使用的是STC15W4KS32系列吗,我之前用STC15F2K60S2系列单片机做的平衡小车出现电机抖动的问题,当时设置的KP,KI值也不算大,但是不知为什么就出现了抖动,抖动很异常,也很奇怪,找了很久也没有找到问题所在,我用的时PCA计数器产生PWM波的。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1