ADC分辨率

转载:http://www.rationmcu.com/elecjc/1874.html

 

 

今天给大家简单介绍一下ADC器件的常识。

ADC,模数转换器,功能是把模拟电压转换成数字量。

概念听的模糊,说点实际的吧:把你要测的电压那条线,连接到ADC的用来测试电压的引脚上,ADC模块就会检测到这个电压,并且自动转换成一个数字,我们读出这个数字,然后知道这个数字和电压的对应关系,就可以知道现在的电压是多大了。

有些单片机内部有ADC模块,在单片机外部引出测试用的ADC引脚。

有些单片机内部没有ADC模块,可以用单独的ADC芯片,单独的ADC芯片一般留有与单片机通信的接口,常见的是8位并口、I2C口、SPI口。单片机通过通信接口与外部ADC模块连接读取ADC芯片的转化值。

分辨率

不管是单片机内部的ADC,还是独立的ADC芯片,都有一个分辨率指标。

一般的分辨率有8位、10位、12位、16位、24位。

先要知道,位就是bit,就是计算机界是最小的单位,8个位是1个字节。

8位数字,最大值就是255,范围从0~255。

10位数字,最大值就是1023,范围从0~1023。

12位数字,最大值就是4095,范围从0~4095。

14位数字,最大值就是16383,范围从0~16383。

16位数字,最大值就是65535,范围从0~65535。

24位数字,最大值就是16777215,范围从0~16777215。

为什么“位”可以表示分辨率?

假设一个我们要测一个0~5V的电压信号。

用8位分辨率的ADC测,输入电压是0V时,得到的数字是0,输入电压是5V时,得到的数字是255。

用12位分辨率的ADC测,输入电压是0V时,得到的数字是0,输入电压是5V时,得到的数字是4095。

8位的ADC,得到的数字每增加1,实际上电压增加5/256=0.0195V。

16位的ADC,得到的数字每增加1,实际上电压增加5/4096=0.0012V。

假设,现在要测一个0.015V的电压,8位的ADC得到的数字,就是1,当你得到1的时候,只能认为是1*5/256=0.0195V的电压。

那如果用12位的ADC测0.015V的电压的话,得到的数字就是12或者13,如果是12的话,我们转化一下,就会认为是12*5/4096=0.0147V,如果得到的数字是13的话,我们转一下,就会认为是13*5/4095=0.0159V。

对比一下数字,就可以看出来,位数越高的分辨率,就可以测得更精确的电压。

转载于:https://www.cnblogs.com/conglinlixian/p/9858215.html

### Arduino ADC 分辨率规格及其配置方法 Arduino 的模数转换器 (ADC) 是其核心功能之一,用于将模拟信号转化为数字信号以便进一步处理。不同型号的 Arduino 板具有不同的 ADC 分辨率和特性。 #### 不同型号的 Arduino ADC 分辨率 - **Arduino Uno**: 提供 10 位分辨率ADC 功能,能够将输入电压范围(通常为 0 至 5V 或者 0 至 3.3V)映射到一个介于 0 到 1023 的整数值范围内[^1]。 - **ESP8266**: 同样支持 10 位分辨率,因此它的输出范围同样是 0 到 1023。 - **ESP32**: 默认提供更高的 12 位分辨率,这意味着它可以将相同的电压范围分解得更细,对应的是 0 到 4095 的整数值区间。 - **RP2040-based boards**: 使用 `analogRead` 函数默认情况下也提供了较高的分辨率,具体取决于硬件实现以及软件中的配置选项[^3]。 #### 配置 ADC 分辨率的方法 虽然某些开发板如 ESP32 支持更高分辨率,但并不是所有的 Arduino 开发环境都自动启用这些高级特性。对于标准的 Arduino IDE 而言: - 对于基于 AVR 微控制器的设备(例如 Arduino Uno),分辨率固定为 10 位,无法通过简单的命令更改此设置。 - 如果使用的是较新的微控制器平台比如 ESP32,则可以通过修改特定寄存器或者利用库函数来调整 ADC 的工作模式与分辨率。例如,在 ESP-IDF 中存在 API 可以设定分辨率为 9/10/11/12 bits 等多种选择。 以下是针对不同类型处理器如何获取并显示 ADC 数据的一个通用例子: ```cpp #define adPin A0 void setup() { Serial.begin(115200); } void loop() { int sensorValue = analogRead(adPin); // Read the value from pin A0. float voltage = sensorValue * (5.0 / 1023.0); // Convert reading into volts assuming Vref=5V. Serial.print("Analog Reading: "); Serial.println(sensorValue); Serial.print("Voltage: "); Serial.println(voltage, 2); // Print with two decimal places precision delay(1000); // Wait a second before next sample. } ``` 上述代码片段展示了基本的操作流程:初始化串口通信;周期性地从指定引脚读取数据并通过计算得出实际对应的电压值[^2][^3]。 需要注意的是,当涉及到外部电源供电情况下的测量时,请务必确认所使用的参考电压(VREF),因为它直接影响最终换算出来的物理量大小。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值