0°

使用简单的Arduino测量电容值

正如您可能在这篇文章中所读到的,电容是能量存储能力的一种度量。它们尤其用于整流器,旁路设备和模拟滤波器电路中。

它们是非常重要的组件,对于确保应用程序和其他组件正常工作至关重要。

但是,您如何测量这个非常重要的“大小”(“电容”)

时间常数与电路

时间常数定义为系统从阶跃输入达到给定状态所花费的时间。

在这种情况下,我们希望找到“ C ”,并且只有电容器和电阻器(串联)的电路具有已知的时间响应。

那我们就可以利用!

因此,要测量电容器的电容,我们可以通过一个已知的电阻对其进行充电,并测量其达到充电电压的〜63,2%所需的时间!

电路非常简单:

  • 被测电容器与已知电阻(此处为10 k Ohm)串联连接。
  • 电容器电路连接到Arduino的引脚7。
  • 电容器还连接到Arduino上的模拟输入以测量电压(A0)。

程序

进行此测量的固件将进行3次测量,取平均值,然后打印出打印在串行(USB)上的最终答案。

流程如下:

  1. Arduino通过将引脚7设置为低电平来使电容器电路放电。通过读取电容器上的电压来确保电容器为空。
  2. 它开始为电容器电路充电并启动计时器。
  3. 它持续充电直到电容器达到3,16伏(5 V的〜63,2%)。
  4. 当电路达到3.16伏时,它会保存累积的时间值,如果执行的次数少于3次,则会返回到1。
  5. 最终答案是所有测量值的平均值,结果将打印在串行端口上!
#define NO_MEASSUREMENTS 3

#define analog_pin     A0
#define capacitor_pin  7

#define resistor_value   989000.0F // the value on the resistor in Ohms

unsigned long start_time = 0;
unsigned long accumulated_time = 0;

void setup() {
  pinMode(capacitor_pin, OUTPUT);

  Serial.begin(115200);
}

void loop() {

  accumulated_time = 0;

  for(uint8_t i = 0; i < NO_MEASSUREMENTS; i++){

    // Make sure the capacitor is dicharged
    digitalWrite(capacitor_pin, LOW);
    while(analogRead(analog_pin) > 0){}
    
    // set chargePin HIGH and capacitor charging an
    digitalWrite(capacitor_pin, HIGH);
    start_time = micros();
  
    // 647 is 63.2% of 1023, which corresponds to full-scale voltage
    while(analogRead(analog_pin) <= 647){}  
    accumulated_time += (micros() - start_time);  
  }  

  float result_time = ((float) accumulated_time) / NO_MEASSUREMENTS;

  float micro_F = ( result_time / resistor_value) * 1000;

  Serial.print((long)result_time);
  Serial.print(" us before tau / ");
  
  print_float(micro_F, 2);
  Serial.println(" uF");
}


// from Peter H. Anderson, Baltimore, MD
void print_float(float f, int num_digits)
{
  int pows_of_ten[4] = {1, 10, 100, 1000};
  int multiplier, whole, fract, d, n;
  
  multiplier = pows_of_ten[num_digits];
  
  if (f < 0.0){
    f = -f;
    Serial.print("-");
  }
  
  whole = (int) f;
  fract = (int) (multiplier * (f - (float)whole));
  
  Serial.print(whole);
  Serial.print(",");

  // print each digit with no leading zero suppression
  for (n=num_digits-1; n>=0; n--){
   d = fract / pows_of_ten[n];
   Serial.print(d);
   fract = fract % pows_of_ten[n];
  }
}

这是从串行监视器出来的:

105404 us before tau / 106,57 uF

(被测电容器被称为100 uF“大”。这种差异可能是由许多不同的原因造成的。其中包括:不正确的时序,ADC(不准确)精度,电源不精确度,当然:所称电容与实际电容之差制造商)。

结论

正如我们在这里看到的:您可以使用简单的数学“键”来测量电容,该“键”存在于时间,电阻和电容之间,并且电路简单而便宜。

但是请注意,这需要一些“升级”(尤其是在硬件方面),才能成为“高精度”测量设备。

 

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论