初识MCU
微控制单元(Microcontroller Unit;MCU) ,又称单片微型计算机(Single Chip Microcomputer )或者单片机,是把中央处理器(Central Process Unit;CPU)的频率与规格做适当缩减,并将内存(memory)、计数器(Timer)、USB、A/D转换、UART、PLC、DMA等周边接口,甚至LCD驱动电路都整合在单一芯片上,形成芯片级的计算机,为不同的应用场合做不同组合控制。诸如手机、PC外围、遥控器,至汽车电子、工业上的步进马达、机器手臂的控制等,都可见到MCU的身影。(源自:百度百科)
打开这篇markdown 的小伙伴你好啊,我是集,一个16届智能车的参赛选手。你会看到我,说明你也有参加智能车比赛的想法吧,那如果你和我一样在起步阶段是个小白,就随着我一起认识做智能车吧。
什么是MCU(Microcontroller Unit)
我们在比赛中会使用到MCU来让小车完成各种功能。所以在小车跑起来之前,我们先来认识下什么是MCU
正如开头引用所介绍的,MCU的全称是Micro(微)controller(控制器) Unit(单元),好长一串英文,翻译成中文也让人懵懵的,这个MCU到底是个啥?别着急,我这就来为你介绍。
众所周知,我们人有大脑和小脑。大脑擅长思考复杂的事情,比如计算数学题、分析眼前景象这类困难的任务,虽然需要花上一定时间分析,但大脑都能处理得来。而小脑则和大脑不同,小脑擅长的是控制肌肉伸张、收缩,它是运动的调节中枢,我们维持身体平衡、抬手屈膝都依靠它,而它讲究的是实时性,即收到信号后能快速做出反馈。
我们手头的电脑就和大脑比较相似,它可以用来处理数据、实现各种复杂功能。而微控制器(MCU)则和小脑比较相似,小脑可以控制肌肉伸张、收缩,MCU可以控制电机正反转动。
显然,单纯为了让电机转起来不值得我们单独设计一块芯片。以直流电机为例,我们把电机接到电池正负极上,电机就会随着电流流通转动起来了,而正反转通过反转电池就能实现,为什么还要用一个芯片来控制电机呢?显然(X2),这里我们忽略了一个细节:电机接到电池上虽然能转,但电机的转速是我们控制不了的。在实际应用中,很多控制系统要求电机工作在给定转速下,显然电机简单地接上电池达不到我们的应用要求,所以我们引入MCU来帮我们实现控制转速的功能。
现在我们知道了MCU可以控制电机转速,那它是怎么实现这个功能的呢?这个问题涉及的内容繁多,不适合放在开头讲解,之后的篇章我会为你慢慢道来。现在我们只需要知道,MCU整合了一个“不是很聪明的大脑”来理解和完成我们给定的指令,让我们能够通过编程来告诉MCU它应该做哪些事情。
MCU有哪些功能
具备编程功能的MCU非常强大,除了上文提到的电机控制功能,聪明的工程师们还把其他很多实用的功能整合到了MCU上,接下来让我们逐个来认识下这些功能吧。
通用IO(GPIO)
IO口控制是MCU很基础的一个功能,我们能够通过编程让MCU实现IO引脚的高低电平切换。IO口最经典的功能应用是点亮LED小灯,我们把一个LED小灯接在MCU的IO引脚和地之间,将引脚拉至高电平输出,LED小灯就会随着电流流通而被点亮!
如果你对高低电平没什么概念,不用担心,你随时可以打开搜索引擎查询自己不熟悉的概念,在这里我用我浅显的理解来给你讲解一下高低电平的概念。在电路设计中,我们希望通过电压值来表示0和1这两种状态,而根据我们使用电压表的经验,想要测量电压值,就需要引入电势参考点,这里我们一般把地作为零电势参考点。显然,为了区分0和1,我们需要电压值能够有数值上的区分,比如3.3V表示1,0V表示0。而在实际应用中我们很难保证测量的电压值准确恒定在3.3V和0V上(可能会出现上下浮动,比如由3.3V变为3.1V),所以我们选择放宽条件,让处于一定范围内的电压值表示不同的状态,比如高于2.7V、低于3.6V的电压表示1,低于0.6V、高于0V的电压表示0,而这里的0和1两种状态,就是我们之前提到的低电平和高电平。在实际应用中区分高低电平的电压范围根据电平协议的不同会有所变化,你可以通过查阅资料来获取准确的区分范围。
模数转换、数模转换(ADC、DAC)
模数、数模转换是MCU中十分神奇的一个功能,它能够实现模拟量(如电压、电流)到数字量(0101)和数字量到模拟量的转换。当我们希望测量电池电压、流过负载的电流时,就可以用上模数转换(ADC),把电压和电流的大小(模拟量)转换成MCU能够理解的数字量(二进制数)。
定时器、计数器
定时器、计数器是MCU中非常重要的功能,我们在应用PID控制电机转速时会用上他们。定时器、计数器衍生的子功能非常多,现在我们只需要按字面意思去理解他们,即时间到了会响的定时器,和按下之后会累加值的计数器。
通信功能(UART、I2C、SPI、CAN)
当我们希望实现MCU与其他设备通信的时候(如显示屏、摄像头、陀螺仪加速度计等),就可以用上MCU的各种通信接口。数据通信涉及到的内容较为复杂,我们在以后的篇章会讲解它们的使用。
怎么学习MCU
看到这里的你可能还是一脸懵逼,知道了MCU是什么、有哪些功能,但这些东西又和我们做智能车有什么关系?以及我们如何学习MCU呢?
别着急,做智能车的路程才刚刚开始,现在对一切感到陌生是很正常的。首先我们先明确一下我们做智能车的目标:让一辆小车能够沿着赛道奔跑,为了实现这个目标,我们需要让小车具备前进、转向等基本功能,而这些功能的实现又依赖于电机、舵机等执行单元。我们学习使用MCU,就是为了通过编程让这些执行单元按照我们的想法去工作,让小车在需要前进的时候前进,在需要转向的时候转向。
至于怎么学习MCU,方法有很多种,这里说一下我推荐的方法:当你需要实现某个功能的时候,就努力想办法实现。去查阅这个功能相关的资料,了解实现这个功能需要使用到哪些模块,再自己动手实践,让实现功能的想法照进现实。举个简单的例子:我们想要实现一个可以随时点亮、熄灭的LED小灯,我们知道LED小灯在有电流流通的时候会被点亮,而电流流通的条件是LED小灯两端有压差。我们想到MCU的IO口可以设置成高低电平两种状态,如果把LED的一端接到IO引脚上,另一端接地,就可以通过引脚的高电平实现压差,让电流流通LED,实现点亮小灯的功能。而IO引脚变成低电平时,压差消失,电流不流通LED,小灯就熄灭了。有了方法之后,我们就通过编程去实践这个方法,直到LED真正可以被点亮和熄灭。在学习过程中你可能会遇到不可逾越的障碍,这时候不妨问问周围人的想法,很有可能解决问题的灵感会在与他人的交流中迸发!
写在最后
入门智能车 - 初识MCU篇差不多就到这里啦,在文章的最后我有一些话想对你们说。
现在的你们可能不知道做智能车这段经历可以给自己带来什么,从我的角度看,我做智能车这一年收获的是认识自我、看淡成败。在做智能车的途中,我总幻想着能拿国奖、 能拿学分,直到最后拿了华南三我才醒悟过来,虽然只是投入很多自己的时间做比赛,但是目无旁人、极端自负的做法和性格却伤害了身边的人。所以在比赛结束后,我总是在想自己有哪些事情做错了、有没有什么可以做得更好的方法。我也想明白了,做比赛开心和成长最重要,我从比赛中获得了乐趣,这个乐趣支撑我不断探索实现新的技术。我就想让小车跑得更快、识别得更准,天天找改进小车的办法。最后比不过别人也没事,因为我投入了对得起这份成绩的时间,自己也获得成长,别人也不能因为我没拿很高的成绩来责备我什么的。
在这里给你们一些小建议。在正式确定队伍成员之前,你们可以先安排两三周的磨合期,要是彼此觉得不适合组成团队,那大家好聚好散,各自再看看有没有更合适的团队可以加入。在团队组成的初期,大家可以先讨论下共同愿景,然后合理安排分工、设定每项目标完成的截止时间,确保团队能按安排好的时间跟进比赛进度。关于团队合作是我一直做得不好的部分,希望你们能处理好成员之间的关系。
智能车比赛经过十几年发展,逐渐变得适合零基础的小白参与进这个比赛。各种比赛中常用的功能得到了模块化,使得我们能更轻松地开发、实现各种功能。所以你们不用担心自己没有基础,做不来这个比赛,放心大胆的钻研各种技术,你们一定会有所收获的。
最后的最后,你们一定不要穿鞋踩进赛道啊啊啊啊(血压飙升)!赛道要勤擦洗,不然等车子跑起来轮子打滑够你们受的!
|