智能车制作全过程(飞思卡尔)43.docx
智能车制作全过程(飞思卡尔)如果我写得好,请顶我一下,我将再接再厉!(本人在很久以前做的一辆用来比赛的智能车-获得华北一等奖,全国二等奖,有许多可改进地方.)下面我们来立即开始我们的智能车之旅: 首先,一个系统中,传感器至关重要. "不管你的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 1int YIN72; /定义一个音阶数组,存放计数器的计数初始值.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 YIN00= (65536-10000/261/2*100)%256; YIN01= (65536-10000/261/2*100)/256; / 294 2 YIN10= (65536-10000/294/2*100)%256; YIN11= (65536-10000/294/2*100)/256; / 330 3 YIN20= (65536-10000/330/2*100)%256; YIN21= (65536-10000/330/2*100)/256; / 349 4 YIN30= (65536-10000/349/2*100)%256; YIN31= (65536-10000/349/2*100)/256; / 392 5 YIN40= (65536-10000/392/2*100)%256; YIN41= (65536-10000/392/2*100)/256; / 440 6 YIN50= (65536-10000/440/2*100)%256; YIN51= (65536-10000/440/2*100)/256; / 494 7 YIN60= (65536-10000/492/2*100)%256; YIN61= (65536-10000/492/2*100)/256; EA="1" /开CPU中断 ET0=1; /开定时计数器中断 TimerInit(); /调用初始化计数器函数 for(;)/void TimerOverFlow () interrupt 1 /定时器中段函数 if(S1= =YES) SOUNDER=!SOUNDER; TL0=YIN00; TH0=YIN01; if(S2= = YES) SOUNDER=!SOUNDER; TL0=YIN10; TH0=YIN11; if(S3= =YES) SOUNDER=!SOUNDER; TL0=YIN20; TH0=YIN21; if(S4= =YES) SOUNDER=!SOUNDER; TL0=YIN30; TH0=YIN31; / Clear the flag TF0=0; 相信大家看得明白程序,很简单.下载到单片机上以后,按S1键,蜂鸣器发出低音1(叨)的声音.按S2发2(ruan)的声音.基于单片机的数字PID实现直流电机调速(智能车) 发表于 2008/11/12 9: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单片机端口上拉电阻的讨论 发表于 2008/11/11 22:28:33 前一段时间,看到实验室有个学弟设计了一个电路,其中还有一个键盘电路,取其原理是这样子的: 据这位师弟的意思是:在没有按下按键的时候,端口上是低电平,按下按键的时候端口上接上了高电平. 事实上,电路是不工作的. 问题比较多: 首先,将电源直接接到端口上是绝对不可以的.当按下按键的时候,会有很大的电流进入单片机.在工程上,这种往往应该加限流电阻的.一般选择1K的就可以.如果选择太大的电阻也不好,因为电阻上面压降太大,造成输入比应有的高电平低,造成错误. 其次,就算加了限流,这个电路也是不能工作的.检查AT89C51的DataSheet就会发现.技术手册中说:P0口是没有上拉电阻的端口;P1,P2,P3口带有上拉电阻.问题就出在这里,什么是上拉电阻,来看看图:上面这个图,是红外线接收的电路图,看上面的这个电阻,就是上拉电阻.我们可以试图理解一下51单片机P2口的这个上拉电阻为这种形式:其中的R就是上拉电阻.如果像我的那个师弟那样设计电路,电路就成了以下这种形式了:看,从这个电路上,我们可以清晰的看出,不管你按键是否按下,IO端口上都是高电平.问题就在这里,我让我的这个师弟测测IO端口的电平在按下按键前后的变化,结果果然不出所料:不管他是否按下按键,都是高电平! 从这里我们可以看出:DataSheet还是有用的,在设计的时候,有很多细节,需要注意,否则,可能功亏一篑.基于或门的超级简单的液位传感器 发表于 2008/11/11 16:29:04 前一阵子,在实验室,看到一个朋友在那里拿着一个盒子钻,敲,打.满头大汗,嘴里还嘀咕着. "你在做什么呢?" "我在做一个液位传感器,这个杠杆浮漂真不好弄!" "你最近不是做液位控制,你如果用机械杠杆,你怎么采集数字信号到单片机?" "我会在杠杆上安装一个角度传感器.". 看来真是个麻烦的事情. 回头突然想起,我小学的时候,给我妈妈做了一个检测下雨的东西.好像是五年级的时候,就是那种平板,下上雨了以后,就会触发相关的电路(当年我是接上了一张生日贺卡里面的音乐芯片). 要说,当初,我还记得,书上好像是叫那种电路为"或门",当初我怎么都不理解,但是现在看来,原理是多么的简单. 看看电路:当年的电路是这样子的,就是在板子上有水,就会接通两端的电路.很好理解,只有有一处接通,整个电路就是通的,是一个逻辑上"或"的关系,所以叫或门.当然除了或门,肯定还有"与门". 既然能够检测到雨水,那怎么就不能检测液位呢(这里的液体也是水.),当然我们需要的是要将电路进行些许的改装.我就为我这个朋友设计了一个:你看,我分开处理,大不了我挨着扫描一次看看1到11的引脚,哪里检测到了水位(检测到电压),我不就可以方便的检测到液位了.你可能要说:这个占用IO口也太多了吧.不要紧!来,实用一个138译码器不就可以了,有选择的读取其中的某个引脚. 就这么小的一个小东西,做出来,拿到现场一试-"屡试不爽",试验多次,没有出现过一次误报,简单但是好用. 由这个问题我们看出来了:小学教育是多么的重要啊.基于反射式红外线的测距传感器 发表于 2008/11/9 23:14:13 如果我写得好,请顶我一下,我将再接再厉! 前阵子做个小车玩,是走迷宫的那种.苦于没有所谓的距离传感器,就自己做个吧.结果也犯了不少错误.现和大家分享. 买了几个两毛钱一个的发射管(注意,不是发光二极管,虽然长得一样,但是这个是发射红外线,你可能肉眼看不出它再发光,但是你若是用手机或数码相机的摄像头看,你就会看到它的光). (发射管) (接收管) 看来比较简单,一个发射,一个接受.发射管发射红外线,遇到遮挡就会反射回来(遮挡是黑色的除外,因为黑色吸收了红外线),接收管接收到红外线以后阻值发生了变化,因此可以利用电阻分压改变输出电压.看看电路:发射电路,一开始我就是这样,一个限流电阻直接发射管(红外线发光管).后来发现一个随之而来的问题,就是多个传感器工作时电流比较的大,达到0.5A左右.而且传感器发热严重.要知道,发热严重,性能就会严重的降低.于是想到,是不是可以在需要的时候开通,不需要的时候关闭.形成这种扫描式的.结果衍生出了以下的电路:这个电路的原理也是一目了然的:当单片机的IO口输出高电平时,R1所在的支路有电流I1,因此R2所在的支路就有I1*E(E为三极管的放大倍数,比如我用的是30).这样,三极管就相当于一个电子开关.单片机输出1的时候,发光管接通,单片机输出0的时候,发光管截止.这样就起到了用单片机来控制发光管关闭的效果. 经过实验,发现该电路效果非常的明显.在大多数情况下,电流表几乎检测不到电流的所在.用精密的电流表,发现电流在5MA左右.而且整个电路的检测距离更远,更准确.具体分析其原因是:长时间处于发光状态,发热严重,发光管效率降低,电阻增大,发射功率降低.而间歇发射,发光管发光效率更高,更省电. 至于接受电路,我使用的就比较的简单. 其中,Sout为信号的输出.其实这个电路就太简单了,你看.红外线使着接收管的电阻发生了很大的变化,所以两个电阻的比值就发生了变化,根据分压原理,输出的电压值也就改变了. 接下来的问题就是对现在的这个高电压和低电压进行处理.有人说,直接接到单片机上进行编程不就可以了?不是的!注意,这里的输出电压虽然也有高和低,但是这里的电压是个"模拟量",不是标准的TTL电平.举个例子,我测得有反射(前方有障碍物)的时候,电压是4V,没有发射(前方没有障碍物)的时候,电压是2.1V.显然,你如果直接接到单片机上,单片机收到的都是高电平. 处理的办法有两个:使用AD转换或是使用电压比较器. 这两个方法各有各自的优缺点,我们来分析一下: 一.AD转换 大家都知道,就是将输出的电压值,用AD芯片进行数字化,比如5V转换成了1200.等等.这样做的好处是显而易见的,我们能够方便的对数据进行处理.比如,我们令数值小于300的表示没有检测到障碍物或是障碍物比较的远.数值大于300的表示检测到障碍物.而且硬件上也比较的简单,直接将输出接到AD的输入引脚即可(现在的许多MCU内部都自带ADC,所以根本就不需要外围电路,直接接上即可).这样做的不足也有,就是你需要编写AD检测的程序,而且占用CPU时间. 二.比较器 所谓的比较器,就是电压比较器,看电路: 看,就是这么个简单的电路,当Ui>U时,Uo一直是低电平;当Ui<U时,Uo就是高电平.因此,我们只要调节一下参考电压,就可以使着输出符合我们的要求-低于这个阀值的时候是高电平,高于这个阀值的时候是低电平.这就实现了模拟量转换为数字量.看看电路图: 这个电路就很简单了,可以看出多了下面的那块电路,是用来调节基准电压的嘛.也是一个电阻分压的原理,这样你设置不同的阀值,就可以控制输出了.比如:我们刚才说的低电压是2.1V,高电压是4V,我们要把这个电平转变成TTL,因此我们可以把基准电压设置成3V,因此经过电压比较器,2.1V就输出高-5V,4V就输出低-<1V.这不就是TTL嘛. 电路中的比较器可以使用便宜的LM324来搭建.LM324是四运放集成块.PID系统整定工程实践 发表于 2009/6/28 9:01:53 【如果我写的好,请顶一下】 参加比赛或是做项目也好,PID的应用非常的广,不但可以用在运动控制的电机调速,更可以用在温度控制、电流控制、电压控制等等动态变量的控制。 PID其实没有多么神秘,还是那句话:被控量比我们的预期量(输入量)大,CPU就控制其小点;被控量比我们的预期量小,CPU就控制其大些。在这其中在引入被控量信号的变化率和误差累积,就成了真正的PID,可以达到非常好的控制效果。 直流伺服系统的系统结构 图1.1 一个伺服系统结构的例子 由图1.1可以看出来,一个基本的伺服系统由控制器、功率放大单元、执行机构、反馈传感器组成。控制器是按照一定的控制策略,综合输入量和反馈量,输出控制信号的逻辑装置,一般情况下使用工业计算机或是微型计算机系统(DSP、MCU等)来作为伺服系统的逻辑中枢;功率放大单元是将计算机输出的控制信号,转变成一定的功率信号来驱动执行机构;执行机构(图1.1中是电动机)是将控制器的控制信号转变为相应的物理量,可以是电动机(用于运动控制)、加热器(用于温度控制)、功率开关管(用于电流或电压控制)等等;反馈传感器(图1.1中是位置检测传感器)是将执行机构的状态转变为相应的电气信号,并反馈给控制器的装置,它可以是位置传感器(位置伺服系统)、速度传感器(速度伺服系统)、温度传感器(温度伺服系统)、电流传感器(电流伺服系统)、电压传感器(电压伺服系统)等等。直流伺服系统的工作原理简述 由伺服系统的原理框图1.1就可以看出,伺服系统通常是一个闭环系统。其工作流程可以简单的描述为:控制器接收外界的输入,计算相应的输出值给功率放大单元,功率放大单元将控制器的信号放大,驱动执行机构动作。反馈传感器采集执行机构或被控对象的状态,将状态信息反馈给控制器,控制器根据接收到的输入值和传感器反馈回来的反馈值,根据一定得控制策略(本论文中使用的是PID算法),进一步调整输出,使输出达到目标值(输入值)。 其中,控制器-CPU/MCU 功率放大-MOSFET/MCS33886/各种电机驱动芯片 反馈传感器-角度传感器(位置伺服系统)/旋转编码器(速度伺服系统)/温度传感器(温度伺服系统)/电流传感器(电流伺服系统) 为了便于讨论,我编写了一个上位机软件,实时对伺服系统的工作状态进行采集,而且还可以绘制出伺服系统的工作曲线。 第3章 直流伺服系统参数及其整定3.1 数字PID的参数根据偏差的比例(P)、积分(I)、微分(D)进行控制(简称PID控制),是控制系统中应用最为广泛的一种控制规律。实际运行的经验和理论分析都表明,这种控制规律对许多工业过程进行控制时,都能得到满意的效果。不过,用计算机实现PID控制,不是简单的将模拟PID控制数字化,而是进一步与计算机的逻辑判断功能结合,使PID控制更加灵活,更能满足生产过程提出的要求。 3.1.1 采样频率的选择(1)采样周期应远小于过程的扰动信号的周期。根据香农采样定理:采样频率应该大于或是等于信号最高频率成分的两倍。这个定理给出了采样频率选择的最底线。(2)执行机构的类型。在执行器的响应速度比较慢时,过小的采样周期将失去意义,因此可适当选大一点。 在计算机运算速度允许的条件下,采样周期短,则控制品质好。当过程的纯滞后时间较长时,一般选取采样周期为纯滞后时间的1/41/8。 (3)给定值的变化频率。加到被控对象上的给定值变化频率越高,采样频率也应该越高,这样给定值的改变可以迅速得到反应。(4)被控对象的特性若被控对象是慢速的热工业或是化工对象时,采样周期一般取的比较的大;若被控对象是较快速的系统,采样周期应取得比较小。(5)控制算法的类型采用PID控制算法,积分(I)和微分(D)作用都与采