【Arduino开源项目】LCR(电感/电容/电阻)电桥测试仪
提供了不同驱动屏幕显示的Hex文件。以及源文件,不多介绍了,感兴趣的可以自行下载下来看,地址已经使用的镜像地址访问应该没有问题。
这次带来的是外网开源的LCD1602显示的简易版LRC,只能测试电电感,电容,电阻,电容的ESR值没法测试。与上面的开源项目不属于同一个项目。
- 原项目地址:https://www.instructables.com/Arduino-InductanceCapacitanceResistance-Meter/
- 原理图和PCB文件原地址提供的需要AUdesk 的eagle软件打开。
原理图
- 绘制了一张Proteus图作为使用说明
程序代码
#include <LiquidCrystal.h>
LiquidCrystal lcd(13, 8, 7, 5, 4, 2);
#define R_1 A1
#define R_2 A2
#define IND_1 6
#define IND_2 12
#define fuente_pin 11
#define switch_pin 10
#define descarga_pin 9
#define PIN_1 A3
#define PIN_2 A4
//Variables leer pines
int pin_1;
int pin_2;
//Variables para inductometro
double pulso;
double frecuencia;
double capacitancia;
double inductancia;
//Capacimetro
float R = 1.0e6;
float C = 0;
float RC = 0;
unsigned long t_inicio = 0;//获取Arduino开机后运行的时间长度,单位为微秒
volatile long t_alto = 0;
long T = 0;
float VCC = 4.50;
float Vref = VCC / 2;
float V0 = 0;
float error_correccion = 40.;
int retardo_delay = 20;
//Variables resistometro
int vR_1 = 0;
int vR_2 = 0;
float Vin = 5;
float Vout = 0;
float Res_1 = 10000;
float Res_2 = 9000000;
float r_1 = 0;
float r_2 = 0;
float Resistor_1[8];
float Resistor_2[5];
float ResArreglo_1;
float ResArreglo_2;
void setup() {
lcd.begin(16, 2);
//Configuracion de pines
pinMode(PIN_1, INPUT);
pinMode(PIN_2, INPUT);
//Configuracion Inductometro
pinMode(IND_1, INPUT);
pinMode(IND_2, OUTPUT);
capacitancia = 0.000001021;
//delay(200);
//Configuracion de Resistometro
pinMode(R_1, INPUT);
pinMode(R_2, INPUT);
//Configuracion Capacimetro
attachInterrupt(3, stop, RISING);//上升沿触发,外部中断引脚改到3号引脚(2号引脚被LCD1602占用)
Vref = VCC / 2;
pinMode(fuente_pin, OUTPUT);
digitalWrite(fuente_pin, LOW);
pinMode(switch_pin, INPUT);
pinMode(descarga_pin, INPUT);
}
void loop() {
leerpines();
/***************A3=0且A4=0时, 测量电感值*********************/
if (pin_1 == LOW && pin_2 == LOW) {
digitalWrite(IND_2, HIGH);
delay(5);
digitalWrite(IND_2, LOW);
delayMicroseconds(100);
pulso = pulseIn(IND_1, HIGH, 5000);
lcd.clear();
if (pulso > 0.1) {
frecuencia = 1.E6 / (2 * pulso);
inductancia = 1. / (capacitancia * frecuencia * frecuencia * 4.*3.1459 * 3.14159);
inductancia *= 1E6;
lcd.setCursor(2, 0);
lcd.print("INDUCTANCIA:");
//delay(200);
if (inductancia >= 1000) {
lcd.setCursor(0, 1);
int valor = (inductancia / 1000) - 0.5;
lcd.print(valor);
lcd.setCursor(6, 1);
lcd.print("mH");
} else {
lcd.setCursor(0, 1);
int valor_2 = inductancia + 10;
lcd.print(valor_2);
lcd.setCursor(6, 1);
lcd.print("uH");
}
} else if (pulso < 0.1) {
lcd.setCursor(2, 0);
lcd.print("INSERTAR IND");
}
delay(300);
}
/***************A3=0且A4=1时, 测量电阻值*********************/
if (pin_1 == LOW && pin_2 == HIGH) {
lcd.clear();
for (int i = 0 ; i <= 7; i++) {
Resistor_1[i] = analogRead(R_1);
ResArreglo_1 = ResArreglo_1 + Resistor_1[i];
}
vR_1 = (ResArreglo_1 / 8.0);
Vout = (Vin * vR_1) / 1023;
r_1 = Res_1 * (1 / ((Vin / Vout) - 1));
lcd.setCursor(2, 0);
lcd.print("RESISTENCIA:");
if (r_1 <= 999) {
lcd.setCursor(0, 1);
lcd.print(r_1);
lcd.setCursor(9, 1);
lcd.print("Omhs");
} else if (r_1 >= 1000) {
r_1 = r_1 / 1000;
lcd.setCursor(0, 1);
lcd.print(r_1);
lcd.setCursor(9, 1);
lcd.print("KOmhs");
}
delay(500);
ResArreglo_1 = 0;
}
/***************A3=1且A4=0时, 测量电容值*********************/
if (pin_1 == HIGH && pin_2 == LOW) {
lcd.clear();
/***************同时按下switch_pin,才开始测量电容值*********************/
if (debounce(switch_pin) == LOW)
{
pinMode(descarga_pin, OUTPUT);
digitalWrite(descarga_pin, LOW);
delay(100);
pinMode(descarga_pin, INPUT);
digitalWrite(fuente_pin, HIGH);
t_inicio = micros();
}
if (t_alto > 0 && t_inicio > 0 && (t_alto - t_inicio) > 0 )
{
T = (t_alto - t_inicio);
RC = -T / log((Vref - VCC) / (V0 - VCC));
//Vref = VCC/2
//V0 = 0V
C = RC / R; //测量电容公式
lcd.setCursor(0, 0);
lcd.print("C:");
lcd.setCursor(3, 0);
lcd.print(C * 1000, 1);
lcd.setCursor(13, 0);
lcd.print("nF");
lcd.setCursor(0, 1);
lcd.print("C:");
lcd.setCursor(3, 1);
lcd.print(C * 1000000 - error_correccion , 0);
lcd.setCursor(13, 1);
lcd.print("pF");
t_inicio = 0;
t_alto = 0;
digitalWrite(fuente_pin, LOW);
delay(2000);
}
}
}
/***************读取A3和A4引脚值*********************/
void leerpines() {
pin_1 = digitalRead(PIN_1);
pin_2 = digitalRead(PIN_2);
}
void stop()
{
t_alto = micros();
}
int debounce(int pin)
{
int estado;
int previo_estado;
previo_estado = digitalRead(pin);
for (int i = 0; i < retardo_delay; i++)
{
delay(1);
estado = digitalRead(pin);
if ( estado != previo_estado)
{
i = 0;
previo_estado = estado;
}
}
return estado;
}
LCD1602+PCF8574转I2C接口的程序
由于I2C接口的SDA和SCL接口与A4和A5,是共用的,所以将代码中的相关引脚定义改动了一下,将PIN_1和PIN_2引脚的定义换成其他未使用的引脚
#include <Wire.h>
#include <LiquidCrystal_I2C.h>//点击这里会自动打开管理库页面: http://librarymanager/All#LiquidCrystal_I2C
LiquidCrystal_I2C lcd(0x27,16,2); // set the LCD address to 0x27 for a 16 chars and 2 line display
#define R_1 A1
#define R_2 A2
#define IND_1 6
#define IND_2 12
#define fuente_pin 11
#define switch_pin 10
#define descarga_pin 9
#define PIN_1 5
#define PIN_2 7
//Variables leer pines
int pin_1;
int pin_2;
//Variables para inductometro
double pulso;
double frecuencia;
double capacitancia;
double inductancia;
//Capacimetro
float R = 1.0e6;
float C = 0;
float RC = 0;
long t_inicio = 0;
volatile long t_alto = 0;
long T = 0;
float VCC = 4.50;
float Vref = VCC / 2;
float V0 = 0;
float error_correccion = 40.;
int retardo_delay = 20;
//Variables resistometro
int vR_1 = 0;
int vR_2 = 0;
float Vin = 5;
float Vout = 0;
float Res_1 = 10000;
float Res_2 = 9000000;
float r_1 = 0;
float r_2 = 0;
float Resistor_1[8];
float Resistor_2[5];
float ResArreglo_1;
float ResArreglo_2;
void setup() {
lcd.init();
lcd.backlight();
//Configuracion de pines
pinMode(PIN_1, INPUT);
pinMode(PIN_2, INPUT);
//Configuracion Inductometro
pinMode(IND_1, INPUT);
pinMode(IND_2, OUTPUT);
capacitancia = 0.000001021;
//delay(200);
//Configuracion de Resistometro
pinMode(R_1, INPUT);
pinMode(R_2, INPUT);
//Configuracion Capacimetro
attachInterrupt(3, stop, RISING);
Vref = VCC / 2;
pinMode(fuente_pin, OUTPUT);
digitalWrite(fuente_pin, LOW);
pinMode(switch_pin, INPUT);
pinMode(descarga_pin, INPUT);
}
void loop() {
leerpines();
if (pin_1 == LOW && pin_2 == LOW) {
digitalWrite(IND_2, HIGH);
delay(5);
digitalWrite(IND_2, LOW);
delayMicroseconds(100);
pulso = pulseIn(IND_1, HIGH, 5000);
lcd.clear();
if (pulso > 0.1) {
frecuencia = 1.E6 / (2 * pulso);
inductancia = 1. / (capacitancia * frecuencia * frecuencia * 4.*3.1459 * 3.14159);
inductancia *= 1E6;
lcd.setCursor(2, 0);
lcd.print("INDUCTANCIA:");
//delay(200);
if (inductancia >= 1000) {
lcd.setCursor(0, 1);
int valor = (inductancia / 1000) - 0.5;
lcd.print(valor);
lcd.setCursor(6, 1);
lcd.print("mH");
} else {
lcd.setCursor(0, 1);
int valor_2 = inductancia + 10;
lcd.print(valor_2);
lcd.setCursor(6, 1);
lcd.print("uH");
}
} else if (pulso < 0.1) {
lcd.setCursor(2, 0);
lcd.print("INSERTAR IND");
}
delay(300);
}
if (pin_1 == LOW && pin_2 == HIGH) {
lcd.clear();
for (int i = 0 ; i <= 7; i++) {
Resistor_1[i] = analogRead(R_1);
ResArreglo_1 = ResArreglo_1 + Resistor_1[i];
}
vR_1 = (ResArreglo_1 / 8.0);
Vout = (Vin * vR_1) / 1023;
r_1 = Res_1 * (1 / ((Vin / Vout) - 1));
lcd.setCursor(2, 0);
lcd.print("RESISTENCIA:");
if (r_1 <= 999) {
lcd.setCursor(0, 1);
lcd.print(r_1);
lcd.setCursor(9, 1);
lcd.print("Omhs");
} else if (r_1 >= 1000) {
r_1 = r_1 / 1000;
lcd.setCursor(0, 1);
lcd.print(r_1);
lcd.setCursor(9, 1);
lcd.print("KOmhs");
}
delay(500);
ResArreglo_1 = 0;
}
if (pin_1 == HIGH && pin_2 == LOW) {
lcd.clear();
if (debounce(switch_pin) == LOW)
{
pinMode(descarga_pin, OUTPUT);
digitalWrite(descarga_pin, LOW);
delay(100);
pinMode(descarga_pin, INPUT);
digitalWrite(fuente_pin, HIGH);
t_inicio = micros();
}
if (t_alto > 0 && t_inicio > 0 && (t_alto - t_inicio) > 0 )
{
T = (t_alto - t_inicio);
RC = -T / log((Vref - VCC) / (V0 - VCC));
//Vref = VCC/2
//V0 = 0V
C = RC / R; //Valor en uF
lcd.setCursor(0, 0);
lcd.print("C:");
lcd.setCursor(3, 0);
lcd.print(C * 1000, 1);
lcd.setCursor(13, 0);
lcd.print("nF");
lcd.setCursor(0, 1);
lcd.print("C:");
lcd.setCursor(3, 1);
lcd.print(C * 1000000 - error_correccion , 0);
lcd.setCursor(13, 1);
lcd.print("pF");
t_inicio = 0;
t_alto = 0;
digitalWrite(fuente_pin, LOW);
delay(2000);
}
}
}
void leerpines() {
pin_1 = digitalRead(PIN_1);
pin_2 = digitalRead(PIN_2);
}
void stop()
{
t_alto = micros();
}
int debounce(int pin)
{
int estado;
int previo_estado;
previo_estado = digitalRead(pin);
for (int i = 0; i < retardo_delay; i++)
{
delay(1);
estado = digitalRead(pin);
if ( estado != previo_estado)
{
i = 0;
previo_estado = estado;
}
}
return estado;
}