本帖最后由 小恶魔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
#define BV 0.0048875855327468
  • 复制代码

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

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

  • }
  • 复制代码


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

  • 复制代码

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

  • }

  • voidloop() {
  •   v = analogRead(A0);
  •   lv = v * BV*2;           
  •   Serial.println(lv);
  • }


  • 复制代码

    ⑥实验现象
    image.png