智能车制作全过程43.docx
《智能车制作全过程43.docx》由会员分享,可在线阅读,更多相关《智能车制作全过程43.docx(48页珍藏版)》请在冰豆网上搜索。
智能车制作全过程43
智能车制作全过程43
假如我写得好,请顶我一下,我将再接再厉!
(本人在专门久往常做的一辆用来竞赛的智能车--获得华北一等奖,全国二等奖,有许多可改进地点.)
下面我们来赶忙开始我们的智能车之旅:
第一,一个系统中,传感器至关重要.
"不管你的CPU的速度如何的快,通信机制如何的优越,系统的精度永久无法超越传感器的精度".是的,在那个系统中,传感器的精度,其准确性就显得至关重要.假如你问我传感器的电路,呵呵,我早就和大伙儿分享了,在我发表的日志中,有一篇<<基于反射式距离传感器>>的文章就详细的说明了传感器的硬件电路以及能够采取的信号采样方式.
传感器安装成一排,如上面排列.(确实是个一字排列,没有什么专门)
接下来,看看我们如何处理传感器得到的信息:
大伙儿看到了.结构专门简单,我们差不多搞定了传感器通路.下面我们来看看多机的操纵方面的问题:
事实上,不管是廉价依旧比较贵的舵机,差不多上一样的用法.舵机的特点确实是不同的占空比方波就对应着舵机的不同转角.因此不同的舵机有不同的频率要求.比如我用的那个舵机:
方波频率50HZ.如何改变占空比?
那个不确实是PWM模块的功能嘛.PWM模块能够输出任意占空比的方波.只要你操纵其中的占空比寄存器,就能够直截了当操纵舵机的转角.你只要将传感器的状态和那个占空比对应上,不就OK了?
就这么简单,做到那个地点,你就能够让你的车在跑道上跑了!
接下来,我们的工作是让智能车更加完善:
速度要稳固.
在当前的系统结构中,要使一个系统更稳固更可靠,闭环系统是一个选择.(假如你不明白什么是闭环系统,能够参照我的文章里面的一篇"基于单片机的PID电机调速"),既然是一个闭环系统,速度传感器是必不可少的,用什么样的传感器做为速度反馈呢:
认真看,和后轮之间有一条皮带的那个貌似电机的东西,确实是我的速度传感器,它的学名叫"旋转编码器".那个器件的特点确实是:
每转一圈,就会从输出端输出一定的脉冲,比如我那个旋转编码器是500线的,确实是转一圈输出500个脉冲.因此,我只要在单位时刻内计数输出端输出的脉冲数,我就能够运算出车辆的速度.明显,那个速度能够用来作为PID速度调剂的反馈.
现在有了反馈,我们需要的是调剂智能车驱动电机的速度了,如何来调速,就成了必须解决的问题了.我用的是驱动芯片MC33886.事实上,那个芯片确实是一个功率放大的模块.
我们明白,单片机输出的PWM信号依旧TTL信号,是不能直截了当用来驱动电机的.非要通过功率模块的放大不可.那个道理事实上专门简单,就像上次我给大伙儿画的哪个电子琴电路的放大电路一样:
看上面的那个三极管,确实是将TTL电路的电流放大,才能够来驱动蜂鸣器.事实上那个地点的那个MC33886确实是如此的一个作用.而且我们自己也完全能够用三极管自己搭建一个如此的功率放大电路,因此,驱动能力确信不如那个地点的那个MC33886(如我们用三极管就搭建了超过MC33886的电路,摩托罗拉就可不能卖几十块钱一个了.呵呵.)明白了那个MC33886的工作原理,就好说了,一句话,通过PWM来调剂电机的速度.当方波中高电平占的比例大,电机的平均电压确信高,转速确信快.也确实是说,PWM的占空比越大,电机转速越高.
看,就这么简单,那个智能车就做好了.接下来,我们就把我们明白的PID知识放到舵机和直流驱动电机的操纵中去.就能够达到一个比较好的操纵成效.
假如要达到更高的水平,确信机械方面的改造也少不了.因此,这不属于本文的讨论范畴.呵呵.
智能车制作全过程(飞思卡尔---舵机篇
发表于2020/11/2810:
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信号占空比的(用来操纵舵机的转角),更是尤为重要.那个滤波的思路确实是规定一个最大值和一个最小值,当运算出的值低于最小值时,令其等于最小值;大于最大值时,令其等于最大值.
智能车制作全过程(飞思卡尔)
发表于2020/11/1522:
28:
01
假如我写得好,请顶我一下,我将再接再厉!
(本人在专门久往常做的一辆用来竞赛的智能车--获得华北一等奖,全国二等奖,有许多可改进地点.)
下面我们来赶忙开始我们的智能车之旅:
第一,一个系统中,传感器至关重要.
"不管你的CPU的速度如何的快,通信机制如何的优越,系统的精度永久无法超越传感器的精度".是的,在那个系统中,传感器的精度,其准确性就显得至关重要.假如你问我传感器的电路,呵呵,我早就和大伙儿分享了,在我发表的日志中,有一篇<<基于反射式距离传感器>>的文章就详细的说明了传感器的硬件电路以及能够采取的信号采样方式.
传感器安装成一排,如上面排列.(确实是个一字排列,没有什么专门)
接下来,看看我们如何处理传感器得到的信息:
大伙儿看到了.结构专门简单,我们差不多搞定了传感器通路.下面我们来看看多机的操纵方面的问题:
事实上,不管是廉价依旧比较贵的舵机,差不多上一样的用法.舵机的特点确实是不同的占空比方波就对应着舵机的不同转角.因此不同的舵机有不同的频率要求.比如我用的那个舵机:
方波频率50HZ.如何改变占空比?
那个不确实是PWM模块的功能嘛.PWM模块能够输出任意占空比的方波.只要你操纵其中的占空比寄存器,就能够直截了当操纵舵机的转角.你只要将传感器的状态和那个占空比对应上,不就OK了?
就这么简单,做到那个地点,你就能够让你的车在跑道上跑了!
接下来,我们的工作是让智能车更加完善:
速度要稳固.
在当前的系统结构中,要使一个系统更稳固更可靠,闭环系统是一个选择.(假如你不明白什么是闭环系统,能够参照我的文章里面的一篇"基于单片机的PID电机调速"),既然是一个闭环系统,速度传感器是必不可少的,用什么样的传感器做为速度反馈呢:
认真看,和后轮之间有一条皮带的那个貌似电机的东西,确实是我的速度传感器,它的学名叫"旋转编码器".那个器件的特点确实是:
每转一圈,就会从输出端输出一定的脉冲,比如我那个旋转编码器是500线的,确实是转一圈输出500个脉冲.因此,我只要在单位时刻内计数输出端输出的脉冲数,我就能够运算出车辆的速度.明显,那个速度能够用来作为PID速度调剂的反馈.
现在有了反馈,我们需要的是调剂智能车驱动电机的速度了,如何来调速,就成了必须解决的问题了.我用的是驱动芯片MC33886.
事实上,那个芯片确实是一个功率放大的模块.我们明白,单片机输出的PWM信号依旧TTL信号,是不能直截了当用来驱动电机的.非要通过功率模块的放大不可.那个道理事实上专门简单,就像上次我给大伙儿画的哪个电子琴电路的放大电路一样:
看上面的那个三极管,确实是将TTL电路的电流放大,才能够来驱动蜂鸣器.事实上那个地点的那个MC33886确实是如此的一个作用.而且我们自己也完全能够用三极管自己搭建一个如此的功率放大电路,因此,驱动能力确信不如那个地点的那个MC33886(如我们用三极管就搭建了超过MC33886的电路,摩托罗拉就可不能卖几十块钱一个了.呵呵.)明白了那个MC33886的工作原理,就好说了,一句话,通过PWM来调剂电机的速度.当方波中高电平占的比例大,电机的平均电压确信高,转速确信快.也确实是说,PWM的占空比越大,电机转速越高.
看,就这么简单,那个智能车就做好了.接下来,我们就把我们明白的PID知识放到舵机和直流驱动电机的操纵中去.就能够达到一个比较好的操纵成效.
假如要达到更高的水平,确信机械方面的改造也少不了.因此,这不属于本文的讨论范畴.呵呵.
基于单片机的电子琴设计
发表于2020/11/1411:
02:
11
假如我写得好,请顶我一下,我将再接再厉
专门多朋友喜爱搞一些声光的东西,因为能看到,能听到,比搞个什么通信滤波要好玩多了.好!
我们就开始做个电子琴.甚至做一个简单的"MP3",呵呵,从简单开始.我们先做电子琴,下一节再做"MP3".
第一,因为是发声装置,我们得先了解发声的原理是什么,这有助于我们接下来的编程:
1.声音是由于物体震动产生的.
2.电流的变化通过线圈就能够使磁场发声变化.
上图是一个喇叭的工作原理.不明白大伙儿看明白了没有.喇叭的电磁铁的电源是接到我们的发声电路上.当电路中的电路发生变化时,电磁铁的吸引力也发生变化.因此就会吸合铁皮.吸合铁皮的时候也带动了薄膜的运动.假如那个吸合过程专门的快.那么薄膜就会发生高频的震动.那个震动就会发出声音.
上面只是一个示意图.实际上的喇叭并不是磁铁吸音铁框的问题,铁框往往也会换成一个磁铁,只是是永磁铁,如此不但能够吸引,还能够排斥.声音幅度更大.
好了,总而言之一句话,确实是来来回回的震动就会产生声音.
接下来,我们开始制作吧:
电路相当的简单:
看到了吧,电路专门的简单.下面是四个键盘的按键开关.上面确实是一个三极管的放大.有人说,我直截了当接到单片机上就不行.完全能够!
我什么缘故说是个电流放大呢,确实是要发生的功率大,声音大.假如你将蜂鸣器直截了当接到单片机的IO口上,因此是能够的.然而只是用来验证用的,声音太小,实际中是没有用处的.
只是,我可得提醒你:
你假如如此接,那就不对了.什么缘故?
问题就在于,单片机的IO口的驱动能力是绝对有限的,你现在让它直截了当驱动一个功率比较大(比较LED而言)蜂鸣器,是比较吃力的.然而你却能够如此设计:
什么?
没有发觉有什么不同?
呵呵,看看,蜂鸣器的电压方向变了.什么缘故如此做,这确实是一个开发体会问题了:
单片机的IO口吸取电流的能力要远远大于其提供电流的能力.因此不管是驱动蜂鸣器依旧驱动LED发光二极管,都要做成低电平有效的这种形式,切实有效!
(本人的实验板,具备上述模块,其原理图和上述完全一致.有实验板的朋友能够接着往下做了)
好了,硬件连接OK了,我们赶忙开始我们的编程吧:
我先说说算法,要实现一定频率的震动,不确实是将IO端口进行一定频率的开和关确实是了.要进行一定频率的开和关,就必须有一个计数.在那个地点,定时计数器就比较合适了.自动重装载模式明显比较合适.我们来看看程序吧(鉴于c语言良好的可阅读性,我们先用c语言来编写):
#include
#defineuintunsignedint
#defineucharunsignedchar
#defineSOUNDERP0_BIT2 //用宏定义端口,直观.如以后更换,方便
#defineS1P2_BIT4
#defineS2P2_BIT5
#defineS3P2_BIT6
#defineS4P2_BIT7
#defineYES0
#defineNO 1
intYIN[7][2]; //定义一个音阶数组,存放计数器的计数初始值.
intDir="3",i;
voidTimerInit() //计数器初始化函数.
{
TMOD="0x21";
TL0=0;
TH0=0;
TH1=0xE8;
TL1=0xE8;
PCON=0x00;
TR0=1;
TR1=1;
SCON=0x50;
}
voidmain()
{
//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实现直流电机调速(智能车)
发表于2020/11/129:
45:
33
现在做专门多的智能车,都需要对车速进行操纵.或匀速或变速,在调速算法中,PID的经典永垂不朽.
事实上,简单的51单片机尚能轻易的实现平滑良好的调速,更不用说性能优良的单片机.然而,要做到最好,是需要专门高的专业水平和动手能力.然而,工程上能达到我们的目标即可.
抱着"够用就好"的思想,我们来开始我们的调速旅程:
所谓的PID是确信基于一个闭环系统而言的,什么是闭环系统呢,我简单的介绍一下:
看上面的那个系统,就不是一个闭环系统,而是一个开环系统.再看下面的那个确实是闭环系统:
上图那个系统确实是典型的闭环系统.大伙儿也许看出来了,"开环"系统,确实是系统没有反馈,是个"打开的环",而闭环系统,是有反馈的,是一个完整的环形.
正是那个反馈,就能够将当前电机的转速传递给系统操纵端,假如电机转速快了,操纵器就让它慢点(比如能够降低电机两端的电压),同样,假如速度传感器检测到转速低了,就应该让电机两端的电压提高一点.确实是在如此的不断矫正中,电机的速度会保持恒定.因此,那个矫正的周期是专门短的,矫正的速度是专门快的.
有人说,不确实是多了就少点,少了就多点嘛,干嘛使用什么玄乎的PID?
对,你说对了,"多了就少点,少了就多点"这本身确实是PID里面的一种:
P操纵--只使用了P算法.
接下来我们就看看到底什么是PID,什么缘故要使用PID,如何样使用PID:
P--比例
I--积分
D--微分
我们来一条一条的讲解P,I,D的含义及其意义:
P--比例部分
那个专门好明白得.比如说,速度传感器发觉,当前速度是1200(每分钟).而我们设定的速度值为1000,那么就差别了200,这时,假如我设定P为0.1,假如输入的电压就应该是Uo-0.1x200.看到了没有,那个地点的比例的意思确实是"倍数",确实是你要把那个偏差放大多少倍."放大"本身确实是一个比例嘛.明白了那个,你就能够写一个PID操纵里面的P操纵了.专门多时候,不需要I和D操纵,单单一个P操纵就足够了.到了那个地点你就能够操纵电机的速度了.
I--积分部分.
那个积分事实上也专门好明白得 .它是一个积分运算.有的时候偏差不是专门大,因此连续运行下去,会使系统存在一个偏差.然而你假如使用I运算将那个偏差累加起来,到了一定大小的时候就进行处理.如此就能防止 系统的误差累计.事实上,在程序中,那个过程确实是对一个小偏差的连续累加罢了.
D--微分部分.
那个部分也比较好明白得.所谓的微分确实是对变量求导呗,意思确实是一个量的变化率呗.因此,微分部分确实是能够将变量变化率放入运算中.那个量在边城中事实上确实是求上次的偏差和这次的偏差的差罢了.
事实上,在温度操纵中PID依旧比较有效的,然而在于电机操纵这种速度经常变化的场合,一个参数整定好的P操纵就能完成任务.为了便于大伙儿的明白得,我给大伙儿举一个例子吧:
关于对51单片机端口上拉电阻的讨论
发表于2020/11/1122:
28:
33
前一段时刻,看到实验室有个学弟设计了一个电路,其中还有一个键盘电路,取其原理是如此子的:
据这位师弟的意思