网上找到一个用arduino测量电容的程序,可是看不懂,求解..-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 791|回复: 3

[未解决] 网上找到一个用arduino测量电容的程序,可是看不懂,求解..

[复制链接]
发表于 2022-4-7 17:22 | 显示全部楼层 |阅读模式
网上找到一个用arduino测量电容的程序,可是看不懂,求解是什么原理!!!

const int OUT_PIN =A2;

const int IN_PIN = A0;

const float IN_STRAY_CAP_TO_GND = 24.48;//?

const float IN_CAP_TO_GND  = IN_STRAY_CAP_TO_GND; //?

const float R_PULLUP =34.8;  //?

const int MAX_ADC_VALUE = 1023;



void setup()

{

  pinMode(OUT_PIN, OUTPUT);

  pinMode(IN_PIN, OUTPUT);

  Serial.begin(9600);

}



void loop()

{

    pinMode(IN_PIN, INPUT);

    digitalWrite(OUT_PIN, HIGH);

    int val = analogRead(IN_PIN);

    digitalWrite(OUT_PIN, LOW);



    if (val < 1000)//?

    {

      pinMode(IN_PIN, OUTPUT);



      float capacitance = (float)val *IN_CAP_TO_GND / (float)(MAX_ADC_VALUE - val);



      Serial.print(F("Capacitance Value ="));

      Serial.print(capacitance, 3);

      Serial.print(F(" pF ("));

      Serial.print(val);

      Serial.println(F(") "));

    }

    else

    {

      pinMode(IN_PIN, OUTPUT);

      delay(1);

      pinMode(OUT_PIN, INPUT_PULLUP);

      unsigned long u1 = micros();

      unsigned long t;

      int digVal;



      do

      {

        digVal = digitalRead(OUT_PIN);

        unsigned long u2 = micros();

        t = u2 > u1 ? u2 - u1 : u1 - u2;

      } while ((digVal < 1) && (t< 400000L));



      pinMode(OUT_PIN, INPUT);

      val = analogRead(OUT_PIN);

      digitalWrite(IN_PIN, HIGH);

      int dischargeTime = (int)(t / 1000L) * 5;

      delay(dischargeTime);  

      pinMode(OUT_PIN, OUTPUT);

      digitalWrite(OUT_PIN, LOW);

      digitalWrite(IN_PIN, LOW);



      float capacitance = -(float)t / R_PULLUP

                              / log(1.0 -(float)val / (float)MAX_ADC_VALUE);



      Serial.print(F("Capacitance Value ="));

      if (capacitance > 1000.0)

      {

        Serial.print(capacitance / 1000.0, 2);

        Serial.print(F(" uF"));

      }

      else

      {

        Serial.print(capacitance, 2);

        Serial.print(F(" nF"));

      }



      Serial.print(F(" ("));

      Serial.print(digVal == 1 ?F("Normal") : F("HighVal"));

      Serial.print(F(", t= "));

      Serial.print(t);

      Serial.print(F(" us, ADC= "));

      Serial.print(val);

      Serial.println(F(")"));

    }

    while (millis() % 1000 != 0);   

}






发表于 2022-4-7 18:05 | 显示全部楼层
看我的帖子,原理一样的:

https://www.arduino.cn/thread-83505-1-1.html
 楼主| 发表于 2022-4-8 00:24 | 显示全部楼层
t3486784401 发表于 2022-4-7 18:05
看我的帖子,原理一样的:

https://www.arduino.cn/thread-83505-1-1.html

巧了大佬,我正在看你的贴子哈哈哈哈
 楼主| 发表于 2022-4-10 00:44 | 显示全部楼层
本帖最后由 lbwnb666 于 2022-4-10 00:47 编辑
lbwnb666 发表于 2022-4-8 00:24
巧了大佬,我正在看你的贴子哈哈哈哈

屏幕截图 2022-04-10 004645.jpg

屏幕截图 2022-04-10 004659.jpg

你好!!

我仿真了一下,发现47u的电容测到这么大
芯片和晶振都是16MHz
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 09:48 , Processed in 0.074708 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表