[UNO]

Arduino电容测量计

[复制链接]
815|0
手机看帖
扫描二维码
随时随地手机跟帖
51zx笔记|  楼主 | 2022-3-4 20:34 | 显示全部楼层 |阅读模式
#申请原创# ## [Arduino电容测量计](https://www.tinkercad.com/things/hv1gukwqWlK-)
点击[Arduino电容测量计](https://www.tinkercad.com/things/hv1gukwqWlK-)在线仿真

### **定义**

**电容**被定义为身体存储电荷的能力。电容的单位是法拉(符号:F),以英国物理学家迈克尔·法拉第的名字命名。1 法拉电容器在充电时具有 1 库仑的电荷,其板之间的电位差为 1 伏。

### **电容测量**

每个Arduino电容计都依赖于电容器的相同基本特性 - **时间常数**。电容器的时间常数定义为**电容器两端的电压在充满电时达到其电压的63.2%所需的时间**。较大的电容器需要更长的时间来充电,因此具有较大的时间常数。Arduino可以测量电容,因为电容器充电所需的时间与其电容直接相关:

TC = R * C

- TC 是电容器的时间常数(以秒为单位)。
- R是电路的电阻(以欧姆为单位)。
- C是电容器的电容(以法拉为单位)1uf = .0000001法拉= 10^-6法拉。
- 示例:1 兆欧 * 1 微法拉 = 1 秒
- 示例:10k 欧姆 * 100 微法拉 = 1 秒
![在这里插入图片描述](https://img-blog.csdnimg.cn/2f5cde2dc1ba4b2a865c78bf65732c25.png)



### 电容测量代码算法

1. 将放电引脚设置为 INPUT(因此无法对电容器放电)
2. 将充电引脚设置为输出并使其为高电平
3. 用 *millis()* 记录开始时间
4. 在环路中反复检查电压,直到达到总电压的63.2%。
5. 电容充电后,从开始时间中减去电流时间,以了解电容器充电所花费的时间。
6. **将时间T(以秒为单位)除以以欧姆为单位的充电电阻R,得到电容C。**
7. 在串行监视器上*打印*该值。
8. 对电容器放电。为此,请执行以下操作:
9. 将充电引脚设置为输入
10. 将放电引脚设置为输出并使其低电平
11. 读取电压以确保电容器完全放电
12. 循环并再次执行

### **电容测量电路**

![使用 RC 定时进行电容测量](https://img-blog.csdnimg.cn/img_convert/98fb258782878c4260d208ce8f16d539.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/a16c65f0019544519f030fe911d654b3.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA54Wk54Kt55qE5aWH5aaZ5ryC5rWB,size_16,color_FFFFFF,t_70,g_se,x_16)
### 电容测量电路

![阿杜伊诺电容测量电路](https://img-blog.csdnimg.cn/img_convert/0035517d39e628cf98d64d9f6bbaab91.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/842bf70c1b194710929581a627399987.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA54Wk54Kt55qE5aWH5aaZ5ryC5rWB,size_20,color_FFFFFF,t_70,g_se,x_16)



## **用于电容测量的 Arduino 代码**



```c
/*电容测量
一个电容器通过一个电阻,在一个时间常数内充电,定义为T秒,其中
* c = r * c
* TC =以秒为单位的时间常数周期
* R =电阻(欧姆)
* C =电容,单位为法拉(1微法拉(ufd) = .0000001法拉= 10^-6法拉)

*电容器在一个时间常数的电压定义为充电电压的63.2%。
*/

#define analogPin      0          // analog pin for measuring capacitor voltage
#define chargePin      13         //为电容器充电的引脚-连接到充电电阻的一端
#define dischargePin   11         // 引脚放电电容器
#define resistorValue  10000.0F   // 10K将此更改为您正在使用的任何电阻值
                                  // F formatter tells compiler it's a floating point value F格式化器告诉编译器它是一个浮点值

unsigned long startTime;
unsigned long elapsedTime;//决定了给电容器充电的时间

// 电容变量进行初始化
float microFarads;                // floating point variable to preserve precision, make calculations浮点变量保持精度,进行计算
float nanoFarads;

void setup(){
  pinMode(chargePin, OUTPUT);     // set chargePin to output
  digitalWrite(chargePin, LOW);  

  Serial.begin(9600);             // initialize serial transmission for debugging
}

void loop(){
  digitalWrite(chargePin, HIGH);  // set chargePin HIGH and capacitor charging
  startTime = millis();//开始计时器

  while(analogRead(analogPin) < 648){   // 647是1023的63.2%,相当于满量程电压,直到电容达到总电压的63.2%才退出
  }

  elapsedTime= millis() - startTime;//决定了给电容器充电的时间
// convert milliseconds to seconds ( 10^-3 ) and Farads to microFarads ( 10^6 ),  net 10^3 (1000)  将毫秒换算成秒(10 ^-3),将法拉换算成微法拉(10 ^6),比完净10^3 (1000)
  microFarads = ((float)elapsedTime / resistorValue) * 1000;   
  Serial.print(elapsedTime);       // 将值打印到串口
  Serial.print(" mS    ");         //打印单位和回车


  if (microFarads > 1){//确定单元应该是uf的还是nf的,并相应打印
    Serial.print((long)microFarads);       // print the value to serial port
    Serial.println(" microFarads");         // print units and carriage return
  }
  else
  {
    // if value is smaller than one microFarad, convert to nanoFarads (10^-9 Farad).
    // This is a workaround because Serial.print will not print floats
    //如果value小于1 microFarad,则转换为nanoFarads (10^-9 Farad)。
        //这是一个解决方案,因为串行。Print将不会打印浮点数

    nanoFarads = microFarads * 1000.0;      // multiply by 1000 to convert to nanoFarads (10^-9 Farads)//乘以1000转换为nanoFarads
    Serial.print((long)nanoFarads);         // print the value to serial port
    Serial.println(" nanoFarads");          // print units and carriage return
  }

  /* dicharge the capacitor  */
    /*给电容器放电*/
  digitalWrite(chargePin, LOW);             // set charge pin to  LOW 停止充电电容器
  pinMode(dischargePin, OUTPUT);            // set discharge pin to output 允许电容器放电
  digitalWrite(dischargePin, LOW);          // set discharge pin LOW
  while(analogRead(analogPin) > 0){         // wait until capacitor is completely discharged//等待直到电容器完全放电
  }

  pinMode(dischargePin, INPUT);            // set discharge pin back to input//防止电容器放电
}
```

## **电容测量结果**

- 如果没有电容连接,代码将在此行上等待*" while(analogRead(analogPin) < 648) // 647 是 1023 的 63.2%,对应于满量程电压"*
- 连接测试端子之间的电容,观察串口监视器将显示结果。如果没有电容连接,串行端将不会显示任何内容。
- 该程序将反复测试电容器,并且值可能会略有不同。最好取这些值的平均值。

**注:此传感器对于 1 μF 至 3500 μF 之间的电容值最为精确。**
电容测量结果
![电容测量结果](https://img-blog.csdnimg.cn/9c770da03e654bc180357c48a440b3b6.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA54Wk54Kt55qE5aWH5aaZ5ryC5rWB,size_20,color_FFFFFF,t_70,g_se,x_16)
无电容
![在这里插入图片描述](https://img-blog.csdnimg.cn/3cffe605a58d4975b7c3d9d57f6803ef.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA54Wk54Kt55qE5aWH5aaZ5ryC5rWB,size_20,color_FFFFFF,t_70,g_se,x_16)



使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

28

帖子

1

粉丝