本帖最后由 小恶魔owo 于 2024-11-20 00:18 编辑

(一)简介

在实际的电路中,电压值往往不是精确的整数值,而是带有无限不循环小数的模拟值。然而,计算机无法直接处理这样的模拟值,因此需要将它们转换为数字值。Arduino Uno通过内置的ADC来实现这一转换。

Arduino UNO有5个模拟引脚,A0-A5


ADC的工作原理
  • 电压范围:Arduino Uno的ADC可以读取0到5V范围内的电压。
  • 分辨率:Arduino Uno的ADC具有10位的分辨率,这意味着它可以将0到5V的电压范围分成1024(2^10)个等份。因此,每个等份代表的电压值为5V/1024。
  • 转换过程:当模拟电压施加到Arduino Uno的模拟引脚上时,ADC会读取该电压值,并将其转换为最接近的等分值。例如,如果电压为3V,则ADC会将其转换为最接近的整数值,即614(3V/5V×1024≈614.4,取整为614)。
串联电阻
  • Arduino Uno的模拟输入引脚具有固定的参考电压(通常为5V或3.3V,取决于开发板的供电电压),并且其ADC(模数转换器)具有固定的分辨率(通常为10位,即能够区分0到1023之间的值)。
  • 如果待测电压超过了Arduino模拟输入的参考电压,或者待测电压范围过大,直接使用可能会导致测量不准确或损坏开发板。此时,通过串联一个或多个电阻来分压,可以将待测电压降低到适合Arduino测量的范围内。


(二) 程序
image.png
①Arduino Uno的模拟输入范围(5V)被ADC(模数转换器)分成1023个单位后,每个单位对应的电压值
5/1024=0.0048875855327468
  1. #define BV 0.0048875855327468

②定义变量
  1. int v;                          //定义analog所测得的数字(1~1023)
  2. double lv;                 //定义所测电阻的电压
  3. int RR = 2; //电阻数量

③初始化函数
启用串口,波特率为9600
将A0端口设置为输入模式
  1. void setup() {
  2.   Serial.begin(9600);
  3.   pinMode(A0,INPUT);

  4. }


④循环函数
读取A0端口的模拟量,保存到变量v内
变量v再乘上每份ADC的电压BV,将结果保存到lv内
串口打印变量lv的值
  1. voidloop() {
  2.   v = analogRead(A0);
  3.   lv = v * BV*2;           
  4.   Serial.println(lv);
  5. }


⑤程序
  1. #defineBV0.0048875855327468   //analog将5V分成了1023个单位——5/1023
  2. int v;                          //定义analog所测得的数字(1~1023)
  3. double lv;                 //定义所测电阻的电压
  4. int RR = 2; //电阻数量
  5. voidsetup() {
  6.   Serial.begin(9600);
  7.   pinMode(A0,INPUT);

  8. }

  9. voidloop() {
  10.   v = analogRead(A0);
  11.   lv = v * BV*2;           
  12.   Serial.println(lv);
  13. }



⑥实验现象
image.png