使用arduino的自动量程欧姆表。

这篇文章是关于一个简单的自动测距欧姆计使用arduino。测量的电阻使用16×2液晶显示器显示。该电路具有足够的精度,并且尽可能使用最少数量的外部元件。在深入这个项目的细节之前,我们先来看看基本的电阻测量方法。

电阻测量。

电阻测量

上图显示了一个简单电阻测量方案的电路图。Rx是要测量的电阻。R1是输入电阻。i是通过回路的电流,5V是电源电压。为了找到未知电阻Rx,首先测量Rx两端的电压。让R1两端的电压为VR1。那么VR1=5-Vx。电流i=VR1/R1=(5-Vx)/R1。由于R1和Rx串联连接,通过它们的电流将相等。所以未知电阻Rx=Vx/i。使用arduino的ADC测量未知电阻上的电压。准确地说,是模拟通道A5。

无论如何,这种方法有一个缺点。如果输入电阻和Rx之间存在很大差异,结果将极不准确。这是因为几乎所有的输入电压都会在较大的电阻上下降,这提供的信息非常少。

  • 设R1=10K, Rx=100欧姆。那么R1上的电压将是4.95v, Rx上的电压将是50mV,这给出的信息较少。arduino的灵敏度为4.889mV。因此,当我们使用arduino ADC读取50mV时,结果将是10。当转换成电压时,结果将是10 x 4.889mV =48.89mV。那么Rx= 0.0488/((5V-48.89mV)/10000) = 98.7欧姆。
  • 设R1=10, Rx=220欧姆。R1上的电压为4.89V, Rx上的电压为107mV。相应的数字读数为21。当我们把它转换成电压时,结果将是21 x 4.889mV=102mv。按照前面的计算,Rx=208欧姆。

在上述两种情况下,您可以看到准确性问题。最准确的结果发生在Rx和R1尽可能接近的时候。

自动测距。

我们在这里需要的是一种粗略估计Rx值,然后用匹配电阻代替R1的方案,这种方法称为自动测距。下面给出的电路演示了自动测距。

阿杜伊诺电阻计电阻R1到R7是输入电阻。在这种方案中,一个电阻的自由端保持高电平,其他电阻的自由端保持低电平。测量通过未知电阻Rx的电压。二极管D1至D7用于防止电流向低端回流。假设R1的自由端保持低。如果R1和Rx相等,那么Rx的电压降将是(5-0.7)/2 = 2.15,其中0.7是二极管降。如果Rx上的电压小于或等于2.15,我们可以假设Rx小于或等于220欧姆。输入电阻最接近的可能值是220欧姆,因此这个回路被考虑进行计算。如果不满足上述条件,则对后续的输入电阻重复上述步骤,直到得到解。

线路图。

欧姆计使用arduinoarduino自动测距欧姆表的全电路图如图所示。arduino的数字引脚1、6、7、8、9、10、13分别开关输入电阻R1、R2、R3、R4、R5、R6、R7。电阻D1至D7用于防止电流回流通过相应的路径。D8是电源ON指示灯LED。POT R10用于LCD的对比度调节。电阻R9限制背光LED电流。

程序。

# include < LiquidCrystal.h > int vin = A5;int t = 1;int u = 6;int v = 7;int w = 8;int x = 9;int y = 10;int z = 13;int在;int盟; int av; int aw; int ax; int ay; int az; int a; double vx; float rx; double i; LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup() { pinMode(vin,INPUT); lcd.begin(16,2); pinMode(t,OUTPUT); pinMode(u,OUTPUT); pinMode(v,OUTPUT); pinMode(w,OUTPUT); pinMode(x,OUTPUT); pinMode(y,OUTPUT); pinMode(z,OUTPUT); digitalWrite(t,LOW); digitalWrite(u,LOW); digitalWrite(v,LOW); digitalWrite(w,LOW); digitalWrite(x,LOW); digitalWrite(y,LOW); digitalWrite(z,LOW); } void loop() { digitalWrite(t,HIGH); digitalWrite(u,LOW); digitalWrite(v,LOW); digitalWrite(w,LOW); digitalWrite(x,LOW); digitalWrite(y,LOW); digitalWrite(z,LOW); delay(100); at=analogRead(vin); digitalWrite(t,LOW); digitalWrite(u,HIGH); digitalWrite(v,LOW); digitalWrite(w,LOW); digitalWrite(x,LOW); digitalWrite(y,LOW); digitalWrite(z,LOW); delay(100); au=analogRead(vin); digitalWrite(t,LOW); digitalWrite(u,LOW); digitalWrite(v,HIGH); digitalWrite(w,LOW); digitalWrite(x,LOW); digitalWrite(y,LOW); digitalWrite(z,LOW); delay(100); av=analogRead(vin); digitalWrite(t,LOW); digitalWrite(u,LOW); digitalWrite(v,LOW); digitalWrite(w,HIGH); digitalWrite(x,LOW); digitalWrite(y,LOW); digitalWrite(z,LOW); delay(100); aw=analogRead(vin); digitalWrite(t,LOW); digitalWrite(u,LOW); digitalWrite(v,LOW); digitalWrite(w,LOW); digitalWrite(x,HIGH); digitalWrite(y,LOW); digitalWrite(z,LOW); delay(100); ax=analogRead(vin); digitalWrite(t,LOW); digitalWrite(u,LOW); digitalWrite(v,LOW); digitalWrite(w,LOW); digitalWrite(x,LOW); digitalWrite(y,HIGH); digitalWrite(z,LOW); delay(100); ay=analogRead(vin); digitalWrite(t,LOW); digitalWrite(u,LOW); digitalWrite(v,LOW); digitalWrite(w,LOW); digitalWrite(x,LOW); digitalWrite(y,LOW); digitalWrite(z,HIGH); delay(100); az=analogRead(vin); if(az>=450) { vx=az*0.00489; i=(5-vx-0.55)/22000; rx=(vx/i); } if(ay>=450 && az<450) { vx=ay*0.00489; i=(5-vx-0.55)/10000; rx=(vx/i); } if(ax>=448 && ay<448 && az<448) { vx=ax*0.00489; i=(5-vx-0.55)/4700; rx=(vx/i); } if(aw>=439 && ax<439 && ay<439 && az<439) { vx=aw*0.00489; i=(5-vx-0.55)/2200; rx=(vx/i); } if(av>=439 && aw<439 && ax<439 && ay<439 && az<439) { vx=av*0.00489; i=(4.8-vx-0.55)/1000; rx=(vx/i); } if(au>=430 && av<430 && aw<430 && ax<430 && ay<430 && az<430) { vx=au*0.00489; i=(4.5-vx-0.55)/560; rx=(vx/i); } if(at>=430 && au<430 && av<430 && aw<430 && ax<430 && ay<430 && az<430 ) { vx=at*0.00489; i=(4.5-vx-0.55)/220; rx=(vx/i); } if(at<430 && au<430 && av<430 && aw<430 && ax<430 && ay<430 && az<430 ) { vx=at*0.00489; i=(4.5-vx-0.55)/220; rx=(vx/i); } lcd.setCursor(0,0); if(vx>4.8) { lcd.clear(); lcd.setCursor(0,0); lcd.print("----INFINITY----"); } else { if(rx<1000) { lcd.clear(); lcd.setCursor(0,0); lcd.print(rx); lcd.setCursor(7,0); lcd.print((char)244); } else { lcd.clear(); rx=rx/1000; lcd.setCursor(0,0); lcd.print(rx); lcd.setCursor(6,0); lcd.print("k"); lcd.print((char)244); } } lcd.setCursor(0,1); lcd.print("Arduino Ohmmeter"); }

作者

15评论

  1. 彼得(Gernany)

    很好的记录。在我的ARDUINO MEGA 2560上进行第一次尝试时,程序就可以正常运行
    自动范围是一个非常有用的功能,提供从10R到100k的可用R值。
    强烈建议您尝试一下。

  2. D.古德蒙森

    不幸的是,没有粘贴所有的代码。这里是:

    Int at, au av aw ax ay az a;
    双vx,我;
    浮动的处方;

    无效设置()

    Serial.begin (9600);

    pinMode(2,输出);数字写入(2,低);
    pinMode(3,输出);数字写入(3,低);
    pinMode(4、输出);digitalWrite(4、低);
    pinMode(5、输出);digitalWrite(低);
    pinMode(6、输出);digitalWrite(6、低);
    pinMode(7,输出);数字写入(7,低);
    pinMode(8、输出);digitalWrite(8、低);

    无效循环()

    对于(int lp=2;lp=450)

    vx=az*0.00489;
    我= (5 - vx - 0.55) / 22000;
    rx=(vx/i);

    如果(ay>=450&&az=448&&ay<448&&az=439&&ay<439&&az=439&&az<439&&ax<439&&ay<439&&ay<439&&az=430&&ax<430&&ay<430&&az=430&&ay<430&&az<430&&az<430)

    vx = 0.00489 *;
    我= (4.5 vx - 0.55) / 220;
    rx=(vx/i);

    if(at<430 && au<430 && av<430 && aw<430 && ax<430 && ay<430 && az4.8)?//只发送原始电阻数据

    • 莫希特·库马尔

      我做过与你提到的项目,这个项目的网站,但不能能够测量1 k电阻要完全改变,我需要在评论中提到的代码,否则我不得不提到的部分的代码添加注释与代码中提到的网站。期待比q更快的回复。

  3. D.古德蒙森

    万一有人感兴趣。我已经重写了这段代码,所以它更精简,它使用串行输出而不是LCD显示。我喜欢这个项目。我将在工作中制作的几个系统中使用它来测试pogo引脚是否在正确的位置接触电路板。比替代品便宜得多。此代码也仅发送未加“K”的原始电阻数据。我之所以这么做是因为我正在与一个我正在开发的C#项目进行交互。我希望有人能从中得到帮助。这是代码。从210行下降到98行。

    Int at, au av aw ax ay az a;
    双vx,我;
    浮动的处方;

    无效设置()

    Serial.begin (9600);

    pinMode(2,输出);数字写入(2,低);
    pinMode(3,输出);数字写入(3,低);
    pinMode(4、输出);digitalWrite(4、低);
    pinMode(5、输出);digitalWrite(低);
    pinMode(6、输出);digitalWrite(6、低);
    pinMode(7,输出);数字写入(7,低);
    pinMode(8、输出);digitalWrite(8、低);

    无效循环()

    对于(int lp=2;lp=450)

    vx=az*0.00489;
    我= (5 - vx - 0.55) / 22000;
    rx=(vx/i);

    如果(ay>=450&&az=448&&ay<448&&az=439&&ay<439&&az=439&&az<439&&ax<439&&ay<439&&ay<439&&az=430&&ax<430&&ay<430&&az=430&&ay<430&&az<430&&az<430)

    vx = 0.00489 *;
    我= (4.5 vx - 0.55) / 220;
    rx=(vx/i);

    if(at<430 && au<430 && av<430 && aw<430 && ax<430 && ay<430 && az4.8)?//只发送原始电阻数据

  4. sutfuf

    示意图缺少二极管阴极至A5(针脚28)的导线。

    • praveen

      是的,那是个错误。我已经修改了电路图。

      当做
      管理

  5. 艾蒂安哈梅林

    二极管的偏置电压可能会随着电流(即测量电阻)和温度的变化而略有变化,甚至在几个二极管之间可能会有不同的值(即使是同一品牌的二极管),这将限制可达到的精度。
    为什么不去掉那些二极管,把“未使用”的引脚置于hi-Z状态(=输入模式)呢?
    您的数据表应该为您提供hi-Z状态下最小引脚阻抗的估计值,以便您可以计算出通过hi-Z引脚的电流泄漏量(当您测量@Vcc/2时,我怀疑很少)。

  6. 安德烈亚斯

    你好,

    我认为电路图中缺少vin (A5)

    最好的
    安德烈亚斯

  7. 伊凡

    我需要测量从0.05欧姆到10欧姆的电阻,是否可以在不破坏微电阻的情况下将220欧姆的电阻改变为2.2欧姆?

    • Husmen Ketum

      数字输出引脚的最大电流为40毫安。这样5V/0.04A=125欧姆是绝对最小的。的问候。

  8. Eric Raymond

    谢谢你,信息是正确的,很有帮助

Baidu