大概了解了ArduinoUNO开发板的基本结构后,我们来深入介绍ArduinoUNO开发板的电路组成,图1-9所示为ArduinoUNO开发板的电路原理图。
图1-9 Arduino组成电路图(Arduino UNO Rev3)
1.处理器电路
1)处理器
Arduino主要以2个芯片为主,第1个是Atmel公司生产的Atmega8系列单片机,较新的版本为Atmega328(或atmega32U4),旧版有AtmegA8和Atmega168。这几个单片机的架构都一样,只是内存大小不同而已。当然,价线上也有所差异,因此在商品化的过程中就要考虑内存的大小,选择适合的系列。
由表1-2可以看到,差异比较大的是FLASH部分。
表1-2 Atmega系列单片机内存空间比较
2)处理器功耗
Atmega328和Atmega2560都只能承受最大6V的输入电压。根据Atmel的器件手册,甚至只是接近这个最大电压时,芯片的运作都“可能影响可靠性”。正常的供电电压是1.8~5.5V。较低的电压会降低最大可以工作的时钟速度。
AVR消耗的功率主要取决于CPU的工作频率。时钟频率越高,电流消耗越大。16MHz的正常模式(Active Mode)中,Atmega328需要5.0V上的10mA(0.010A)电流,也就是1/20W;空闲模式(Idle Mode)下,只要不到2.5mA(0.0025A),而掉电模式(Power-down Mode)就不到1μA(0.000001A)了。
Arduino Mega2560上用的大芯片 AtmelAVR Atmega2560只比较小的 ATMega328在5V/16MHz时的耗电多一倍;20mA(0.020A)。它的待机电流小于6mA(0.006A),而掉电模式在室温或接近室温下不到1μA(0.000001A),温度升高到85℃时耗电提高到3μA。
时钟速度和其他影响功耗的选项,如看门狗定时器和掉电检测机制,是通过芯片的配置熔丝来设置的。这些选项不能通过软件来控制,需要专门的芯片编程器来改变。
当芯片被设置为睡眠和停机时进入省电模式(待机和掉电)。这两种模式的区别是,在空闲模式下,片内外围设备仍然正常运作,可以通过产生中断把处理器带离睡眠状态;而掉电模式下为了达到它的低功耗,会关闭外围设备。
3)I/O驱动
两种芯片的每个I/O引脚都可以扇出(source)或灌入(sink)最多40mA(0.040A)的电流。这足以与大多数外部电路衔接了。包括点亮几个 LED,但是不足以驱动哪怕是小型的电机、风扇或电磁阀等大功率负载,线圈电阻超过125Ω的5V继电器可以直接驱动,但是需要在线圈上并接一个反向二极管以防止磁场衰落时(当继电器线圈掉电时)产生对芯片有害的逆向电压。
注意:要记住所有I/O的总电流是200mA(0.2A),所以不可能同时在所有I/O线上输出40mA。
4)复位信号
在Arduino上,AVR的重启信号连接到多个元件上,来自串口的DTR信号通过一个100nF(0.1μF)的电容耦合到重启线上。这颗电容使得信号电平的变化可以触发芯片的重启,同时避免串口线上的电平始终使芯片在重启不运作状态。在重启线和+5V之间接了一颗10kΩ的上拉电阻,以防止偶尔的电噪声误触发重启电路。一个人工重启按钮也可以把重启线短路到地,引起芯片重启。
重启信号还连接到电源扩展插座和在线串行编程(ICSP)插座。
5)时钟
AVR 接一个石英晶体或一个陶瓷谐振器来提供稳定和精确的时间基准。根据元件的不同,还需要一些其他的分立元件。石英晶体一般需要容量很小的负载电容接在两个引脚和地之间。这些电容给振荡电路在起振时提供足够的负载,其容量一般只有几皮法(常见的是22pF),而且PCB上信号走线产生的容抗通常足够保证运行的稳定。
陶瓷谐振器一般需要高阻值的电阻(常见1MΩ或更高)跨在两个引脚上,以稳定其工作,降低不需要的谐波。
6)去耦电容
ArduinoUno 有单个100nF(0.1μF)去耦电容C6,安装的位置靠近处理器芯片,用于过滤电源总线上由处理器芯片本身产生的噪声,也给芯片提供一个微型电源缓冲,芯片的功耗在不同的时钟周期会有波动并产生尖峰。
Arduino Mega2560有3个类似的去耦电容C4、C5和C6,也在比较靠近Atmea2560芯片的地方,其功用是相同的。
Arduino Uno和Arduino Mega2560在模拟参考电压(AREF)和地之间都有一个100nF(0.1μF)的电容,以稳定给模拟数字转换电路(ADC)外围设备使用的模拟参考电压。
7)指示灯
Arduino Uno和Arduino Mega2560都有一个专门的LED,接在D13(Arduino Umo的PB5和Arduino Mega2560的PB7)上,通过一个1kΩ的电阻接到地上。这个LED又叫做可编程LED,它的功能是由软件决定的;与其相反,绿色的LED指示灯只要电路板有电就会亮。USB接口芯片上还接了TA RC的LED来表示串口上的动作。
2.供电电路
最早的Arduino I/O电路板有非常简单的电源电路。虽然简单,但这个电路具有很多功能,可以接稳压或不稳压电源,可以把电源供应给插到扩展插座上的任何盾板(Shield)。图1-10所示为最初的Arduino Serial电路图电源部分。
图1-10 最初的Arduino Serial电路图电源部分
1)电源插座
图1-10中左边没有标记的方块是用于DC(Direct Current,直流)输入的柱式电源插座。这个符号的外形类似于柱式电源插座本身的侧视图,不过引脚排列和实际排列并不一致。在Arduino Serial和现在Arduino Uno的电路图上用的符号是一样的,不过都没有正确反映厂家的引脚编号和实体连接器本身,也不是业界标准的符号。
连到柱式电源插座的两条线(连到电路图上的标着1和3脚的)连到地上。电源插座本身没有标识极性,由电路设计者负责安排极性并画在图上。
柱式电源插座在圆形开口的中央有一根针,其直径应该是2.1mm,开口的内径是5.5mm。在开口的底部有一个弹簧端子,当插头插入时顶住插头外围。这两个端子实现与插头的电感和物理连接。在开口底部还有一个端子,当没有插头插入时和前面说的弹簧端子接触,当插入时与之断开。这个端子可以用来在插入或拨出插头时将电源在内部电源和外部电源之间做切换。Arduino没有用这个端子。
柱式电源插座是非常常用的低压直流电源插座,很多厂家都在生产。随着厂家和型号的不同,插座可以承受16~24V的电压,通过2.5~4.0A的电流。当需要向外部电路供电时,需要考虑这些参数。
迄今为止,所有Arduino产品在外形设计上都保留了这个柱式电源插座。
2)电源输入电路
柱式电源插座上的第二个脚是电源正极,直接连到DI的正极,DI在这里所起的作用是整流器。整流器允许电流按一个方向流动,阻止另一个方向上的流动。DI 的作用是在接错了输入电源的极性时,完全阻止电流流动。这是个很棒的产品安全特性,事半而功倍。
二极管的电路图符号像个箭头,这有助于读者辨别它允许或期望电流流动的方向。在实际元件上,负极端往往印着一条线,以帮助在装配时对准正确极性。不过,它标识的是人们平时说的电流方向,与实际的电子流动方向正好相反。电子(在铜线这样的金属中的载荷子)带的是负电荷,实际上是从负极向正极流动的。
输入端的整流器DI在最初的图纸上标的是IN4004,是很多厂家都生产的一种1.0A(最大)的整二极管。IN4004是编号从IN4001~IN4007这一大类相似的三极管中的一种。不同型号编号的区别主要是最大直流反向电压(VR),从IN4001的50V到IN4007的1000V。IN4004是400V的。
400V 的反向电压对于这个应用程序来说是绰绰有余的,但许多这样的设计决定是基于元件的可靠性和成本的,而不是刚刚好就行。厂家生产的产品种类非常丰富,价格、供货能力和关键参数都有很多可选。考虑到电源插座已经决定了最高输入电压,这个系列的任何一种二极管都可以胜任。
现在的ArduinoUno在这个位置上放的是一颗贴片的IN4007(型号是M7)。
既然装了这个反向保护二极管DI,就得考虑它的最大1.0A电流这个限制因素。Arduino的电路只用1安培(A)的很少部分,但是加上外接电路,总的电流消耗不能超过1.0A 的限制,否则DI会过热直至失效,很可能会导致燃烧,有时候可能冒烟,甚至起火,那气味可不好闻。
如果由其他来源供电,如 USB 接口或其他插座,柱式电源插座和反向保护二极管 DI的限制就被跳过了。DI的整流器特性还防止了电源通过柱式电源插座输送给外部。
DI 的负极连接到电路中好几处。注意,图上有一个显式连接点,表示这里几条线实际在电路原理上是连接在一起的。从这个连接点往上,然后向右折的线是到电压总线VIN(即输入电压总线)的连接。在最初的Arduino Serial上,这条线只连到另外一个地方;在电源扩展插座上也标着 VIN 的那个脚。这个连接使得未稳压的输入电压可以供给扩展盾板。另外,它也可以使外部未稳压的电源输入给 Arduino 板,绕过柱式电源插座和反向保护二极管DI。
在后来的Arduino电路板上,VIN信号还用来帮助决定选择使用哪个电源来给电路板供电。这涉及到更多的电路原理。
在二极管之后,电源信号连接到两个不同类型的电容,即C6和C5。尽管两个电容的符号是类似的(两个分开的平板,简明地描述了电容的构造),但它们有一个微小但是重要的区别:C6是有极性的电解电容,正极在电路图上标了一个小加号(“+”)。有趣的是,实际电容元件上一般在负极上做记号。反之,C5是无极性的,无论哪边朝哪个方向都可以安装到电路板上。把C6装反会使元件失效,可能导致电容膨胀,甚至使外壳裂开。
C6和C5这两个电容构成一个滤波器,就像一个小型电荷水库,过滤掉从电源输入进来的电噪声。
C6标着100u,实际的意思是100μF(微法,小写的希腊字母μ在所有的计算机辅助设计——CAD——软件里都比较难输入,所以一般用英文字母μ代替)。
C5标着100n,意思是100nF(纳法),美国出的图纸上的标法是0.1μF。
电路图上没有标的是两个电容的最大工作电压,这是电容的极限参数。若给电容施加的电压超过标称的工作电压,则会损坏电容,最终使其内部的电解质(在电容内部隔离两个金属层的材料)绝缘失效。工作电压越低,电容就可以做得越小,精明的设计工程师会指定选择元件的耐压值刚好高过电路安全的要求,又足够低,以避免占用过多的空间或增加成本,一般电解电容的工作电压范围是4~50V。在Arduino Uno上起这个作用的两个电容PCI和PC2标着47μF/25V。
3)稳压器
现在该把输入进来的电压稳定后提供给Arduino电路的其他部分使用了。IC2是一个三脚固定正电压稳压器芯片。在最初的电路图上没有给出型号编号。因为最初的Arduino是靠口耳相传,是由每个个人在制作电路板时根据自己的需求、可用资源判断决定要用什么元件的。
这个地方常用的是LM7805固定正电压稳压器。这个芯片在业余爱好者里被广泛使用。尽管国半(美国国家半导体公司)已经不再生产它了,很多其他厂家还在做。国半提供了它的详细器件手册:www.national.com/ds/LM/LM7512C.pdf。
这个元件有几种固定电压输出,包括5V、12V和15V。5V的LM7805至少需要7V输入才能保证稳定的5V输出。电流额定值为在有正确散热条件下可略超过1A。
最初的 Arduino 文档推荐输入电压为7~12V。这种精神面貌型的稳压器叫做线性稳压器,因为输入的电压直接通过元件,超过的电压要以热的形式耗散掉,因此当输入电压提高或输出电流消耗提高时,这个热会产生一些问题。
对于TO-220封装来说(LM7805还有更大的TO-3的封装),热阻(thermal resistance,半导体结到环境的热阻)是50℃/W。对于最小7V输入,只有0.5A电流使用的情况,这就要算到1W(7V-5V=2V,2V×0.5A=1W)的能量耗散了,也就是使芯片上的温度比周围环境高50℃,这就很热了!大幅提高输入电压或输出电流,就会使芯片进入热关闭的自我保护,直到温度回归合理程度。
稳压器的输出应该是5V,误差是5%,也就是4.75~5.25V之间。5V输出连到另一个滤波电容C7。C7和C6是一样的,是一个标着100μF的有极性的电解电容,且其功能也相同,就是滤掉来自电源的瞬变和毛刺。在最初的Arduino Serial上,+5V的电源总线接到电源扩展插座(标着+5V的脚),使稳压的电源可以供给附加电路。+5V的总线还直接给Atmega8单片机和RS-232/TTL电平转换电路供电,后面再详加叙述。
电路图上还可以看到稳压的5V 连接了作为电源指示的 LED1。一个220Ω的限流电阻R2串在回路中,以控制流经这个LED的电流。只要Arduino有电,这个LED就会一直亮着。
如果外面有稳压的+5V电源,Arduino也可以直接由电源扩展插座的+5V脚供电。
4)电源电路的演变
现在的Arduino Uno和ArduinoAmega2560的电源输入和调整电路与它们的前辈基本上是相同的。Arduino Uno把100nF电容从稳压器的输入端移到了输出端,而Arduino Mega2560没有做这个改动。
型号发展过程中有一些有趣的事情。看下Uno或Mega2560的电路图,上面的电路里有两个5V稳压器。这是为了在PCB上能够放多个元件封装而采取的技术,最终只会有一个稳压器实际焊在 PCB 上。为了防止混淆,可以给两个元件定相同的编号,但是使用不同的后缀。比如,如果直插和贴片两种封装的电阻都画在了图上,可以把一个标为R1A,另一个标为R1B。如果生产时某种封装的元件没有,则可以直接用另一种封装来替换,而不需要修改PCB或返工。相同的技术也用在了ArduinoUnoSMD的贴片Atmega328处理器芯片上。
当USB接口引入,换掉老的RS-232接口时,人们对电源电路做了更多变动。USB标准让接口在通信的同时可以提供有限的、经过整流的电力给设备。USB 插座直接取稳压的5V供给整个电路。第一个USB型号需要自己正确地插好跳线来连接电源部分,后续的型号用了一个模拟比较器和一个低阻抗金属氧化物半导体场效应管(MOSFET)开关来智能地选择最高可用的电压。另外,在USB电源转接头接了一个500mA自恢复熔断器,以避免Arduino或外接电路的故障对主机PC造成任何损害。自恢复熔断器通常有非常低的电阻,可以通过500mA(0.5A)的电流。如果流过的电流超过这个值,熔断器就会变热,增加其内部阻值,从而降低能够流过它的电流。一旦电流降下来,熔断器就凉下来,从而其内部的阻值就降下来了。要注意的是,这个过程不可能无限重复,因为熔断器的热应力最终会失效。
最早几个本的USB电路板用了一个FTDIUSB接口芯片,里面有一个3.3~5V的稳压器。这个稳压器可以给其他电路提供最高50mA电流的3.3V电源。低于5V的电压正越来越流行,因为电子设备需要更低的功率消耗。
Arduino Uno和Arduino Mega2560去掉了FTDIUSB接口芯片,换成另一个AVR单片机,专门用来做USB通信。它们还在电路板上加了单独一个3.3V稳压芯片,以替换掉USB接口芯片里的稳压器功能。国半的LP2985低压差稳压器可以在3.3V上提供最高150mA的电流,是之前的3倍。
从图1-11可以看出,Arduino电源部分的前端,这么多年没有大的变化,图1-11是Arduino Mega2560的部分电路图,ArduinoUno把C2从IC2的输入移到了输出,其他地方和图1-11中的电路是一样的。
图1-11 Arduino Mega2560的电源部分
电源LED指示灯没有出现在图1-11中,它现在的限流电阻(RN3C)是1kΩ。没有用分离(独立)的电阻,现在的Arduino用了排阻(Resistor Network),里面有几个相同的电阻。这样就更易于自动装配,只需要安装一个元件,而不是一堆元件。
图1-12画出了新增的电源电路,包括智能电压选择电路和3.3V稳压器。自恢复熔断器没有画在图上,它包含在从USB插座来的USBVCC电源总线上。
图1-12 时新Arduino中新增的电源电路
3.USB接口
正如第一代 Arduino I/O 板用了 RS-232插座和附属电路来和这个世界通话,现在的Arduino用上了流行的USB接口。USB接口是一个工业标准,由USB实施者论坛公司(USB Implementers Forum)维护。USB 规范和其他与 USB 标准相关的信息可以在 USB 官网中找到。
从RS-232到USB的转变恐怕是不可避免的,多数现在的PC和笔记本电脑都把一度流行的RS-232接口换成了更小的USB端口。有USB到RS-232适配器可以把老的Arduino硬件和新的PC连起来。
从ArduinoUno和ArduinoMega2560开始,USB接口由另一个AtmelAVR芯片Atmeg8U2提供。它有内置的全速USB外围设备,而Atmega328和Atmeg2560没有。