如何在设计中使用Arduino的模拟功能
扫描二维码
随时随地手机看文章
Arduino 秉承让数字技术轻松地运用到现实应用中这一理念,推出 Arduino 硬件平台,以实现将大多数模拟功能植入 Atmel 多功能 ATmega 8 位 MCU 系列。 在 Arduino 平台上使用的所有 ATmega 变体均有一个片载多通道模数转换器 (ADC)。 该 ADC 具有 10 位分辨率,能以 0 到 1023 的整数方式实现高达每秒 15,000 次的采样速率。 大多数 AVR MCU 支持 6 个模拟输入通道,而一些变体则可支持 8 和 16 个输入。 尽管模拟引脚的主要功能是读取模拟输入,但也可配置成数字式通用输入/输出 (GPIO) 引脚。 可根据需要为模拟引脚配备可选择上拉电阻器,且采用与 MCU 数字引脚相同的上拉配置方法。
虽然一些 AVR MCU 采用了数模转换器 (DAC),但在现有的这一代 Arduino 板上的 MCU 系列均能通过快速转换其数字 I/O 引脚来产生脉宽调制 (PWM) 信号,以提供模拟输出。 每个 PWM 输出的 490 Hz(大约)方波的占空比经过编程后,能提供一个大小为 0 至 5 V、周期为 256 毫秒、增量为 2 毫秒的等效 RMS 电压(图 1)。 Arduino 的输出功能尽管在某种程度上受到一定限制,但可执行如驱动 LED 或控制电机等许多任务。
图 1:利用脉宽调制 (PWM) 技术, Arduino 的数字 GPIO 引脚可用作模拟输出(感谢 Arduino.cc 提供数据)。
通过板边缘的母头引脚连接器,大多数 Arduino 板能轻松连接 MCU 的模拟(和数字)I/O 信号。 模拟通道数及其物理引脚分配会随正在使用的特定 MCU 以及板的外形发生变化,但许多变体还是遵循常见的“官方”设计所采用的引脚布局惯例,如 Uno(图 2)、Mega 和 Nano。
图 2:Arduino Uno 板(第 3 版)的模拟输入 (A0-A5) 和模拟 PWM 输出(数字式:3、5、6、9、10 和 11)) 可通过板边缘的标准针座引脚进行物理连接(感谢 Arduino.cc 提供数据)。
因为 Arduino IDE 支持的编程语言中含有一组原生模拟 I/O 命令,因此采用模拟 I/O 功能开发代码也易于进行。 通过这些指令可读取模拟输入、生成模拟 (PWM) 输出以及配置 A/D 转换器的基准电压。
读取模拟输入
我们能轻而易举地将 Arduino 的模拟输入与实际应用连接,但需要为 AVR 的 A/D 转换器选择合适的基准电压源。 此时,可以用默认 (DEFAULT)、内部 (INTERNAL) 或者外部 (EXTERNAL) 基准电压来确定输入电压上限。 默认模式下,MCU 采用板载电源稳压器的输出作为基准电压。 根据所使用的特定 Arduino 板,基准电压可以是 5 V 或者 3.3 V。
在内部模式下,采用 AVR 的片载精密基准电压源。 器件不同,基准源电压也不同,但通常为 1.1 V(适用于 ATmega168 或 ATmega328)或者 2.56 V(在 ATmega8 和 Mega 系列中)。 在外部模式下,您可用一个 5K 电阻器将一个外部基准电压连接至 AREF 引脚。 AREF 引脚内置一个 32K 保护电阻器,与 5K 外部电阻器一起作为分压器。 所以,如果通过该外部电阻器施加 2.5 V 电压,就会在 AREF 引脚上产生一个约为 2.2 V 的电压,具体计算为 2.5 * 32 / (32 + 5) = 2.2 V。
利用 Aegunio 编程语言读取模拟电压时,需用 analogReference(type) 命令选择基准电压源,然后引用一个 analogRead(pin) 读数命令,其中,(pin) 表示您希望采样的针座引脚编号。 基准电压一旦选定,基准类型便不再改变,除非进行另外编程。 虽然 AVR MCU 能支持高达每秒 15k 次采样的转换率,但 Arduino 的软硬件环境通常将其限制在每秒 10k 次采样左右。
构建 PWM 模拟输出
在某一个 Arduino PWM 引脚上生成模拟电压的具体做法是,用 pinMode(pin, mode) 命令将该引脚配置成输出引脚,然后引用一个 analogWrite(pin, value) 命令,其中,(pin) 表示您希望用于输出的针座引脚,(value) 表示将要产生的基准电压的一部分(增量为 1/255)。 配置完成后,该引脚将连续产生一个具有规定占空比的 490 Hz 稳定方波,直至收到下一个 analogWrite() 请求(或者针对该引脚发出的一个 digitalRead() 或 digitalWrite() 请求)。
这些 I/O 引脚支持高达 40 mA 驱动电流,因此可直接驱动中型 LED 阵列。 对于功率较高的照明或者直流电机,模拟输出可用于驱动功率晶体管或桥式电路。 对于要求更苛刻的应用,这种输出可通过简单的 R/C 网络滤波,且可用作放大器或者电流源的控制电压。
更多的模拟技巧
一些 AVR MCU(包括 MEGA8 和 MEGA168)内置了比较器,能将一个输入电压与另一个外部输入进行比较,如与某个 PWM 输出产生的电压或者基准器件的内部基准电压比较。 比较器的电压可以被轮询或者用于触发一个中断。 尽管涉及了更多的软件, 但中断驱动式排列能让处理器直接检测欠压和过压条件,无需再对模拟通道进行重复采样。 对于从可调阈值的运动探测器、冲击传感器到生物医学监视的每一种应用,这都是一项非常方便的功能。
对于 MCU 无内置比较器的 Arduino 板,可相对容易地在一些 Arduino 板上的 “Kluge” 区域添加一个外部器件,如 LM741、LM339N 或 TLC3704。 如您的板子上没有用户电路安装空间,则可通过一块价格低廉的原型设计扩展卡添加用户电路(图 3)。
图 3:利用原型设计扩展卡,您能方便地将自己的模拟或者数字 I/O 添加到几乎任何一块标准的 Arduino 板上。
总结
Arduino 器件凭借自身的低成本、多功能优势,在商业硬件开发人员中培养了一批忠实拥趸。 Arduino 硬件平台旨在将大多数模拟能力植入 Atmel 的 ATmega 8 位 MCU 系列中。 这些 MCU 的所有变体均有一个片载多通道模数转换器 (ADC)。 本文旨在介绍 Arduino 模拟功能的基本软硬件资源组成,为能够用这些功能完成未来设计的工程师们提供一个新起点。 为此,我们讨论了如何读取模拟输入、构建 PWAM 模拟输出和添加外部模拟 I/O。