如何更精确地读取Arduino中的AnalogPins?

时间:2019-05-26 18:17:11

标签: arduino floating-accuracy

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

2 个答案:

答案 0 :(得分:0)

您可以使用1.1V内部参考电压,或者使用更精确的外部参考电压(可以通过analogReference进行归档)。 BTW电流这么小,使用更大的电阻会更方便。

或者,忘记analogRead的有限功能,直接执行。例如2.56V基准电压源,具有10倍或200倍增益的差分输入(但您会得到-512到511-> 2.56 / 512的范围)。

答案 1 :(得分:0)

在下面的示例中,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);
}