Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使Arduino中模拟管脚的读数更精确?_Arduino_Floating Accuracy - Fatal编程技术网

如何使Arduino中模拟管脚的读数更精确?

如何使Arduino中模拟管脚的读数更精确?,arduino,floating-accuracy,Arduino,Floating Accuracy,我是新来的,所以,如果我弄错了,对不起。嗯,我正在与Arduino(Mega2560)合作制作一个电流表,并发现了一个小问题。。。Arduino Mega测量0到5V之间的电压,模拟引脚根据读数返回10位值(即,1位表示5/(2^10)=4mV(大约))。但是,在安培计的情况下,我需要使用电阻小的电阻器,这样我的电路就不会发生变化。所以我的目标是读取电压降,从V=R.I,计算电流。但是,由于电压降非常缓慢,引脚无法读取任何值。 在我想测量的区域有一个电流从2mA流出。如果电阻为0.3欧姆(我在这

我是新来的,所以,如果我弄错了,对不起。嗯,我正在与Arduino(Mega2560)合作制作一个电流表,并发现了一个小问题。。。Arduino Mega测量0到5V之间的电压,模拟引脚根据读数返回10位值(即,1位表示5/(2^10)=4mV(大约))。但是,在安培计的情况下,我需要使用电阻小的电阻器,这样我的电路就不会发生变化。所以我的目标是读取电压降,从V=R.I,计算电流。但是,由于电压降非常缓慢,引脚无法读取任何值。 在我想测量的区域有一个电流从2mA流出。如果电阻为0.3欧姆(我在这里找到的较低值),则为:V=2m。0.3=0.6mV。 正如我所说的,在模拟管脚中读数的较低可能值为4mV。 那么,如何提高我的阅读精度呢?例如,与1023仅表示5V不同,相同的值表示约30或40mV。。。 0-0伏
1023-30/40 mV

您可以使用1.1V内部电压基准,或更精确的外部电压基准(这可以通过
模拟参考
进行归档)。顺便说一句,在电流如此小的情况下,使用更大的电阻器会更方便


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

在下面的示例中,
电压表
在大约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);
}
int-battery_-pin=A3;
浮子电压表()
{
//读取每%的蓄电池电压
long sum=0;//采集的样本总数
浮动电压=0.0;//计算电压
浮点输出=0.0;//输出值
对于(int i=0;i<500;i++)
{
总和+=模拟读数(电池\ U引脚);
延迟微秒(1000);
}
//计算电压
电压=总和/(浮点数)500;
//电压=(电压*5.0)/1023.0;//默认参考电压
电压=(电压*1.1)/1023.0;//用于内部1.1v参考电压
//按两个精度舍入值
电压=roundf(电压*100)/100;
返回电压;
}
无效设置()
{
模拟参考(内部);//将参考电压设置为内部
Serial.begin(9600);
}
void循环()
{
串行打印(“电压电平:”);
串行打印(电压表(),4);
序列号。打印号(“V”);
延迟(1000);
}

读取500毫秒平均电压读数如何?如何?我不明白。首先,如果你的最大电压太小,你需要把它提高,然后创建一个函数,在大约几秒钟内读取一个大样本(例如1000),然后从中得到一个平均值。这将给你最好的结果,你可以从模拟输入。是的,我明白你的意思。但是我怎么能从哪里读到这么大的样本呢?这在我的脑海里没有意义,哈哈,我投票结束这个问题,因为这是关于Arduino硬件和接口的问题,关于类比参考的问题,最好的答案是因为它改变了所有管脚的参考。我真正的项目是建造万用表。因此,如果我更改引用,我会遇到一些问题。我在其他测量(电压表、欧姆表等)方面得到了很好的结果。有没有办法只改变一个引脚的参考?谢谢您的回答。您可以在度量值设置为默认值之前和之后更改它。但在每次切换到引用稳定后,您必须等待一段时间。带增益的差分输入可能会更好,但不能使用模拟读取,因为它只支持单端输入。哇,我明白了!非常感谢你的回答,我还没想过呢!!