【问题标题】:How to make more precise the reading of AnalogPins in Arduino?如何更精确地读取 Arduino 中的模拟引脚?
【发布时间】:2019-10-12 10:44:44
【问题描述】:

我是新来的,如有错误,请见谅。好吧,我正在与 Arduino (Mega2560) 合作构建电流表并发现了一个小问题...... Arduino Mega 测量从 0 到 5V 的电压,AnalogPins 根据读数返回一个 10 位值(即1 位代表 5/(2^10)=4mV(大约))。但是,在电流表的情况下,我需要使用电阻小的电阻,这样我的电路就不会发生变化。所以我的目标是读取电压降并从 V = R.I 计算电流。但是,由于电压下降如此缓慢,引脚无法读取任何值。 例如:在我想测量的区域中有一个 2mA 的电流。电阻为 0.3 欧姆(我在这里找到的较低值)将是:V = 2m。 0.3 = 0.6mV。 正如我所说,analogPins 中读取的可能下限值是 4mV。 那么,如何提高我的阅读精度呢?例如,不是 1023 仅代表 5V,而是相同的值代表 30 或 40mV 左右... 0 - 0 伏 1023 - 30/40 毫伏

【问题讨论】:

  • 读取 500 毫秒的平均电压怎么样?
  • 怎么样?我不明白。
  • 首先,如果您的最大电压太小,您需要提高它,然后创建一个函数,在大约几秒钟内读取一个大样本(例如 1000),然后从中获取平均值。这将为您提供从模拟输入中获得的最佳结果。
  • 是的,我明白你的意思。但我怎么能读到这么大的样本,从哪里读?这在我的脑海中没有意义哈哈
  • 我投票结束这个问题,因为它是关于 Arduino 硬件和接口,在arduino.stackexchange.com 上问得最好

标签: arduino floating-accuracy


【解决方案1】:

您可以使用 1.1V 内部电压基准,或更精确的外部电压基准(这可以通过analogReference 归档)。顺便说一句,电流这么小,使用更大的电阻会更方便。

或者,忘记analogRead 的有限功能并直接执行此操作。例如 2.56V 基准,具有 10 倍或 200 倍增益的差分输入(但您将获得 -512 至 511 -> 2.56/512 的范围)。

【讨论】:

  • analogReference 的问题是因为它改变了所有引脚的引用。我真正的项目是构建一个万用表。因此,如果我更改参考,我会遇到一些问题。我用其他测量(电压表、欧姆表等)得到了很好的结果。有一种方法可以仅更改一个引脚的参考吗?谢谢你的回答。
  • 您可以在测量前更改它,测量后设置默认值。但是你必须在每次切换到参考稳定后等待一段时间。带增益的差分输入会更好,但您不能使用模拟读取,因为它仅支持单端输入。
  • 哇,我明白了!非常感谢您的回答,我没有考虑过这个!
【解决方案2】:

在下面的示例中,voltage_meter 在大约 1 毫秒内读取 500 个样本并返回平均值。我将引用设置为 1.1v 以获得更好的精度。

int battery_pin = A3;

float voltage_meter()
{
    //read battery voltage per %
    long sum = 0;        // sum of samples taken
    float voltage = 0.0; // calculated voltage
    float output = 0.0;  //output value

    for (int i = 0; i < 500; i++)
    {
        sum += analogRead(battery_pin);
        delayMicroseconds(1000);
    }
    // calculate the voltage
    voltage = sum / (float)500;
    // voltage = (voltage * 5.0) / 1023.0; //for default reference voltage
    voltage = (voltage * 1.1) / 1023.0; //for internal 1.1v reference
    //round value by two precision
    voltage = roundf(voltage * 100) / 100;
    return voltage;
}

void setup()
{
    analogReference(INTERNAL); //set reference voltage to internal
    Serial.begin(9600);
}

void loop()
{
    Serial.print("Voltage Level: ");
    Serial.print(voltage_meter(), 4);
    Serial.println(" V");
    delay(1000);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-26
    • 1970-01-01
    • 1970-01-01
    • 2019-09-04
    相关资源
    最近更新 更多