电子入坑百科全书

本文目录

电子入坑百科全书(其实不全)

前言

2019年俺写过 一篇文,讲了些电子入门的基础知识,但现在看来,那篇文章还是没有形成一个完整的体系,观感还是七零八碎的,遂重新写一篇。——当然不是全部推倒重来,肯定是有借鉴前文的~ 虽说如此,也算有非常多的新内容。

由于硬件相关知识不仅内容繁杂,且涉及到方方面面的技术,所以本文的篇幅很长,由于我是一个人写作,所以更新可能没那么及时,还烦请多多催更(bushi

如果你看到的是pdf版本…

那么版本可能是落后的。最新版请访问 Emoe工作室 的网站获取。

0->铺垫->学习技能++

0.0->如何学习?

技术总是与时俱进的,它不像我们的课本知识一成不变(至少在下一个Einstein诞生之前是这样的:D),可能我们去年才学会的技术,今年就被淘汰掉。
所以我们需要学会 如何自学,我做了简单的总结如下:

  • 学会搜索资料

擅于使用搜索引擎、靠谱的书籍来查找你所需要的一切。信息搜集与归纳能力是很重要的,下面细说。

  • 学会自主解决问题

    当问题出现不要慌,提取其中的关键词/点进行针对性的搜索和研究,尽量自己独立地解决问题

比如你写的流水灯程序出现了问题,无法通过编译,有Error,你需要在编译输出窗口寻找并定位到Error来源,再来根据报错类型具体分析、查找、是哪里出现了问题。
同时你可以搜索问题,如报错"undefined xxx",你就可以搜索 "undefined xxx",而不是搜索 为什么我的流水灯不亮(

  • 学会提问
    当问题实在是超出了你的知识范畴,你可以向他人求助,向他人求助并不丢人,不过你要学会正确的提问方式

我们一个一个来看。

0.1->使用搜索引擎

遇到问题时,可能很多人的第一反应是求助于他人?
🐟刚刚开始学技术的时候也是这样想的…可在那时候,身边找不到能问的人呀~
于是我就学会了用搜索引擎的习惯———回过头来看,这确实是最佳的学习方法。

搜索引擎是什么东西呢?我们来看看它的wiki定义:

搜索引擎(英语:search engine)是一种信息检索系统,旨在协助搜索存储在计算机系统中的信息。搜索结果一般被称为“hits”,通常会以表单的形式列出。网络搜索引擎是最常见、公开的一种搜索引擎,其功能为搜索万维网上储存的信息。

万维网(World Wide Web)是现代社会的基石。我们所获取的很多信息都来自网络,而搜索引擎正是网络世界的入口~
比较知名的搜索引擎有

Bing

Google

以上2个都是我常用的搜索引擎,它们是互联网世界的入口,它们不间断地搜集互联网上的公开资源并按照网站特定的属性分类(比如商业、教育、文献资料、公司、组织等官网)并排序,以此为基础为用户提供搜索服务。

不知道大家遇到了不会的问题的时候是怎么查资料的…俺发现周围的长辈们在用百度的时候,输入的搜索词都是以拟人化的语气去提问,比如:

  • 生病感冒了怎么办?
  • 安卓手机怎么装QQ?
  • ……

我想说的是,日常生活的问题这样提问…问题不大。
但是
如果是查询技术类问题,那你也许应该好好斟酌一下你的用词了~我们举个栗子对比一下:

使用2种风格在Baidu搜索

baidu

使用Bing国内版搜索

bing_cn

使用Bing国际版+英文关键词搜索

bing_en

使用Google搜索

Google

0.2->结论

相信你看完上面的搜索结果,心中已经大致有了一个排行~

我简单总结如下就是:

  • 遇到问题 先用搜索引擎搜索,实在不知道如何下手/找不到方法再求助他人
  • 使用关键词检索,而不是拟人语气
  • 技术问题少用baidu,少用baidu,少用baidu(重要的事情说三遍~)
  • 抓住问题重点,如果不知道重点在哪应该向有经验的人请教
  • 会fanqiang的话,能用Google尽量用Google,不能fq的话就用Bing,Bing也很强大(注意是Bing国际版)。

附上Bing的网址: https://cn.bing.com

为什么要用关键词检索而不是拟人语气呢?
简单的来说搜索引擎把互联网的内容梳理成了一个"大辞典",检索辞典的内容是通过关键词检索的,而不是根据完整的"人话"检索的。使用 关键词搜索 能搜索到更加精准匹配的内容。

0.3->使用百科和资源站

网页百科是知识大辞典(百度百科除外),在这里推荐维基百科,但是国内某些特殊原因上不去,所以你可以使用维基百科的国内镜像站—— 万维百科

除开百科之外,互联网上还有非常多优质的资源可供学习使用。常见的分为几种:

  • 博客站: CSDN、简书、博客园、知乎回答专栏等 (不推荐CSDN和简书等,臭名昭著的互相抄袭…不过看个思路还是可以的)。
  • 科技公司官方网站: 德州仪器亚德诺半导体意法半导体 等等…

    这些公司官网有非常多的应用笔记与学习资源,内容详实,从理论到实践循序渐进,非常推荐。

  • 教程站: 菜鸟教程电子森林微雪课堂 等等…

    当然,教程站的质量也是参差不齐,不过以上3个还算是有保障的。不过部分内容的时效性可能没那么好,需要自己比较一下。

  • 各类技术论坛: 科创论坛矿石收音机论坛等等…
  • 个人博客: 寻找野生的大佬~ 比如 稚晖君
  • 最后,当然是 e萌工作室 啊!

当然,这些资源也是通过搜索引擎去寻找的,而且他们的质量参差不齐,在借鉴的同时一定要学会 鉴别。(比如你抄了一个不完整的代码,它肯定是跑不起来的,但是它的思路可能是可以借鉴的。)

0.4->搜索示例

比如我在学51单片机的时候需要点亮数码管:

  • Bing搜索——51 数码管

用stm32的adc的xxx模式完成任务:

  • Bing搜索——stm32 adc xxx(操作,比如dma、中断等等)

用Verilog在FPGA上实现DDS:

  • Bing搜索——Verilog DDS xxxx(接fpga开发平台等)

NE555芯片管脚排列:

  • Bing搜索——NE555 pinout 或者 NE555 datasheet,这样可以直接找到芯片的数据手册(数据手册(datasheet))

And so on ……

0.5->提问的艺术——如何正确提问

请先让我暴躁输出一番,并不针对任何人:

  1. 错误的提问示范
    • 在吗?/有人吗?/有大佬吗?/有人帮帮我吗? Ans: 你想让人怎么回复?有?没有??
    • (手机拍屏幕),大佬这个代码怎么报错啊? Ans:你这程序干啥的?你是不会用截图吗?你就不能发报错信息吗?
    • 发一长串指标要求balabala,然后:这个东西怎么做? Ans:你xx谁啊,你给我钱吗/我是你爹吗,让我帮你做?
    • 大佬帮我做个xxx参加比赛吧。 Ans:??????你是魅魔?
    • 明明有技术交流群,非要找人私聊问特简单的问题… Ans:我最闲还是我的时间不值钱?
    • 你好这个代码/电路图/pcb可以发我一份吗?我的邮箱:xxx -Ans:可以啊,先V我50万。

🐟声明一下,这些提问都是我曾经碰到过的真实案例。(当然为了不打消提问同学的积极性,我没有按照如上回答。)以及,下图供参考。

Google

当然,🐟相信绝大多数友友们都是乐于帮助他人的。如果我能帮助到他人我也会很开心,但是我很反感把他人的帮助当作是理所应当的人。🐟始终认为提问的内容无关紧要,提问者的态度才是第一位。如果你 态度端正,认真钻研,努力地去尝试解决问题,大家都会耐心地帮助你的。

哎呀负能量有点多,请忽略 \^_\^。

  1. 正确的提问示范

    你好,我在开发xx的时候遇到了问题(附上完整的工程文件和所有代码),我尝试了xxx、yyy方法,仍然无法解决,我的运行环境是xxx操作系统,软件版本是V5.x,硬件连线我不确定有没有问题,(如果有的话附上电路原理图和PCB文件)

    哈哈哈是不是有点严?可是这是最能节省双方时间的提问方式哦~时间就是生命啊!
    当然你也不需要 完 全 一 致,只需要提供足够用于debug的完整信息就可以了。如果你能正确地提问,相信大家都会非常乐意帮助你的~

对于我而言的话,我希望提问的同学是经过自己的思考和努力之后再提问的,因为很多问题是自己有能力解决的。通常对于偏无脑的提问,🐟是会选择性打哈哈的ㄟ( ▔, ▔ )ㄏ

我在此建议,看到此文的你一定要去看一下这篇 《提问的艺术》。相信认真看完这篇文的你一定能提出简洁优雅的问题~

0.6->如何自主解决问题?

无论一个人做不做技术相关,解决问题的能力 永远都是在这个社会上生存的根本。

0.7->Emoe资源使用指南

请看看我们网站的顶部(PC浏览器、移动端都是)的菜单->所有文章,就可以找到本网站的所有文章啦。

当然,你也可以点开各个小类,去查看对应的特定分类文章。也可以点击 所有文章,探索宇宙的尽头。

1->硬件入门->理论篇

说到硬件,当然电路分析基础是最重要的啦~
相信大家高中都学过一些基础的电路分析了,比如欧姆定律,串并联和混连电路,如果有些遗忘了可以回去复习一下:)

来到大学,电路分析课程会讲 KCL/KVL (基尔霍夫定律),以及几个重要的等效思想(戴维南等效、诺顿等效、叠加原理),学会这些你就能掌握基本的电路分析技能了~

差点忘了, 电容(Capacitor)电感(Inductor) 也是构成电路的基础元件,你需要了解它们的特性,以及它们在电路中的作用,还有典型的用途。

RCL

学完电分之后,你还要学习 模拟电路基础数字电路基础 ,这两门课就开始有难度了~

analog&digital

模拟电路可以参考——《新概念模拟电路》-杨建国著,可以在 这里 找到全册,这是一本非常贴近实际工程的模电教材,可以和传统模电教材结合食用。

数字电路嘛,可以看看b站上清华的数字电路基础网课,网上的电子版教材和数字化教学资源也非常多~

不过别担心,我们初学阶段不需要完全掌握它们,我们只需要了解最基本的概念和专业名词,就可以上手做些小东西:D

前面说过的,学习的过程中遇到不会的问题再去查阅资料,是最有效的学习方法之一~

这里我们简单介绍一下电子学中的基础概念。

1.1->电源——生命之源

提到电源…总是让我想起过去很多奇妙的提问…

比如:

  • 电路为什么要接地?
  • 共地是什么意思?
  • Vcc是什么?Vss又是什么?
  • 。。。。。。

总之,电源是电子系统和动力之源,往往很多问题都围绕电源展开…
新人最常见的问题就是如上3个最简单也是最基础的问题——概括一下就是:电源总线、接地、共地问题
有问题不丢人,我刚入门的时候也花了好长时间才搞清楚这些问题(捂脸),那么我们来解答一下~

1.1.0->什么是地?(Ground)

首先要明确一点——接地是电学中的概念。在 供电系统电路设计 中意义并不相同。

1.1.0.1->供电系统中的地

在市电系统,地线是指一根理论上与大地等电位的导线,因其对地电压小,不会对人畜造成伤害,可用于保护。为了使其与大地电位相近,一般民用将其与水管、暖气片等相连,因水管与大地相连而达到释放电能的效果;而工业上一般将地线与避雷针的接地体等插入地下的设施相连以达到更好的放电效果。

由于电感性电器一般在金属机壳上会因感应而产生一些较小的电压,也可能由于漏电原因使机壳带电,为保证使用安全,应将地线与电器外壳相连以通过大地放电。(如果你摸着你的电脑感觉手麻麻的,可能是电脑电源接地不良诶)

为什么通过大地进行放电呢?通过电学基础知识我们可以知道,电能、电势、电流这些概念的本质原因是 电荷的积累与移动。那么如果我们需要一个参考点位,我们希望这个参考可以无限地吸收电荷而不发生电位变化,那么你看地球它够不够大?

这是因为如果你想要改变整个地球的电位,几乎是不可能的(除非...你是万磁王:D)

常见的民用配电接地——将导体埋入地面,然后接到楼栋的市电地线上(我国北方常见的水暖气片也是接地的)

connect to ground

1.1.0.2->电子电路中的地

电子电路 中,地是所有电压的 参考点,所以在这里也可叫做 参考地(Reference Ground),也就是说电路中任何一点的电压都是相对于这个测得的,因为电压是一个相对值,必须要有一个参考点。此时,地线不是真正与大地相连(所以你做的电路板没必要插在土里用;D),其电位也与大地电位无关。整个电路在设计时,以地线上电压为0V,以统一整个电路电位。

比如说用电池供电的电路系统中,电源正极就是电池正极,电源负极就是电池的负极,同时电源负极也是,是这个电路中的电压参考点。因为电流从电源正极流出,经过各个元器件之后统一流回到电源负极,电源负极吸收了所有的电流,用它当作参考电压点,是非常合理的。

在强弱电隔离或高低频信号隔离等场合,一个电路中可能有多个彼此电位不同/或为了信号回流路径而区分的地线,分别称为强电地、弱电地、电源地、信号地、高频地、低频地等。当然这属于比较进阶的内容啦,刚入门不需要在意这些= =

1.1.0.3->术语

以下是一些常用术语解释:

  • 接地 的意思是将某点跟地相连
    • 比如说有的芯片的负电源引脚要接地,滤波电容的负极也要接地
  • 共地 的意思是所有电路支路都有相同的参考地
    • 比如说有2个电路系统,如果他们之间有电气连接用于通信(比如串口),那么他们必须共地,否则无法正常传输信号
    • 怎么共地?当然是把2个电路的地用导线或某种连接形式接到一起啦…
  • 浮地 即该电路的地与大地无导体连接

1.1.1->电源总线(Power BUS)

我们常常会在电路图中看到很多简化的符号用于简化电路图连线,比如说电源总线

Power Bus

如上图所示,最左边是一个萌萌的电源,电压E我们就让他等于5V吧~
中间是这个电源串联了一个限流电阻,接到了一颗发光二极管上,这时候我们在上方标注了一个符号VDD,下方标注了一个符号GND(就是那3条线),VDD代表的是 正电源总线(BUS) ,一张电路图中所有连接到VDD标记的线路都是连接到一起的~,同样地,对地也是同理!

然后我们再看最右边的图,我们没有画出电源,只用VDDGND符号来表示电源,很简便地就完成了这条支路的连接。

1.1.1.1->书本知识与工程实践的区别

有同学可能会疑惑了,这跟以前学的电路图怎么不一样啊?
在高中阶段学习的电路图,因为整个电路结构较为简单,且电路规模不大,可以简单地将整个电路图呈现出来并画出所有连线。但是在工程实践中并不是这样——
实际上我们往往要面对极为复杂且繁多的电路结构,大工程的原理图纸甚至有几页甚至几十页A4纸之多!这时候再把所有的连线直接画出就 不太现实了。所以我们使用上面讲的这种 电源符号(Symbol) 来简化电路图的表示。如果在复杂的信号链路中,我们有时也会用 网络标签(Network Label) 来简化连线。这样也能更好地保护我们的视力(bushi)。

如下图,左边看似是2个彼此毫无关联的电路,其实他们是通过电源 符号(Symbol) 来简化了连线。

Power Bus

下图是一些常见的电源符号,我们常说的其实是一个参考电压点,我们一般在电路中规定上的电压为0V,其他节点的电压都是相对电压取值的。

Symbols

1.1.2->正负电源与参考地(di(四声))

另一个让人迷惑的概念就是双电源了,也就是正负电源。
正负电源可以 等效成2个直流电源串联而成,如图所示,2个5V的电源串联形成了一个10V的电源,把中间的连接点取出来作为我们的 参考地,记为GND,Vss处相对于GND的电压是-5V,Vcc处相对于GND的电压是+5V,这样我们就得到了正负双电源。(时刻牢记电压是一个相对值,必须要有一个参考点~)

Dual

1.1.3->常见的电源

相信大家对电源并不陌生。笔记本电脑的充电器、手机充电器、路由器的电源,都是生活中常见的电源。

在我们做开发时,一般的开发板会从USB端口取电,一般是电脑上的USB端口,兼具供电和通信的能力(真是方便的接口呐~ )

当然,USB的供电能力是有限度的,一般电脑的USB接口默认只能输出5V电压,电流最高一般在1到2A左右,如果需要较大的电流,还是需要外接5V电源~
有些手机/电脑充电器支持QC/PD等快充协议,可以输出9V、12V、15V、20V等一系列电压值。当然前提是你的硬件设备需要支持这些快充协议并能够与充电器进行协商。

USB

做实验的时候,需要12V直流电源,或者其他电压、电流规格的电源,这时候就需要可调稳压电源(这可是个好宝贝.jpg)
这种电源具有连续可调电压(比如0V-30V)输出能力,并且能够对输出进行精确限流(限制电流大小,保护可能有风险的电路)

Power Supply

上图是一个单通道的电源,如果是双通道的电源就可以将其串联起来,构成双电源。
同时请注意上图这个电源的输出有3个端子,分别是 +、-、还有一个…地(绿色端子)
这里的绿色端子实际上是与仪器的外壳连接的,机器的外壳又是与市电的三孔插座中的地连接的,而输出的电源(黑红端子)是与电网地断开的,我们可称其为隔离的(Isolated)。 用户可以将绿色端子与黑色或者红色端子连接,让电源的输出极性变化,也可以选择不接绿色端子,把电源当作隔离电源使用。

1.1.4->电流的概念与基本常识

我们这里讨论的电流均为 宏观概念 上的电流,涉及到微观领域的电荷移动不在我们的考量范围内嗷(比如某些微观领域内的量子效应)

电流(Electric current)是电荷的平均定向移动。电流的大小称为电流强度,是指单位时间内通过导线某一截面的电荷,每秒通过1库仑的电荷量称为1安培。安培是国际单位制七个基本单位之一。

有很多种承载电荷的载子,当然在我们的电路板上,最常见的就是 导电体(铜、铝、金、银等)内可移动的电子 了。那么我们上面介绍了一些常见的电源,电源是如何加载到电路上、并为其供电的呢?当然是通过电源连接线咯——本质上还是铜导线。

概念非常简单,但是我们对电流大小的认知要有一些基本的常识,如下我列举了一些常见的电路、芯片以及设备的耗电电流大小:

Current Consumption

建立一些常识有助于快速诊断电路工作状态(看看芯片死了没)。比如你的单片机如果接上电就消耗上百mA的电流,那么一定是哪里出了问题…
需要时刻牢记,瞬时功率=瞬时电流x瞬时电压。

1.2->数字电路基础——二进制

说完了电源,我们来说说数字电路。

一个机械开关的状态只有2种,开(定义为1)和关(定义为0),而在电子电路中,构成复杂逻辑电路的基础就是这简单的 "开关"

我们日常生活习惯采用10进制计数和运算,但是在电路结构上是无法使用电信号去 "直接表示" 十进制数据的。说到底人类创造十进制计数是为了方便人理解和使用。。。

在我们的数字逻辑电路中,任何基础逻辑电路的输入输出都只有2种 电平状态 —0和1(低电平和高电平),可以说数字电路使用二进制语言交流~ 而计算机的运算单元都是由许多基础逻辑门组合而成的,我们可以将其视作一个 黑箱(Black Box) ,无论里面的内容如何,输入的数据(信号)必须是二进制,输出也是二进制。
如果我们需要在计算机中将这些二进制转换为十进制或者其他进制,就是上层程序的工作了。

1.3->数字抽象

在物理世界中,大部分物理变量是连续的,例如电压值,振动频率,物体位置,电流大小。而这些量如何被数字计算机系统正确地采集并存储呢?我们需要对它们进行数字化抽象~

数字系统采用离散取值的变量(0和1),而这些变量落实到最底层,最终传输的形式是电压信号…于是科学家们使用了奇妙的技术手段,定义了 逻辑电平 这一概念。

现在我们用二进制信号A来表示一根电缆上的电压信号。当电压为0v时,A = 0;当电压为5v时,A = 1;这个系统中规定5v为高电平信号,0v为低电平信号(电压都是相对于数字电路的参考地取值)。

logical

但是真实世界中怎么可能所有的信号都如我们所愿是标标准准的稳定电压呢?如果电压为4.9v,0.0000001V,A就无法取值了吗?答案当然是不会啦! 请看下图

CMOS Standard

中间那个 三角形的框框 是一个数字逻辑门,输入输出都为 抽象化的数字信号

刚刚我们担心的问题是电压在2个标准线上下波动的情况,我想在上图中聪明的你已经在图中的左侧找到了答案。

是的,只要电压在3.5-5V的范围内,逻辑门的输入都被识别为 “1”,在0-1.5V的范围内,逻辑门的输入都被识别为“0”。而且这个标准并不那么严格,实际由于芯片制作工艺、工作条件等因素影响,有一点上下浮动也是可以接受的。

而看向右图,输出电平也不一定会是我们所期望的那样为绝对的5V或0V啦。由于电路中的各种元件参数差异及电源工作状况好坏,输出可能会在5V或者0V上下有微小的波动,这些也都是可以被接受的。

需要注意的是,上图的标准是 CMOS 标准,除此之外在数字电路里还有常用的 TTL 标准。见下图↓↓↓

Note: 图中Vcc代表电源正极,下面那个三角形的3条横线代表接地符号,在这里也就是电源负极,前文讲过啦

TTL Standard

1.4->数字电路的真值表

逻辑电路的真值表描述了它的输入输出关系,下图就是一个非常清晰的逻辑表,列出了最常用的4种基本逻辑门的真值表。

  • AND Gate – 与门
  • NOR Gate – 或非门
  • OR Gate – 或门
  • Exclusive OR Gate – 异或门

Truth Table

1.4.1->波形图/时序图

如果有一个信号序列通过逻辑门,会发生什么样的奇妙反应呢?

画一下吧~
以X轴为时间,Y轴为电压大小,画出逻辑门的输入输出信号 波形图(waveform plot)

A信号输入非门

NOT

A、B信号输入与门,C为输出

AND

像上面这样以 时间 为横轴, 电压(电平) 为纵轴的图,被称作 信号的波形图。大家以后看到了要会认~

1.5->逻辑门的内部结构

数字逻辑门看起来很神秘,尤其是在现代电子工业发达到这种程度时,集成电路的集成度越来越高,未曾了解过的人根本无从知道一块块集成电路里藏了什么幺蛾子(乱入)
其实很简单,所有的电路都是由最基础的电阻,电容,以及晶体管等构成的(虽然并没这么简单),比如下面这个最简单的 非门

Logic Gate

它就是由一个三极管,2个电阻构成的。当然实际的逻辑门为了提升性能和满足某些特定的要求,还会为这个电路添加一些别的用于提升工作稳定性的元件或支路(比如输入超压保护、输出限幅等),但那是后话啦。

了解了最基础的逻辑门是如何组成的之后,也就不难理解庞大的计算机是如何组成的了。。现代的商用CPU制程已经达到了稳定的5nm级别(顺便Intel还在14nm+++++),单块CPU里集成数以亿计的晶体管,里面无非就是一大堆逻辑门嘛(暴言,不要信),比如下面的 Intel 8008 计算机CPU单元的电路图,感兴趣的话请 >点击我< 查看更多信息。

CPU

图中一大堆逻辑门和数字器件组成了一个功能单元,我们可称其为 模组(Modules),这些模组在计算机中都有特定的功能和相应的职责,比如指令解码,运算器,内存,I/O控制模块等(在这里不解释CPU原理了,感兴趣请自行google,或者直接看下面我们准备讲的www)…而这些复杂的模组都是由最基本的逻辑门组合而成的,只不过内部电路结构非常复杂。b站上有不少人用逻辑门搭建CPU的,感兴趣可以去看看哦~

2->硬件入门->物理链接

学会了一些简单的电路入门之后,我们就可以着手制作我们的小项目了~
是的你没有看错,不上手做点东西,我怎么知道我不能做呢?

要把一张电路图转换成真实的元器件,并让他们按照电路图所描述的连接方式连接起来,我们通常需要用电路板

2.1->印刷电路板

za1

图中的板子是经过复杂工序制造出来的 印制电路板(Printer Circuit Board,简称PCB),PCB用于设计成熟的电路结构并用于量产。比如我们的手机、电脑、相机、电子手表等常用电子设备和电器中,是一定存在PCB的。

PCB的设计流程对于初学者过于复杂,我们还是推荐用如下2种方式完成你的入门电路哦~

2.2->洞洞板(万用板)

但是我们做所有电路都必须用这种复杂的制作方法吗?当然不是。我们在搭建简易电路或者验证电路功能的时候,可以用 洞洞板,也叫万用板来完成,将元件安装在其上,然后在背面用焊锡走线,亦或是用导线飞线,就能完成简单电路的组装。

以下电路来自于@CNPP同学~

za2

za3

先来看正面:
这个板子上安装了好几个电子模块,这些模块都有几个针脚引出,可以插进洞洞板并焊接上,偏右上的黑色框框是PDIP-40的芯片座,这里将会安装一个40脚的51单片机。
当然除了模块,还有一些元器件如电位器、轻触开关、电解电容等元件被固定并焊接在这块洞洞板上。

再来看看反面:
银白色线的就是焊锡丝被熔化后吸附在洞洞板背面的焊盘上,并由于液态金属的表面张力而连接在一起,用烙铁适当挑拨即可让他们连成一条线,达到走线的目的。

而带有蓝色线皮的导线就是跳线。因为有的地方用焊锡铺路过去是走不通的,所以我们还需要适当地跳线。

一般洞洞板的孔间距是2.54mm,为什么呢?因为这是英制单位,1 inch = 25.4mm,现在工业界还是习惯用这种规范,属于历史遗留问题= =
一般1/4w直插电阻会占用4个格子,瓷片电容占用2-3个格子,小电解电容也是2-3个格子…具体的自己玩一玩就熟悉啦(。・∀・)ノ

2.3->面包板

虽然它叫这个名字..但它可是不能吃哦。
为了讲解方便我们设一个x-y二维坐标系~ 以左下角为原点向右为x方向,向上为y方向

如图是面包板的正面和底部解剖图,我们可以看到:

  • 中间部分x方向是由金属片连接在一起的,而在正中间是被断开的
  • 同时在中间部分的金属片在y方向上是彼此绝缘(不连接)的
  • 在左右两侧,金属片在x方向上彼此绝缘,在y方向上连成一条

中间通常用来放置芯片和元件、走线等,两侧一般用作电源轨。

Breadboard

那么我们可以像这样把元器件插到面包板的洞洞里,并且用跳线(那些花花绿绿的导线,英文名叫 Jumper )把电路中的各个支路连接起来,这样就可以把纸上的电路图转换成实际的电气连线。比如这样(作品来自CNPP同学):

breadboard1

breadboard2

关于更详细的面包板的教程,请参考 创元素

2.4->PCB设计

如果你已经对洞洞板和面包板这种电路制作方式很熟练了,想要学习PCB设计,那么可以…找找教程(因为我们只有一个KiCad画板的快速概览视频,没有详细教程略…
但是如果你想更多地了解PCB该如何布局布线,以及各类PCB的设计规则和技巧,那么可以看下面:

其实大多数时候,PCB上的导线还有着不为人知的另一面……想要了解吗?请看——

3->硬件入门->准备工作

如果你想认真地入门电子diy,那么你大概率需要一个工作环境。如果你只是业余偶尔玩一玩,可以只看看,不买东西~

3.1->搭建自己的工作室

如果想做什么东西…首先我们得有个工作环境。
当然如果没有能够长期使用的实验室工位的话,最好还是自己搭建一个属于自己的工作环境咯~

一个合格的(优雅的)工作环境包含以下几个要素:

  • 足够大的桌面 ——放置一台电脑/显示器,同时留出焊接和摆放元器件和工具的空间
  • 良好的电源供应 ——至少得保证满载2kw的功率供给啦,同时需要很多插排来连接很多工具和仪器
  • 稳定的网络连接 ——没网怎么上网嫖代码?(bushi)
  • 保证通风顺畅 ——焊接或者加工什么东西的时候会产生令人不适的气体,最好能及时排出房间哦?
  • 充足光照 ——没有阳光的话就挂个LED灯~
  • 消防安全 ——任何封闭场所都需要注意的

CNPP同学在寝室搭建的临时工作台长得像这样:
啊,如果你想品茶,也可以在工作台上放上一个茶杯——

1

图中是一个模拟示波器,在其上的铁壳子是电源(还有他的橙子)

2

3.2->要准备什么工具?

以下罗列的工具并不全是必买的,只是根据我们的经验作出的推荐,根据自己的情况可以适当增配或者减配设备哦。

首先,草稿纸、铅笔、剪刀、中性笔、直尺、剪刀、裁纸刀是可以有的~
这些都是作图,亦或是打草稿,加工小部件时需要的基础工具

3

然后就是小毛刷子(清洁桌面/电路板)、斜口钳(修剪过长的引脚)、砂纸(打磨用)、镊子(夹住小元件)、笔刀(用来切割),这些工具能帮助你做出精美的电路板,并保持工作台的整洁。

4

接下来是切割垫板(背景绿色板板)螺丝刀、油性记号笔(做标记)、矬子(打磨)、铜刷(配合打磨、清洁)、剥线钳(如其名)、游标卡尺(精确测量),这些也是常用的工具。

5

(当然,你可以直接买一套便宜的螺丝批,常用的螺丝刀就齐全了~)

6

热熔胶和热熔胶枪,这是个好东西,常常用来固定一些简单的小部件

7

电烙铁和烙铁架,电子必不可少的焊接工具,如果想要长期使用可以购置一个能控温的焊台,比如T12

8

9

焊锡丝、松香(不推荐)、助焊剂,这些是我们焊接使用的耗材。

10

哦,当然,你可能还需要一些劲大的工具,比如这种大钢锉刀

11

洞洞板,上面我们说过,用他们来做一些简单的电路再合适不过了~

12

元件盒,用来收纳、整理各种不同类型的电子元件和机械元件

13

一些单片机开发板(最小系统板),想要玩单片机的话,用最小系统板是再合适不过了~!

14

移动电源,有时候意外地好用

15

16

数字万用表,是我们用来测量各种电路故障的利器,是我们的手中剑
这种东西有便宜的也有贵的,如果想要长期用,推荐你买一个100以上的万用表~

17

17-1

17-2

4->软硬结合->大(单)盘(片)鸡(机)

最初写这小节的时候我用了瑞萨的一篇教程,但觉得不够简单,于是我根据他们的教程自行加工了一下~

4.1->单片机是控制电子产品的大脑(划重点)

现如今,我们生活中的许多电器都使用了单片机。例如:手机、电视机、冰箱、洗衣机、以及按下开关,LED就闪烁的儿童玩具。那么,单片机在这些电器中究竟做了些什么呢?

单片机是这些电器动作的关键,是指挥硬件运行的核心器件。例如:接收按钮或按键的输入信号,按照事先编好的程序(你问我程序是谁编的….那当然是屏幕前的你呀(笑)),指挥马达、喇叭、发光二极管和液晶显示器等外围功能电路动作。

那么,单片机是如何构成的呢?

MCU

术语辨析:

  • MCU: Micro Controller Unit,微控制单元,一般也称为单片机
  • CPU: Central Processing Unit,中央处理器,跟我们电脑上那块CPU是同一个意思(但性能差了非常多)
  • 内存: 包括RAM(Random Access Memory)ROM(Read-Only Memory),RAM负责存储CPU的指令和运算数据等信息,而ROM负责存储用户编写的代码和静态文件等信息
  • 外围: Peripheral,一般称为外设,包括可编程输出状态的GPIO、定时器、通信接口控制器等等
  • 输入设备: 比如开关、按键、麦克风等
  • 输出设备: 比如电机、发光二极管(LED)、扬声器(喇叭)等

单片机是由CPU、内存、外围功能等部分组成的。如果将单片机比作人,那么CPU是负责运算和思考的,内存是负责记忆并充当我们思考的缓冲空间的,外围功能相当于视觉感官系统,以及控制手脚动作、感受外界刺激的神经系统。

4.2->单片机的梦乡

内存是单片机的记忆装置,主要记忆程序和数据,大体上分为ROM和RAM两大类。

4.2.1->ROM

ROM(Read Only Memory) 是只读内存的简称。保存在ROM中的数据不会因断电而丢失。ROM主要用于保存用户程序和在程序执行中保持不变的常数。你可以把它理解成电脑中的硬盘,可以存储你的软件和多媒体资源。

大多数的单片机都用闪存 (Flash Memory) 作为ROM。这是因为闪存不仅可以像ROM一样,即使关机也不会丢失数据,而且还允许多次修改数据。一般闪存的烧写循环寿命是10万次以上,意思就是说你可以对一个用Flash作为存储介质的单片机不断编程10万次以上…基本等于玩不坏(现代MCU绝大多数用Flash作为存储介质)。

4.2.2->RAM

RAM(Random Access Memory) 是可随机读/写内存的简称。可以随时读写数据(当然,要通电),但关机后,保存在RAM中的数据也随之消失。主要用于存储程序运行过程中产生的变量。你可以把它理解成电脑中的内存条。
RAM的特点是读写速度可以做到非常快,Flash的读写速度则慢得多。

当然ROM和RAM还有很多别的类型,如果你以后深入学习嵌入式系统以及外围的话就会慢慢接触到了…

4.3->为什么要使用单片机?

为什么很多电器设备都要使用单片机呢?
让我们用一个点亮LED的电路为例来说明。如下图所示,不使用单片机的电路是一个由电源(这里是电池),LED,开关和电阻构成的简单电路。

no mcu

使用单片机的电路如下图所示。

mcu on

很显然,使用单片机的电路要复杂得多,而且设计电路还要花费精力与财力(最重要的是单片机得花点钱)。好像使用单片机并没有什么优点。但是,现在下结论还为时尚早

如果我们让这个电路做一些比较复杂的操作,会怎么样呢?

例如:如果我们希望LED在按下开关后,经过一段时间再点亮或熄灭,或者让LED遇到了某种情况(比如到整点报时)的时候亮起。那么,对于安装有单片机的电路来说,只需更改单片机中的程序就可以了,并不需更改原电路。另一方面,对于没有单片机的电路来说,就必须在原电路中加入定时器IC,或者用标准逻辑IC和FPGA构成逻辑电路,才能实现这个功能。但如果再度遇到需要更改显示方式的需求,这些辛辛苦苦设计出来的电路可能就得推倒重来。

也就是说,单片机的优点如下:

  • 在更改和添加新功能时,带有单片机的电路显然更加容易实现。
  • 整个系统过于庞大时,使用分离逻辑器件实现功能将会极其困难,而使用单片机只需要编写代码就可以实现
  • 单片机可以运行简单操作系统,能实现复杂任务控制,比如遥控车、无人机、机器人等应用场合
  • 单片机还能完成很多 非常复杂的功能,往往高级的单片机会将诸多外设直接集成在片内,比如:
    • ADC/DAC 模块(模拟-数字域转换)
    • SPI/I2C/CAN/USART 控制器(多设备通信)
    • 高精度定时器 (复杂任务控制、波形产生、外部脉冲捕获等)
    • FPU/DSP单元 (浮点运算/数字信号处理单元,用于加速浮点运算和数字信号处理算法)
    • balabala…

往往这些复杂的外设用标准逻辑IC是难以实现的,而单片机在设计时就封装好了这些硬件外设,外设由单片机内部的 总线控制器 统一控制,用户只需要通过高级语言(如C/C++)编写很简单的代码即可使用这些外设。

STM32

上图所展示的是STM32F407ZET6单片机的内部外设资源图。我们可以看到它集成了非常多的高级外设~

4.4->单片机的外围功能电路

从本小节开始我们使用 Arduino UNO 开发板为例进行讲解,因为Arduino是我个人推荐新手入门单片机的最佳选择。具体原因稍后再说

4.4.1->"动力之源"-电源电路

与迄今为止所学的各种电路相同,单片机的工作也需要电源。因此,单片机的外部都连接有像电池等电源部分。我们的常识一般是“如果供电不正确,电路很大概率不会正常工作”。事实上,在数字电路中,供电达不到要求是个 致命的错误(Fatal Error),给单片机的 供电电压过高会直接烧毁它,而电压过低单片机则完全不会工作。因此了解如何正确地为单片机供电是非常有必要的~!

我们以Arduino UNO开发板(单片机型号为ATMEGA328P,UNO只是开发板的"代号")为例,讲解一下型号为ATMEGA328P的单片机的电源电路。

Arduino UNO

一般单片机中常见的工作电压有5V,3.3V,1.8V等,我们可以称这些不同的供电电压为 "电平标准""供电标准"。而ATMEGA328P就是5V电平标准的单片机。
仔细看上图可以发现,通过左上角的USB连接端子可以外接USB供电,通过左下角的黑色电源插接端子也可以供电。

等等,不是说这个单片机必须只能用5v供电吗,为什么图上标注的是7-12V?

这时候我们只要翻开它的 电路图,找到如下部分:

UNO PWR

这里左边的方块代表上图那个 "7-12v电源输入插座",而中间那2个方块的作用是把7-12V范围内的电压降到5V,供给我们的单片机使用。感兴趣的同学可以查找它们的型号并翻看数据手册,你会发现它们叫做 "LDO",意思就是 线性低压差稳压器,专门用于在输入输出电压差较低的场景下对输入电压降压稳压,输出一个所需的稳定的工作电压。

而如果我们通过USB端子供电,则不需要考虑LDO啦。因为USB接口的标准供电电压就是+5V,直接供给我们的单片机使用即可。而且LDO的输出和USB供电的5V总线是并联关系,只要有任意一个电源被接上,单片机就可以正常地工作。(在有的3.3V电平标准单片机如大部分STM32系列单片机的电源电路上,通过USB供电 也需要加上输出电压为3.3V的LDO 以保证单片机能正常工作不被烧毁。)

同时,在开发板的两侧排针母座上,可以通过跳线或杜邦线插接的形式引出我们的供电,以方便外围电路的供电及工作。

  • 5V —> LDO输出/USB的5V电压总线,引出可作为外部电路的电源正极(对GND电压为5V)
  • GND —> 整个电路的公共地(也就是电源负极),引出外部电源时,板上电路和外部电路必须 共地,即作为外部电路的电源负极
  • 3.3V —> 为了兼容某些需要3.3V供电的外部电路而在UNO板子上专设了一个输出电压为3.3V的LDO,可通过此端口引出

4.4.2->“总指挥”-时钟电路

大家都有过军训的经历。在踢正步走队列的时候,需要一个统一的信号来保证队列的一致性和同步性,没有了这个信号,队列就走不齐,想必大家没少因为这个挨教官骂23333
(诶我写这篇文的时候是2019年,现在的新生们都没训过了嘛ㄟ( ▔, ▔ )ㄏ,真是时代的眼泪啊。)

计算机内部是一种严格的 时序逻辑电路(因为存在触发器等时序逻辑元件,只含基本的逻辑门的电路称为组合逻辑),意思是每一次运算或操作都需要按照一个稳定的 "节拍" 来进行。单片机需要在外部连接一个振荡电路以提供 时钟信号 ,这个信号就像队列的节拍一样,保证着单片机的稳定工作。所以我们可以把这种电路称为 “总指挥”-时钟电路

获取时钟信号的通常做法是采用一颗晶体振荡器(晶振-Crystal),这种振荡器在通电后便会自己产生恒定频率的振荡信号,虽然这个信号的频率可能会因环境温度和内部材料的变化而改变(这种变化叫做 漂移 ,因温度改变叫 温漂)。但是在要求不高的情况下我们可视它产生的信号为频率恒定的信号。

当然,现在许多单片机都内置了RC振荡器,无需外部晶振也可运行,但是RC振荡器的频率精度和稳定性一般低于外部晶振,在对时钟要求不高,且想要节省成本和电路板空间的情况下也可以选择内部时钟源。

osc circuit

如上图所示,由单片机的外部输入的时钟信号叫做 外部时钟信号
而在我们的Arduino UNO上,一个振荡频率为16MHz的晶振被连接在了ATMEGA328P的2个时钟脚上。如下图所示。

16MHz

晶振的两端并联了一个阻值为1MΩ的电阻R2,对地(GND)串联了2个非常小的电容(通常为皮法(pF)级别,一般不超过30pF),这些额外的辅助电路是为了确保晶振产生 更稳定的振荡信号 而设计的。

4.4.3->"闹钟"-复位电路

刚刚接通电源的单片机内部处于不稳定的状态,CPU无法正常运转。因此,就需要进行单片机状态初始化,这就叫做复位。单片机带有复位信号输入引脚,可以将这个信号调至低电平状态后让单片机复位。也就是说通过输入复位信号来彻底叫醒单片机进入工作状态。

接下来讲解一下复位的时序。只有在向单片机提供稳定的时钟信号和电源的状态下才能实现复位,同时需将复位信号调至低电平。为了实现这种状态,需要将相比电源上电稍迟一步上电的电路与复位输入引脚相连接。这种电路在电源上电后通过电阻电流慢慢流向电容,电压缓缓上升。因此,电源上电后经过一段时间可以形成解除复位的电路。这种外部电路称为“上电复位电路”。

Reset circuit

如上图所示,上电复位电路左侧的电路称为“手动按钮复位电路”。这是通过手动按下按键后让单片机进入初始化状态的电路。(按下按键可以将电容对地短路,电容放电后复位脚上的电压为地电压,松开按键后再进行充电复位过程)

普通单片机上复位信号必须在一定时间内保持低电平。具体时间记载在硬件手册和数据手册上。必须根据这个时间的长短来确定电阻R和电容C。但是这个RC的值一般取经验值(R=1k ~ 10k,C=100nF)就可以

而在我们的UNO板上…我实在是懒得找复位电路了(其实是画的有点拐弯抹角我懒得重新画一遍( ̄▽ ̄)"),大家只要知道UNO的复位按键在板子正视图的左上角就行~

4.5->终于见面了,Arduino

本节主要介绍Arduino的家庭和开发方法,但是在查找资料时我发现了W3CSchool上已经有成体系的Arduino教程,我想我也没必要作搬运的工作…
所以在这里只是最简单的介绍,想要系统性地学习可以移步至 >w3cschool的Arduino教程<

4.5.1->Arduino的幸福大家庭

"Arduino is an open-source electronics platform based on easy-to-use hardware and software. It’s intended for anyone making interactive projects."

译:Arduino是一个基于简单易用的软硬件工具链的开源电子平台,它为任何制作交互性产品的人而生。

重要的事情说三遍:

请注意,Arduino不是一个特定的单片机,更不是一个特定的开发板,而是一个开源电子平台!
请注意,Arduino不是一个特定的单片机,更不是一个特定的开发板,而是一个开源电子平台!
请注意,Arduino不是一个特定的单片机,更不是一个特定的开发板,而是一个开源电子平台!

这个概念可以这样理解…说到全球最大同性交友网站"Github",它并不是一个程序,更不是一个IDE,而是一个开源社区平台…

啊这个比喻不太好,换一个8…这么说,"华为手机"不是一部手机,"华为手机"有一套产品线,从低端机到高端机都有,有很多种不同的型号。

Arduino家族的每个开发板都有一个独特的代号,比如最经典的UNO,稍微高端一些的MEGA2560,小巧一些的如Nano,Mini,自带通信模块的YUN,Ethernet,UNO WIFI等等…同时,Arduino还有很多芯片大厂加盟,推出了很多花里胡哨的开发板…

另外一点,Arduino社区是 开源电子平台,意味着它每一个开发板的原理图和PCB板设计文件都是免费公开的,任何人都可以下载并使用这些设计文件制作自己的Arduino,所以并不存在所谓的 原版,社区官方会有生产这些开发板,非官方的开发者也可以,所以国内很多电子厂也在生产,也就是我们在淘宝上看到的 低价Arduino,一般来说 官方正版这种渠道的Arduino开发板的工艺和元件用料会好一个档次,看着也更赏心悦目…但是如果你穷/不想在这方面投入很多财力,选择购买廉价的开发板是完全没有问题,它们的性能参数都是一样的,可以互相代换。
(当然如果过于劣质的开发板在使用时可能会出现各种问题(比如经典串口连不上),寿命一般不会太长)

希望大家可以去 Arduino官网 看看,虽然是全英文…不过我相信大家都有办法看懂~

4.5.2->Arduino开发环境

接下来我们来港港如何上手Arduino。
在第二章我们讲解了单片机的基本功能,但我们并没有讲如何为单片机编程。在单片机刚出现时,人们使用汇编等底层语言为其编程,因为那时还未出现高级语言如C,python,Java等。

众所周知汇编语言是及其复杂且低效的( 这里的低效是指开发过程,并不是指汇编语言运行效率低!!相反的,合理设计的汇编语言理论上能达到最高的运行效率,发挥硬件的最大性能),当高级语言出现后,单片机的编程语言逐渐被C语言等高级语言取代。现在在单片机上最广泛使用的编程语言是C语言。但是在我萌的Arduino平台,C++ 语言(基于wiring C 封装)则是主流。你要问我深层次的原因,俺也不知道,感兴趣请自行google哦~

通常,最方便的开发平台是 Arduino IDE,通过这里下载windows系统版本请点击右侧的 Windows Installer or Windows ZIP file。如果你用mac,请点击Mac OS X,如果你用linux…我相信你懂下哪个#滑稽

Arduino IDE

IDE:Intergrated Development Environment,也就是集成开发环境,IDE软件可以帮你配置并设置好开发项目所需要的很多设置,让你更方便,更快捷地进行开发。别的IDE还有如Visual Studio,Codeblocks,Keil,Dev C++,Pycharm等…

打开Arduino IDE,文件->示例中,有很多官方自带的示例程序可供参考学习。像下图这样↓↓↓

egs

打开项目->加载库,可以调用网上开源的硬件外设驱动代码~(具体怎样调用之后再说)。

打开工具->开发板,可以选择自己正在开发的开发板型号,如果这个型号不选对是无法为你的单片机烧录程序的!

Libs

写好一个程序后,需要编译以验证程序有没有错误,编译完成后,把开发板通过USB线连接到电脑USB端口,确保装好了驱动程序,这时在工具->端口应该看到你的开发板和它对应的COM端口号,选择正确后就可以把程序烧录进单片机了。大致操作流程如下图↓↓↓


uhznEQ.gif

当然如果你有开发单片机和使用IDE,文本编辑器的基础的话,也可以试试Visual Studio / VSCode。

Arduino

4.5.2.1 -> 如果我没有Arduino开发板怎么办?

  1. 可以taobao买一个,顺便买些面包板和跳线,以及一些电阻和元器件之类的。
  2. 如果你想稍微省点事,且囊中大方,可以买几百元的那种Arduino入门套件。
  3. 如果不想买。。可以试试 TinkerCad 在线仿真。当然这个网站在国外,访问可能会比较慢
  4. 也可以试试Proteus仿真等手段,但是不推荐。。既然都走到这一步了干脆氪金买个板子玩玩吧orz

4.5.3->Arduino UNO和它的邻居们

我们只需要一个开发板就可以完成所有实验吗?答案当然是Noooooooo!!

我们历经千辛万苦,终于明白了怎么给Arduino写代码,但我们手里只有一块板子能做什么呢QAQ

我们要点灯,就需要跳线、LED和电阻
我们要驱动液晶屏,就需要液晶屏、跳线和面包板
我们要驱动蜂鸣器,就需要跳线、三极管、电阻、面包板、蜂鸣器
我们要做物联网,就需要 wifi/ethernet 模块、面包板、跳线、网线和路由器
……

总之,我们的Arduino太孤单可不好。Arduino需要邻居,单片机这个主控者(Master)离开了被控器件(Slave)(啊你别想歪啊,行业内主机从机都是这样叫的。。虽然github现在因为zzzq把Master branch换成了main branch…),也就是各种外围设备,简称外设,单片机的意义又何在呢?

OLED屏幕

oled

ESP8266 WIFI模块

8266

And so on.

peripherals

至于如何一个个地征服它们,请关注之后的文章啦。也可以往前跳,去看W3CSchool的教程。

4.5.4->其他单片机

当然除了Arduino平台,还有别家的单片机可以玩。不过需要注意的是,Arduino是一个开源电子平台,并不是半导体厂商亦或是单片机型号,他所做的是为各种类型单片机制作了 硬件抽象层(Hardware abstraction layer) ,意思就是用同一套代码可以运行在不同类型的单片机上。

我们先来看看常见、常用的单片机系列都有哪些:

型号系列 架构类型 性能 开发语言(主流) 入门推荐程度
51单片机 8位8051架构 上世纪的古董 C和汇编 可以学习单片机内部原理,但不推荐
ST家的STM32系列 32位ARM架构 从低到高都有 C/C++、汇编、Micropython等 推荐学习,资料多且性能强
NXP家的 32位ARM架构 从低到高都有 C/C++、汇编、Micropython等 一般推荐,因为资料相比STM32较少
MICROCHIP家的 AVR/ARM架构 从低到高都有 C/C++、汇编、Micropython等 推荐,因为Arduino用的最多
Ti家的MSP/Tiva系列 ARM架构 从低到高都有 C/C++、汇编 比51强,难度比32高,性能不如32,我对此保持中立)

顺便一说,我个人推荐的学习路线是Arduino -> STM32。但每个人的情况各有不同,选择适合自己的就好。

5->软件入门->C语言与编译过程

我们虽然要学习硬件,但是软件也不能落下~
C语言是我们学习单片机编程以及后续其他嵌入式开发的基础,我们 不需要掌握很多算法,但是要熟悉C语言的语法和基本的数据结构知识。 怎样熟悉呢?当然是——

Do more Exercise!

在这里推荐学习资源:

  • 《C Primer Plus》——经久不绝的入门经典
  • 菜鸟教程
  • 其他的参考书等 欢迎补充

学习编程这件事嘛,我能给出的建议是 多敲代码,书也要看,但不能只看书,一定要敲。

5.1->代码的编译过程

了解了语法之后,我们最好了解一下程序的编译过程。

我们的代码是由 编译器(compiler) 进行编译的,Wiki百科对于其解释如下,我觉得非常清晰:

编译器(compiler)是一种计算机程序,它会将某种编程语言写成的源代码(原始语言)转换成另一种编程语言(目标语言)。 它主要的目的是将便于人编写、阅读、维护的高级计算机语言所写作的源代码程序,翻译为计算机能解读、运行的低阶机器语言的程序,也就是可执行文件。编译器将原始程序(source program)作为输入,翻译产生使用目标语言(target language)的等价程序。源代码一般为高级语言(High-level language),如Pascal、C、C++、C# 、Java等,而目标语言则是汇编语言或目标机器的目标代码(Object code),有时也称作机器代码(Machine code)。

就拿我们最熟悉的C语言举例,C语言的编译过程如图所示:

GCC Compiler

上述这个过程是简化的框图,在任何操作系统或硬件平台上,编译的过程大同小异,基本可以用上图概况。

我翻译了一下如下图所示:

Compile

是不是太复杂了orz
没关系,我们不必了解编译器的内部过程,我们可以将其简单地视作一个 Black Box ,输入一个/一堆源程序,最后得到一个二进制机器代码(可执行文件)

Simple ver

5.2->代码是如何在单片机上运行的?

相信很多人对此存在疑惑。我在这里用我所了解的浅显知识简单解释一下…

前面我们说到,单片机有RAM和ROM,而现在多数单片机的ROM是FLASH存储器,它是一种非易失性存储器,我们将数据烧写进去之后,断掉它的电源,其中存储的数据并不会消失。同时它也是允许在操作中被多次擦或写的存储器~

在上一步中,我们得到了单片机可以执行的二进制机器代码,通过编程器将这个代码烧写(Program,也有编程、烧录、下崽(误)等说法)到单片机的Flash存储器中,作为我们的代码段保存在单片机里。

下图是一款stm32单片机的总线矩阵(Bus matrix)框图。在框图的右边,我们可以看到Flash Memory块,连接了一个Accel(读取加速单元)之后,有2条总线连接到总线矩阵上,分别为:

  • ICODE – Instruction(指令)
  • DCODE – Data(数据)
  • 我没有详细看ARM架构,不过字面意思是这样…如果有错请来打我(

通过总线互联矩阵(Bus Matrix-S),Flash的引出线被连接到ARM Cortex-M4内核(CPU)上,同时还可以连接到其他地方比如RAM、DMA控制器、FSMC控制器等。当然,所有的这一切都是在芯片内部的电路和连线来完成的。

stm32 matrix

单片机的工作流程是这样de:

  1. 单片机在上电/复位时,会执行一段 Bootloader 代码(一般存储在芯片的片上ROM里,且是厂家生产时就烧录好的,不可更改),这段代码的作用就是 选择从哪种代码存储介质来启动单片机。一般默认是从Flash存储器直接运行~
  2. 执行完Bootloader代码之后,CPU从Flash的特定地址单元开始,逐个地把我们编写的程序翻译成的机器代码指令读取出来,送入CPU去执行(当然会放入RAM作缓存),读取的指令通过ICODE总线来传输,如果在执行的过程中需要访问存储在Flash中的常量,那么读取的数据可以通过DCODE总线来传输至CPU。
  3. SRAM(Static RAM)用来存放CPU执行过程中需要用到的变量或数据,它可以高速地与CPU进行数据交换,但是其中的数据在单片机电源断开后不会保留。
  4. 总的来说,CPU从代码存储区逐条读取需要执行的机器指令,如果遇到死循环结构将会重复执行这其中的代码(比如while(1))

至于什么是指令(Instruction)…这里不详细讲啦 你可以理解为军官给士兵下发的命令~
可以看看万维百科:指令集架构

当然,不同单片机的架构不一样,内联结构也会有所不同,但运行的流程是大同小异的。

5.3->代码如何下载到单片机上?

我们需要对应单片机的下崽器

常见的单片机以及它们的下载器大概是这样的…

  • 51/AVR单片机: USB转串口下载器/USB ASP/USB ISP等
  • STM32等ARM架构单片机: ST-LINK/J-LINK/CMSIS DAP等
  • MSP430: ti官方下载器
  • ……

一般买官方的开发板/评估板,板子上是会自带下载器的…
如果是用最小系统板,那么我们需要一个对应单片机的下载器来为单片机编程。具体就不展开咯~

5.4->我想学Arduino & STM32。

看完了以上的所有内容,恭喜你,你已经是个成熟的工程师了,该自己做开发啦!( bushi )

当然,我们也为你准备了一些Arduino和STM32的上手系列教程,可以看看这里:

电子入门教程[01]—我的代码流成了灯

[Bonjour STM32] No.0-美味可口的STM32 CookNote

6->软硬结合->一些实际项目

学了这么多理论不动动手真是浪费了= =
那么我们如何开始工程师之路呢?🐟的推荐如下:

  1. 第一步是做一些例程,熟悉单片机的外围电路、片上外设、GPIO、各种通信协议和编译调试过程(虽然Arduino不能调试… 2022年,Arduino IDE 2.0大版本发布了,好像支持调试了?)
  2. 第二步是在例程的基础上做些二次开发。比如点亮一个OLED屏幕之后,你可以自己在OLED上自定义显示一些内容,和其他功能做一些简单的交互,这是你发挥想象力的时刻~
  3. 做完了Creative Works,你就可以开始做些有趣的事情了。你可以浏览如下 开源社区(Open Source Community),去寻找一些别人的创意(当然主要是嫖代码和电路图),然后自己试着做一做。
  4. 如果你成功地复刻了一些开源项目,那你就可以放飞自我,在EE的世界里自由探索了~

毕竟我们并不是一下子就能学会所有东西的。EE之路道阻且长,当你真正深入这个领域之后你会发现不懂的会越来越多。所以请不要放弃学习啊~

6.1 当然,还有本站的…

我也做过一些有趣(好吧可能不是那么有趣…)的项目,可供你参考:

7->项目管理方法

8->一些有用的工程设计常识

9->核心->解决问题的思路与方法

这一节是一点方法论了。每个人的经历与技术水平都不一样,我也就只能主观地、以我的视角去说说一些解决实际问题的思路与方法。
如果你不认同我的观点,或者有更好的想要补充的话,欢迎在评论区/QQ群 理性讨论~

9.1->情景复现

我就拿我自己做过的一个项目举例子吧——

9.2->EVMeter

这是一个为没有电子测光系统的胶片单反相机设计的电子测光表,要求能够设置光圈、快门、ISO、曝光补偿4个参数中的3个,然后算出剩下的那一个未被设定的参数。

项目的地址在这里

9.2.1->需求分析

首先我们要测量 光照强度,那么肯定是要一个光强传感器。
其次我们需要设计 曝光算法,那么我们需要去学习这方面相关的内容,也就是需要去搜集一些这方面的资料。
如果要制作安装在相机的热靴上的mini装置,我们需要考虑制作合适的 机械外壳,以及采用 电池供电

好了,这些是比较宏观的分析(自顶向下),已经大致完成了。具体的细节待我们进入第二阶段再探究。

9.2.2->关键器件选型与相关技术调研

在这一步我们需要做的就是如标题所示。

首先我们需要选择一个 光强传感器。打开淘宝搜索 光强传感器,可以搜到一大堆诸如"BH1750"、"TCS34725"、"TSL2591"等型号的传感器模组,说明这些型号是 电子diy界最常用的。这意味着什么呢?这意味着这些型号的传感器极有可能是这个类型元器件中 性价比最高、相关开发资料最多、别人写好的代码最多的型号。所以如果你想降低开发难度,可以优先考虑这3种。

当然,在我现在的应用场景,我需要尽可能地评估各种传感器的关键性能是否能满足我的设计需求。

通过查阅这些传感器的 数据手册(datasheet),我得到了如下对比:

型号 接口类型 动态范围 技术特点 工作功耗 价格 综合性能
TSL2591 I2C 600000000:1 接近人眼动态范围、可编程增益与积分时间、工频陷波 300uA 挺贵 牛逼
TCS34725 I2C 3800000:1 4通道(RGBC),可分别测量三原色和总光强、可编程增益与积分时间 300uA 适中 还不错,可以顺便测色温,但是动态范围菜了点
BH1750 I2C 约1000000:1 工频陷波、红外滤镜 190uA 便宜 便宜但弟弟

基于如上,很难抉择。当然,如果找不到合适的型号,就需要去各大半导体厂商官网去搜索相关产品了,纠结的我就去ti官网查找了一下,找到了一款 opt3001,性能与价格都折中的传感器,最终选择了OPT3001+TCS34725的结构(双传感器,同时可以测色温。)

选定了传感器,我们就需要开始调研一下曝光算法了。

首先我们可以在互联网上搜索一下有没有人之前做过相关的项目,如果有的话直接嫖来用岂不美哉(bushi)
如果没有的话,那我们就需要自力更生了——

首先我们去 万维百科(当然我是用wiki的)查找一下 "曝光值"的定义,顺便了解了各个参数对相机曝光的影响以及背后的原理。(嗯…因为我玩摄影所以我之前了解过这方面的知识)

然后我们找到了几个比较关键的公式——

曝光值是一个以2为底的对数刻度系统:

E_v = \log_2 {N^2 \over t}

在给定照明条件下所采用的F值与曝光时间由下式给出:

{N^2 \over t} = {LS \over K}

其中:

  • N是相对光圈(F值)
  • t是曝光时间,单位秒(s)
  • L是场景平均辉度(就是平均亮度)
  • S是ISO指数
  • K是反射式测光表校正常数

代入等式右边,得到曝光值:

E_v = \log_2{LS \over K}

同样也可以由入射式测光结果计算拍摄参数:

{N^2 \over t} = {ES \over C}

其中:

  • E是照度
  • C是入射式测光表校正常数
    当然也有:
E_v = log_2{ES \over C}

这里就不全盘托出了,可以看我 之前的文章

9.2.3->理论验证与测试

千万不要以为我们可以开始开干了~
我们在开始工作之前需要验证一下这套系统的可行性。首先我在电脑上用C实现了上述曝光算法,具体可以看上面我放的以前文章链接。简单来说就是先写完了曝光算法,然后自己编造一组测试数据去验证算法的正确性与可行性。

算法验证通过,接下来开始验证硬件功能。

如果OPT3001有现成的传感器模块的话,我就会买一个来用面包板连线并写驱动代码对其进行调试,看看这传感器能不能跟我的单片机配合起来工作。但是没有现成的卖(悲)。所以我只能画个板子去验证功能(因为这东西的封装不允许我用面包板调试.jpg)

具体可以看我的另一篇文章 EVMeter-石剑篇

最后的结果当然是验证通过~

9.2.4->原型开发

现在就可以试着做做原型机了。做完之后再次重复测试各项功能是否满足设计需求,如果不满足的话就需要进行细节修订,然后remake(

这里的测试包括硬件功能测试、软件算法测试,以及需要根据传感器的特性去调整一个补偿系数,可以对照着相机去适当修改,也可以使用标准的照度计去调整。

当然,我是有单片机外围开发经验的,所以我略过了单片机选型以及外围选型的步骤,直接完成了这部分。如果碰到自己不太熟悉的技术,也一定要做好调研和验证测试!

9.2.5->总结归纳

做完了就完了么?多数情况是这样。
但是我还是建议你养成良好的习惯,将项目用到的相关的资料和工程文件收集整理一下。(当然这一步可以在项目进行中同步完成)。

这样做的好处如下:

  1. 方便整理工程文件,自己看着也赏心悦目。
  2. 方便分享给他人,也可以作为项目经历封存起来。
  3. 以后的项目如果要用到相关的技术可以很清晰地回过头来直接找到资料

当然,由于我的懒惰,我现在还没有把这个项目的相关文件完全上传到Github上。(orz)

9.3->灵活机动

当然,做工程就像生活一样,并不总是一帆风顺的。有时候会遇到预期之外的bug或者是不可抗力,导致我们的脚步受阻。遇到这种情况该怎么办?

比如EVMeter那个项目吧。我做了一半发现——全球芯片都涨价了(因为新冠疫情的连锁反应…),之前的OPT3001我只需要花3块钱就能买到,现在需要花50块钱!(抢钱啊!!)

我总不可能当个傻子让那些囤芯片的奸商赚大钱。。到此为止我只能更换方案,解决方法就是直接换传感器,微调一下原PCB,然后重新写传感器的驱动程序。

10->进阶->向更高层进发!

Change Log

  • 2021.9.11 将部分图片由路过图床转存至阿里云oss,增加地线详细介绍,小细节变更
  • 2021.9.20 根据学弟的反馈建议,添加了教程链接,小细节变更
  • 2021.9.21 增加第7节,小细节变更+补充
    • 嗯,顺便心血来潮写了一部分第9节。
  • 2021.10.17 增加电流的概念,增加其他单片机介绍,细节补充
    • 顺便把Bonjour STM32的内容部分移植过来了,增加了 如何提问 章节
  • 2022.2.8 小细节修正,修复部分图片缩放问题
  • 2022.8.12 修改部分目录结构,导出V1.1 pdf版本
  • 2023.10.12 修改部分内容,增加项目管理方法和工程常识(标题)

如果觉得本文对你有帮助/启发,不妨请我们喝杯蜜雪冰城~(赞助支持支付宝/微信,每篇文章的末尾都有)

发表回复