在本篇文章中,我们将一起探讨 Arduino Uno R3 中模拟输入的工作原理,并学习如何使用 Arduino Uno R3 来读取和处理模拟数据。
Arduino 简介:
Arduino 是一个开源电子平台。它基于 ATmega328P 8位微控制器构建。它能够读取来自各种传感器的输入信号,并且我们可以向 Arduino 上的微控制器发送指令来控制硬件。它提供了 Arduino IDE(集成开发环境)用于编写代码,以及连接 Arduino 开发板和传感器等硬件设备。
Arduino 的模拟引脚:
Arduino 拥有 6 个模拟通道,用于读取 0 到 5 伏特的模拟信号。每个通道都有一个独立的模拟引脚。ATmega328P 微控制器内部集成了一个分辨率为 10 位的模数转换器。需要注意的是,Arduino 上的模拟引脚只能读取模拟输入,它们无法输出或还原模拟电压。
引脚
—
A0
A1
A2
A3
A4
A5### ADC 的分辨率:
数字数据是以 0 或 1 (低电平或高电平)的形式存在的。每一个位都有两种可能的组合状态。如果分辨率是 N 位,那么二进制的组合数将是 2 的 N 次方。
> 分辨率 = ( 2^N ) – 1
在 10 位 ADC 的情况下,
10 位 ADC 的分辨率是 ( 2^10 )-1= 1024 – 1 = 1023。数字值是一个从零开始的索引。所以其数值范围是 0 到 1023。
电压范围:
ADC 的电压范围随参考电压的变化而变化。参考电压是指使用 ADC 可以测量的最大电压。参考值可以根据需求或制造商的设定进行调整。
然而,我们无法更改 Arduino Uno R3 的参考电压,它被固定为 5 伏特。
因此,Arduino R3 (ATmega328P) 内置 ADC 的电压测量范围是 0 到 5V。
模数转换:
> 公式: 数字值 = ( 输入电压 / 参考电压) * 分辨率
计算示例:
如果模拟输入电压为 2.8 伏特,那么在 10 位 分辨率下的数字值计算如下。
> 数字值 = ( 2.8 / 5 ) * 1023 = 573 (约等于)
同理,
当输入为 0 伏特时,数字值为 0,
当输入为 5 伏特时,数字值为 1023。
所需元件:
- Arduino Uno R3
- 信号源 ( 0 到 5 V )
- 跳线
电路图:
!image模拟引脚电路图
注意: 这里使用函数发生器仅用于演示说明。你可以提供 0 到 5 伏特之间的任何电压,将模拟信号转换为数字值。
函数发生器:
函数发生器是一种测试设备,用于产生不同的波形,如方波、三角波、正弦波等。
设置步骤:
- 将信号源连接到任意一个模拟通道,例如 A0。
- 将信号源的接地端连接到 GND 引脚。
- 将代码上传到 Arduino。
- 在 9600 波特率 下监控串口输出。
注意:接地非常重要。如果信号源是电池,请将电池的负极连接到 GND。如果信号源自任何电路,请将该电路的接地端连接到 Arduino 的 GND。
语法:
analogRead(channel);
// analogRead 函数返回模拟输入信号的数字值。
// 它有 6 个通道 ( 0 到 5 )
// 示例:analogRead(0); // 选择的通道是 A0
Arduino 代码:
C++
void setup()
{
Serial.begin(9600); // 串口监视器波特率设置为 9600
}
void loop()
{
int digitalValue
= analogRead(0); // 选择通道 0 (A0)
Serial.print(
"Digital value: "); // 在串口监视器打印文本
Serial.println(
digitalValue); // 在串口监视器打印数字值
// ( 范围 0 到 1023 )
}
输出结果:
我们将 正弦波 作为输入信号。其峰峰值电压为 5 伏特。正弦波的本质是交流电(AC),包含负电压部分( 2.5 到 -2.5 )。因此,我们将偏置电压设定为 2.5V (半个周期的电压)。这会在不改变正弦波形状的情况下,将整个波形提升至正电压侧。这样,正弦波的电压变化范围就变成了 0 到 5 伏特(峰峰值)。
数字值的增减变化是由于正弦波输入引起的。
注意: 输出结果会根据输入到模拟引脚的电压而变化。使用函数发生器仅为了方便理解原理。
输出分析:
为了使用串口绘图器绘制波形,我们从代码中移除了 "Digital value: " 文本。
输出值已在串口绘图器中绘制出来。获得的数字值形成了一个与输入相似的正弦波。作为正弦函数,输出值在 0 到 1023 之间变化。
ADC 的应用:
- 数