单片机入门为什么这么“难”?该如何学?

这里大家可能会有疑问,不是几天到一个月可以入门单片机么?怎么会“难”呢?

1、很多学单片机的小伙伴应该经常会碰到这种困惑,学完10天入门或零死角之后,发现面对新的项目,还是不知道该从哪方面下着手。

2、当碰到具项目出现问题时,不知道是软件方面的问题,还是硬件方面的问题,花了很长时间没有解决思路。

这里所说的“难”并不是说技术知识本身的难度,而是我们对未知领域整体认识不清晰产生的迷茫,不知道接下来的知识该怎么继续学。以前我们在语文课上,老师经常教导我们要抓住文章的核心思想,顺着文章的脉络去阅读,我们学习单片机嵌入式也是一样,也需要抓住单片机学习的整个脉络去学,脉络清晰了,学到多少东西那只是时间和自身投入问题了。

单片机项目都是软硬件结合的,所以当面对具体问题时,如果没有整体的综合知识加上经验,我们很难分析出这个问题到底是出自软件?还是硬件?而这种综合性知识需要我们按照一定的科学方法不断地动手,遇到问题-解决问题的过程逐步积累起来的。

新手在碰到这类问题是往往感觉非常头大,我见过花一个星期时间解决串口电平不匹配问题的,也有花半个月解决CAN总线负载电阻问题的,这种事情换做其他人也早就崩溃了

那么有没有学习“秘籍”呢?其实关于单片机学习还是有一些科学的方式,只要大家照着做了,基本上入门不是什么大问题。

单片机技术是一门综合型课程,同时对学习者要求动手能力比较强,对于想长期从事嵌入式行业的同学,需要掌握基本的模拟电路知识、数字电路知识、C语言知识、单片机原理、现代控制理论;进一步的还有基础电路板设计、机械设计基础等知识。

这里每一项知识都是一个很大的话题,比如说模电,很多大师一生投身其中,也没完全研究明白,乐此不疲。但是对于很多单片机发烧友来说,只需要掌握基本功能的使用就行了,至于理论支撑和原理性的知识,平时闲下来有空的时候去看看书和博文补充补充,就拿三极管来说吧,不要过多的去关心什么放大特性,只要会使用它的开关功能就行了,参照现有电路,知道哪个引脚连哪个引脚,早期学习并不需要钻的那么深,要学会及时止步;我们可以有打破砂锅问到底的精神,但是在单片机每个学习阶段有些问题就别太较真了要把握每个阶段的核心学习脉络。我曾经碰到一个想学单片机的哥们,一开始本来学的好好的,拿着开发板在一个一个例子的跑,适当的修改;但是有一天不知道怎么了,他非要把C语言里面的每一个东西研究透,再后来研究来研究去越搞越糊涂,慢慢的就丧失了学习的动力了。说起来有些东西很多大佬也不一定能解释清楚,还有些东西就是那样规定的,你说这怎么解释 。

注意

1、刚开始学习单片机,切记急于求成,弄不好反而会丧失学习的兴趣和动力。这个也适用于所有技术学习,要沉得下心,耐得住寂寞,面对枯燥的技术知识要有持久的学习动力。

2、学习单片机是需要一定的投入的,这方面很多人估计不能理解,特别是在校的很多学生,可能你愿意花几百上千吃顿饭,买一套衣服,但是每年能投入上千买东西学习单片机的寥寥无几,但是如果把它当做一种投资你就明白了。对于我个人来说,我每年放在学习技术知识方面的费用都不少于上万,当然其中有些是借助于公司这个平台学习花费的。像大家知道的稚晖君大佬,他平均每做一个项目光硬件成本都是几千上万(PCB打样,3D打印,机械加工,元器件购买)。

“三步走”模式

 

“控制变量法”

这里引入实验中常用的一种“控制变量法”来学习。(摘自百度百科)物理学中对于多因素(多变量)的问题,常常采用控制因素(变量)的方法,把多因素的问题变成多个单因素的问题。每一次只改变其中的某一个因素,而控制其余几个因素不变,从而研究被改变的这个因素对事物的影响,分别加以研究,最后再综合解决,这种方法叫控制变量法。它是科学探究中的重要思想方法,广泛地运用在各种科学探索和科学实验研究之中。

在单片机学习中为什么建议采用这种方法呢?这些年与许多电子类专业和非电子类专业的学生和工程师交流,发现大部分单片机初学者从入门到放弃最主要的原因是当出现问题时,大家不知道这个“变量”到底是来自软件,还是硬件;没掌握正确的方法找到问题,很容易在这个问题上消耗大量的时间,久而久之,我们的自信心和兴趣会慢慢磨蚀。所以为了排除这些因素,我们要将这些“变化的量”控制在我们所能掌控的范围内,而不是“满山抓鸟”式的做法。

第一阶段:控制硬件“变量”学软件

这里所说的控制硬件”变量”,一般建议直接购买成熟开发板或最小系统板+模块的形式,上面集成了我们单片机常用的模块和外设。这样相对来说硬件是可靠、可控的,所以无论我们怎么修改代码,都只是软件上的改动,不至于出现硬件这个”变量“变动打乱我们的学习计划。

小技巧:可以考虑把arduino开发板作为桌面上的一块常用板,它相对于普通单片机开发方式更容易入门,可能有些人会很抵触arduino,觉得这玩意学起来没什么技术含量。但是对于初学者来说这确实是一个有效的帮手,特别是C语言初期学习阶段。

这个阶段的主要目标:

1、学习单片机外设(I/O,I2C,SPI,USART,定时器,中断)的使用,在现有例子上修改验证自己的理解正确与否。

2、学会C语言的基础知识,常见C语言错误排除方法。

3、学会从零开始建立一个单片机的工程,写好代码,通过下载器烧录到单片机里面运行正常。

我们可以从最开始的对着代码一个一个抄,到接下来减少对原代码的依赖,再到后面,完全不看例程的代码,自己从零开始建立一个工程、写代码、设置工程属性、编译、排除错误、下载正常运行;这个步骤看似简单枯燥,但是非常重要,也常常容易被初学者所忽略。通过上面反复的练习,完成这一阶段的目标,这一阶段绝大部分人都能做的到,投入也不大,一般可以控制在500以内,不包括电脑的投入。

第二阶段:控制软件“变量”学硬件

有了第一阶段的学习,我们对单片机和C语言有一点了解,然后开发板自带的这些外设已经不够玩,也提不起我们的兴趣。我们接下来进入到第二阶段的学习,这个阶段我们主要以单片机最小系统为核心,通过举一反三的方式驱动新的模块或IC来进一步巩固我们对I/O端口、总线通信核心思想的理解。

学习目标:

1、I/O端口、总线的活学活用,拿到一个新模块或IC,参考卖家提供的例子,然后动手移植到自己所用的单片机上能运行起来。

2、对单片机外设和模块有一个全新的认识,区分常见模块或IC接口的异同点。

3、常用仪器、仪表的使用; 当有问题出现时借助仪器、仪表快速定位问题。

4、掌握这些外挂模块的电路搭建和初步功能使用方法。

5、使用单片机结合这些外部模块制作一个简单的作品,比如说加速度模块,制作一个空中鼠标。

这里举一个例子来说明怎么深入第一阶段所学,比如说一个普通的I/O端口,结合具体示例我们可以学到上拉,推挽,高阻态模式;这些模式是怎么设置的,以及在哪些情况下需要做对应设置,我们可以通过结合具体的电路来验证,比如说作为按键使用时需要上拉,作为驱动LED时使用推完方式,如果外挂有上拉电阻我们内部可以设置成高阻态也不影响等等。

这个阶段也因为经常需要搭建电路,所以仪器设备的使用那是避免不了的,这些基本的仪器设备我们必须学会使用,比如说我们的电路不工作,第一反应都是去查电压,特别是最小系统芯片引脚的电压,然后再不工作就是去查关键信号是否满足,复位电路正常与否,这些条件都满足之后我们再用示波器去看下晶振出来的信号是否正常,特别是I2C总线因为有主从模式,有应答,很多时候我们比较来比较去发现不了程序的问题,但是通过逻辑分析仪捕捉它在arduino下正常工作的信号,可能就是差那么一个应答不对。所以熟练掌握这些仪器的使用对后面有效的故障定位是非常有帮助。

小技巧:新模块的使用大家可以先试用arduino开发板先验证,这样大家可以快速确认这个模块工作是否正常,另外像这种模块很多都不是严格测试包装的,所以你买回来的模块如果有调试不通时,很大可能是模块本身有问题,这个要格外引起注意。

这阶段我们通过扩展学习更多模块和IC的使用,可以掌握很多电路软硬件的调试技巧,怎么借助仪器、仪表来排查问题;另外不同的模块单片机内部的接口设置会略有差异,这样相当于深入学习了单片机的外设知识;然后在这些模块的过程中,C语言的用法也相对比较灵活,不再是简单的if…else状态,一定程度上C语言知识也得到了锻炼。由于这个阶段模块需要外购,额外的费用支出那是必不可少的,仪器的话大家没有条件可以借助于实验室,勤奋一点,跟老师搞好关系,如果实在没有,那几十块的一个万用表还是要备一个,而不同模块可以考虑多人一起使用,共同分担。这一阶段我们也可以做出一些简单功能的项目,获得一些成就感,为接下来继续学习单片机提供动力。

第三阶段:综合练习,灵活控制软硬件变量

如果说第一二阶段是基础,那么第三阶段则是真刀真枪的直接上,这个阶段更多的是以项目为导向,一二阶段的知识在这里很多时候需要升华下才能更好的使用。

这个阶段也是大部分初学者很难跨越的阶段,因为需要大量的项目练手和经验总结。同时也需要很多费用支出,这是单片机项目与纯软件项目最大的一个区别,我们要想做一个能用的硬件项目,都必须买实物制作,这些都是看的见的真金白银;而软件相对来说好很多,大部分时候一台电脑就可以搞定。就像狙击手是子弹”喂“出来的一样,优秀单片机工程师则是项目”喂“出来的。

像我从毕业到现在,总共做过的项目不下于上百个,自己动手焊接的项目电路板上千块,碰到的问题自然也是非常多,期间也有很多棘手的问题让你彻夜难眠。

这阶段我们的很多思考方式都要站在项目的角度来考虑,使用什么样的一个软件框架,需要什么样的算法处理的,而这些软件框架、算法则需要很多枯燥的理论知识做支撑,所以这个阶段我们需要结合具体应用在C语言使用方法上进一步深入研究,实时系统、数据结构、编程模式、模块化编程、常用的算法等都可以去学了。我们可以不使用某种实时系统或数据结构,但是我们一定要具备这种思维,技多不压身。

该阶段的主要目标:

1、找到一套适合自己或团队的可以长期使用的软件框架

2、弄清楚软件和算法的关系

3、根据自己的性格和擅长,明确接下来的主攻方向

4、不断提升自己对项目的理解和关键问题获取能力

项目分析与拆解:项目分析与拆解是每个项目动手之前必不可少的;我们以前做项目可能就是一上来就是一顿干,干完之后发现路线错误,搞不好又要从头再来干一遍,这样费时费力费财。一个项目再大,它也是由各种模块组合在一起的,如果把这些拆解的模块一一给大家看,估计都知道是怎么回事,但是放到一个完整的项目里面很多人就搞不懂。当然,项目分析与拆解能力非一日之工,也是建立在大量的项目基础上,需要我们不断练习,验证才能准确把控。

可以从一些方便实施的项目着手比如说多功能电子钟,我们根据要实现的功能先把它拆解成硬件和软件两大部分,然后再进一步分析下硬件部分的电路由那些模块组成(核心单片机、供电模块、数码管显示模块、LED指示模块、时钟模块、按键模块),软件部分包括哪些东西(比如说使用时间片轮询框架,然后有时钟驱动模块,按键驱动模块,数码管显示模块等),不断地通过这种可操作的项目验证自己分析拆解思路方法的正确性。掌握方法后再进一步加大难度,从避障小车,无人机等项目着手去实践。

总结:

1、软件框架+算法才是我们学习单片机软件的核心。

2、技术路上很枯燥,我们可以通过奇思妙想做一些有趣的东西,增添一点趣味性。

3、积极拥抱新技术,很可能5年后,我们开发单片机程序就像现在开发安卓App一样,而我们掌握的开发方式却一直没变。

4、要多参考别人优秀的框架和代码,站在巨人的肩膀上学习。

发表评论