智能车制作全过程(飞思卡尔)
发布时间:2024-10-11
发布时间:2024-10-11
智能车制作全过程(飞思卡尔)
智能车制作全过程(飞思卡尔
)
如果我写得好,请顶我一下,我将再接再厉!
(本人在很久以前做的一辆用来比赛的智能车--获得华北一等奖,全国二等奖,有许多可改进地方.)
下面我们来立即开始我们的智能车之旅:
首先,一个系统中,传感器至关重要
.
"不管你的CPU的速度如何的快,通信机制如何的优越,系统的精度永远无法超越传感器的精度" .是的,在这个系统中,传感器的精度,其准确性就显得至关重要.如果你问我传感器的电路,呵呵,我早就和大家分享了,在我发表的日志中,有一篇<<基于反射式距离传感器>>的文章就详细的说明了传感器的硬件电路以及可以采取的信号采样方式.
智能车制作全过程(飞思卡尔)
传感器安装成一排,如上面排列.(就是个一字排列,没有什么特别) 接下来,看看我们如何处理传感器得到的信息
:
大家看到了.结构很简单,我们已经搞定了传感器通路.下面我们来看看多机的控制方面的问题:
其实,不管是便宜还是比较贵的舵机,都是一样的用法.舵机的特点就是不同的占空比方波就对应着舵机的不同转角.当然不同的舵机有不同的频率要求.比如我用的这个舵机:方波频率50HZ.怎么改变占空比?这个不就是PWM模块的功能嘛.PWM模块可以输出任意占空比的方波.只要你控制其中的占空比寄存器,就可以直接控制舵机的转角.你只要将传感器的状态和这个占空比对应上,不就OK了?就这么简单,做到这里,你就可以让你的车在跑道上跑了!
接下来,我们的工作是让智能车更加完善:速度要稳定.
智能车制作全过程(飞思卡尔)
在当前的系统结构中,要使一个系统更稳定更可靠,闭环系统是一个选择.(如果你不知道什么是闭环系统,可以参照我的文章里面的一篇"基于单片机的PID电机调速"),既然是一个闭环系统,速度传感器是必不可少的,用什么样的传感器做为速度反馈呢
:
仔细看,和后轮之间有一条皮带的这个貌似电机的东西,就是我的速度传感器,它的学名叫"旋转编码器".这个器件的特点就是:每转一圈,就会从输出端输出一定的脉冲,比如我这个旋转编码器是500线的,就是转一圈输出500个脉冲.因此,我只要在单位时间内计数输出端输出的脉冲数,我就可以计算出车辆的速度.显然,这个速度可以用来作为PID速度调节的反馈.
现在有了反馈,我们需要的是调节智能车驱动电机的速度了,如何来调速,就成了必须解决的问题了.我用的是驱动芯片MC33886. 其实,这个芯片就是一个功率放大的模块
.
智能车制作全过程(飞思卡尔)
我们知道,单片机输出的PWM信号还是TTL信号,是不能直接用来驱动电机的.非要通过功率模块的放大不可.这个道理其实很简单,就像上次我给大家画的哪个电子琴电路的放大电路一样
:
看上面的那个三极管,就是将TTL电路的电流放大,才能够来驱动蜂鸣器.其实这里的这个MC33886就是这样的一个作用.而且我们自己也完全可以用三极管自己搭建一个这样的功率放大电路,当然,驱动能力肯定不如这里的这个MC33886(如我们用三极管就搭建了超过MC33886的电路,摩托罗拉就不会卖几十块钱一个了.呵呵.)知道了这个MC33886的工作原理,就好说了,一句话,通过PWM来调节电机的速度.当方波中高电平占的比例大,电机的平均电压肯定高,转速肯定快.也就是说,PWM的占空比越大,电机转速越高.
看,就这么简单,这个智能车就做好了.接下来,我们就把我们知道的PID知识放到舵机和直流驱动电机的控制中去.就可以达到一个比较好的控制效果.
如果要达到更高的水平,肯定机械方面的改造也少不了.当然,这不属于本文的讨论范围.呵呵.
智能车制作全过程(飞思卡尔---舵机篇 发表于 2008/11/28 10:00:55
智能车制作全过程(飞思卡尔)
感谢大家的支持!如果我写得好,请顶我一下!
智能车的制作中,看经验来说,舵机的控制是个关键.相比驱动电机的调速,舵机的控制对于智能车的整体速度来说要重要的多.
PID算法是个经典的算法,一定要将舵机的PID调好,这样来说即使不进行驱动电机的调速(匀速),也能跑出一个很好的成绩.
机械方面:
从我们的测试上来看,舵机的力矩比较大,完全足以驱动前轮的转向.因此舵机的相应速度就成了关键.怎么增加舵机的响应速度呢?更改舵机的电路?不行,组委会不允许.一个非常有效的办法是更改舵机连接件的长度.我们来看看示意图
:
从上图我们能看到,当舵机转动时,左右轮子就发生偏转.很明显,连接件长度增加,就会使舵机转动更小的转角而达到同样的效果.舵机的特点是转动一定的角度需要一定的时间.不如说(只是比喻,没有数据),舵机转动10度需要2ms,那么要使轮子转动同样的角度,增长连接件后就只需要转动5度,那么时间是1ms,就能反应更快了.据经验,这个舵机的连接件还有必要修改.大约增长0.5倍~2倍.
在今年中,有人使用了两个舵机分别控制两个轮子.想法很好.但今年不允许使用了. 接下来就是软件上面的问题了.
这里的软件问题不单单是软件上的问题,因为我们要牵涉到传感器的布局问题.其实,没有人说自己的传感器布局是最好的,但是肯定有最适合你的算法的.比如说,常规的传感器布局是如下图:
智能车制作全过程(飞思卡尔)
这里好像说到了传感器,我们只是略微的一提.上图只是个示意图,意思就是在中心的地方传感器比较的密集,在两边的地方传感器比较的稀疏.这样做是有好处的,大家看车辆在行驶到转弯处的情况
:
相信看到这里,大家应该是一目了然了,在转弯的时候,车是偏离跑道的,所以两边比较稀疏还是比较科学的,关于这个,我们将在传感器中在仔细讨论。
在说到接下来的舵机的控制问题,方法比较的多,有人是根据传感器的状态,运用查表法差出舵机应该的转角,这个做法简单,而且具有较好的滤波"效果",能够将错误的传感器状态滤掉;还有人根据计算出来的传感器的中心点(比如第四个和第五个传感器检测到黑线,中心点就是4.5),计算出舵机需要的转角,这个做法也比较的简单,但是必须有一个滤波的过程,必须要滤掉错误的传感器状态.比如说:现在传感器第四个,第五个和第11个检测到了黑线,显然第11个应该是个传感器检测错误.应该把它滤掉.关于这个如何滤波,我们待会在后面将进行讨论.还有人的做法就是采用PID算法,这个方法比较的好,其实也不是很难,就是PID参数整定的时候有些麻烦. 大家可以自己选择喜欢的方法. 关于滤波,有些许的方法: 1.平均值排序法.
这个方法大家肯定一听就知道是怎么回事.就是不急于执行,先多次检测被测传感器,累加,求平均值.这个方法不错,特别在单片机中.比如:你如果连续采集8次,累加,最后你只要右移三位(value=value>>3;)就是value=value/8的结果.毕竟,在单片机中,右移比除法要快嘛.
2.中间值算法.
智能车制作全过程(飞思卡尔)
这个算法也简单,顾名思义,就是取不大不小的中间的值.这个算法就需要把几次采集的值排序,然后使用中间的那个值. 3.递推滤波.
这个滤波方法比较的受认可,但是执行起来也有风险所在.先说这个算法,就是根据当前值(传感器的中心点所在值),推算接下来的传感器中心点的量,如果发现前后变化剧烈,就视为干扰因素,忽略.这个算法看起来比较的好.但是风险就在于:如果出现了错误,并且错误的中心点成为的当前值,那么以错误的中心点为基准,正确的中心点就成了干扰.这样就会出现极端情况.为了避免这个情况,我们应该有一个检查的模块,检查当前的中心点是否有效.这个检查,我们也许可以结合前面两种方法,在一定时间对中心点的有效性进行检查. 4.限幅滤波.
这个在舵机的控制中,特别是使用计算的方法获得PWM信号占空比的(用来控制舵机的转角),更是尤为重要.这个滤波的思路就是规定一个最大值和一个最小值,当计算出的值低于最小值时,令其等于最小值;大于最大值时,令其等于最大值
.
智能车制作全过程(飞思卡尔) 发表于
2008/11/15 22:28:01
如果我写得好,请顶我一下,我将再接再厉!
(本人在很久以前做的一辆用来比赛的智能车--获得华北一等奖,全国二等奖,有许多可改进地方.)
下面我们来立即开始我们的智能车之旅: 首先,一个系统中,传感器至关重要.
智能车制作全过程(飞思卡尔)
"不管你的CPU的速度如何的快,通信机制如何的优越,系统的精度永远无法超越传感器的精度" .是的,在这个系统中,传感器的精度,其准确性就显得至关重要.如果你问我传感器的电路,呵呵,我早就和大家分享了,在我发表的日志中,有一篇<<基于反射式距离传感器>>的文章就详细的说明了传感器的硬件电路以及可以采取的信号采样方式
.
传感器安装成一排,如上面排列.(就是个一字排列,没有什么特别) 接下来,看看我们如何处理传感器得到的信息:
智能车制作全过程(飞思卡尔)
大家看到了.结构很简单,我们已经搞定了传感器通路.下面我们来看看多机的控制方面的问题:
其实,不管是便宜还是比较贵的舵机,都是一样的用法.舵机的特点就是不同的占空比方波就对应着舵机的不同转角.当然不同的舵机有不同的频率要求.比如我用的这个舵机:方波频率50HZ.怎么改变占空比?这个不就是PWM模块的功能嘛.PWM模块可以输出任意占空比的方波.只要你控制其中的占空比寄存器,就可以直接控制舵机的转角.你只要将传感器的状态和这个占空比对应上,不就OK了?就这么简单,做到这里,你就可以让你的车在跑道上跑了!
接下来,我们的工作是让智能车更加完善:速度要稳定.
在当前的系统结构中,要使一个系统更稳定更可靠,闭环系统是一个选择.(如果你不知道什么是闭环系统,可以参照我的文章里面的一篇"基于单片机的PID电机调速"),既然是一个闭环系统,速度传感器是必不可少的,用什么样的传感器做为速度反馈呢:
智能车制作全过程(飞思卡尔)
仔细看,和后轮之间有一条皮带的这个貌似电机的东西,就是我的速度传感器,它的学名叫"旋转编码器".这个器件的特点就是:每转一圈,就会从输出端输出一定的脉冲,比如我这个旋转编码器是500线的,就是转一圈输出500个脉冲.因此,我只要在单位时间内计数输出端输出的脉冲数,我就可以计算出车辆的速度.显然,这个速度可以用来作为PID速度调节的反馈.
现在有了反馈,我们需要的是调节智能车驱动电机的速度了,如何来调速,就成了必须解决的问题了.我用的是驱动芯片
MC33886.
其实,这个芯片就是一个功率放大的模块.我们知道,单片机输出的PWM信号还是TTL信号,是不能直接用来驱动电机的.非要通过功率模块的放大不可.这个道理其实很简单,就像上次
智能车制作全过程(飞思卡尔)
我给大家画的哪个电子琴电路的放大电路一样
:
看上面的那个三极管,就是将TTL电路的电流放大,才能够来驱动蜂鸣器.其实这里的这个MC33886就是这样的一个作用.而且我们自己也完全可以用三极管自己搭建一个这样的功率放大电路,当然,驱动能力肯定不如这里的这个MC33886(如我们用三极管就搭建了超过MC33886的电路,摩托罗拉就不会卖几十块钱一个了.呵呵.)知道了这个MC33886的工作原理,就好说了,一句话,通过PWM来调节电机的速度.当方波中高电平占的比例大,电机的平均电压肯定高,转速肯定快.也就是说,PWM的占空比越大,电机转速越高.
看,就这么简单,这个智能车就做好了.接下来,我们就把我们知道的PID知识放到舵机和直流驱动电机的控制中去.就可以达到一个比较好的控制效果.
如果要达到更高的水平,肯定机械方面的改造也少不了.当然,这不属于本文的讨论范围.呵呵.
基于单片机的电子琴设计 发表于 2008/11/14 11:02:11
如果我写得好,请顶我一下,我将再接再厉
很多朋友喜欢搞一些声光的东西,因为能看到,能听到,比搞个什么通信滤波要好玩多了.好!我们就开始做个电子琴.甚至做一个简单的"MP3",呵呵,从简单开始.我们先做电子琴,下一节再做"MP3".
首先,因为是发声装置,我们得先了解发声的原理是什么,这有助于我们接下来的编程:
1.声音是由于物体震动产生的.
2.电流的变化通过线圈就可以使磁场发声变化.
智能车制作全过程(飞思卡尔)
上图是一个喇叭的工作原理.不知道大家看明白了没有.喇叭的电磁铁的电源是接到我们的发声电路上.当电路中的电路发生变化时,电磁铁的吸引力也发生变化.因此就会吸合铁皮.吸合铁皮的时候也带动了薄膜的运动.如果这个吸合过程非常的快.那么薄膜就会发生高频的震动.这个震动就会发出声音.
上面只是一个示意图.实际上的喇叭并不是磁铁吸音铁框的问题,铁框往往也会换成一个磁铁,不过是永磁铁,这样不但可以吸引,还可以排斥.声音幅度更大. 好了,总而言之一句话,就是来来回回的震动就会产生声音. 接下来,我们开始制作吧:电路相当的简单:
智能车制作全过程(飞思卡尔)
看到了吧,电路非常的简单.下面是四个键盘的按键开关.上面就是一个三极管的放大.有人说,我直接接到单片机上就不行.完全可以!我为什么说是个电流放大呢,就是要发生的功率大,声音大.如果你将蜂鸣器直接接到单片机的IO口上,当然是可以的.但是只是用来验证用的,声音太小,实际中是没有用处的. 不过,我可得提醒你
:
你如果这样接,那就不对了.为什么?问题就在于,单片机的IO口的驱动能力是绝对有限的,你现在让它直接驱动一个功率比较大(比较LED而言)蜂鸣器,是比较吃力的.但是你却可以这样设计:
智能车制作全过程(飞思卡尔)
什么?没有发现有什么不同?呵呵,看看,蜂鸣器的电压方向变了.为什么这样做,这就是一个开发经验问题了:单片机的IO口吸收电流的能力要远远大于其提供电流的能力.所以不管是驱动蜂鸣器还是驱动LED发光二极管,都要做成低电平有效的这种形式,切实有效! (本人的实验板,具备上述模块,其原理图和上述完全一致.有实验板的朋友可以接着往下做了)
好了,硬件连接OK了,我们赶紧开始我们的编程吧:
我先说说算法,要实现一定频率的震动,不就是将IO端口进行一定频率的开和关就是了.要进行一定频率的开和关,就必须有一个计数.在这里,定时计数器就比较合适了.自动重装载模式显然比较合适.我们来看看程序吧(鉴于c语言良好的可阅读性,我们先用c语言来编写):
#include <reg51.h>
#define uint unsigned int #define uchar unsigned char
#define SOUNDER P0_BIT2 //用宏定义端口,直观.如以后更改,方便 #define S1 P2_BIT4 #define S2 P2_BIT5 #define S3 P2_BIT6 #define S4 P2_BIT7 #define YES 0 #define NO 1
int YIN[7][2]; //定义一个音阶数组,存放计数器的计数初始值. int Dir="3",i;
void TimerInit() //计数器初始化函数. {
TMOD="0x21"; TL0=0; TH0=0;
智能车制作全过程(飞思卡尔)
TH1=0xE8; TL1=0xE8; PCON=0x00; TR0=1; TR1=1; SCON=0x50; }
void main() {
// 261 1 //低音叨 频率261 YIN[0][0]= (65536-10000/261/2*100)%256; YIN[0][1]= (65536-10000/261/2*100)/256; // 294 2
YIN[1][0]= (65536-10000/294/2*100)%256; YIN[1][1]= (65536-10000/294/2*100)/256; // 330 3
YIN[2][0]= (65536-10000/330/2*100)%256; YIN[2][1]= (65536-10000/330/2*100)/256; // 349 4
YIN[3][0]= (65536-10000/349/2*100)%256; YIN[3][1]= (65536-10000/349/2*100)/256; // 392 5
YIN[4][0]= (65536-10000/392/2*100)%256; YIN[4][1]= (65536-10000/392/2*100)/256; // 440 6
YIN[5][0]= (65536-10000/440/2*100)%256; YIN[5][1]= (65536-10000/440/2*100)/256; // 494 7
YIN[6][0]= (65536-10000/492/2*100)%256; YIN[6][1]= (65536-10000/492/2*100)/256; EA="1"; //开CPU中断 ET0=1; //开定时计数器中断 TimerInit(); //调用初始化计数器函数 for(;;){}
/////////////////////////////////////////////////////////////////////////////////////////////
void TimerOverFlow () interrupt 1 //定时器中段函数 {
if(S1= =YES) {
SOUNDER=!SOUNDER; TL0=YIN[0][0]; TH0=YIN[0][1];
智能车制作全过程(飞思卡尔)
}
if(S2= = YES) {
SOUNDER=!SOUNDER; TL0=YIN[1][0]; TH0=YIN[1][1]; }
if(S3= =YES) {
SOUNDER=!SOUNDER; TL0=YIN[2][0]; TH0=YIN[2][1]; }
if(S4= =YES)
{
SOUNDER=!SOUNDER; TL0=YIN[3][0]; TH0=YIN[3][1]; }
// Clear the flag
TF0=0; }
相信大家看得明白程序,很简单.下载到单片机上以后,按S1键,蜂鸣器发出低音1(叨)的声音.按S2发2(ruan)的声音...
基于单片机的数字PID实现直流电机调速(智能车) 发表于 2008/11/12 9:45:33
下一篇:远程教育先进站点管理员材料