Hoje iremos construir dois circuitos para calcular o valor de uma resistência.
O principio usado nestes circuitos é o da divisão de tensão. A medição é feita com uma porta analógica de um micro-controlador.
Foi usado o CSEduino mas poderia ter sido usado outro Arduino qualquer.
Usando a lei de Ohm é possível calcular a resistência da qual não sabemos o valor (Rx). Para se calcular o valor da resistência temos primeiro que calcular o valor da tensão que passa nessa resistência. Partindo do pressuposto que a tensão dada ao circuito é de 5 V. a formula é a seguinte: VR1 = 5 - VRx. A corrente é i = VR1/R1 = (5 - VRx)/R1 uma vez que o Rx e o R1 se encontram ligados em série, a corrente que passa neles é idêntica. Por isso a resistência desconhecida Rx = Vx/i.
No entanto este método simples tem um problema que é quando a diferença entre o R1 e o Rx é grande, o cálculo do valor do Rx é extremamente impreciso. Isto acontece porque quase toda a tensão cairá na resistência de maior valor o que impedirá a medição da outra resistência.
No segundo circuito tenta-se eliminar esta situação criando um sistema de “auto-ranging”. O micro-controlador vai controlar o estado de cada um dos pinos que se encontra ligado a cada uma das resistências conhecidas e perceber qual a resistência mais adequada para fazer a medida. Para evitar o “fly-back” que existiria pelo facto de termos múltiplas resistências ligadas recorre-se à técnica de “desligar” os restantes pinos colocando-os no estado designado por “alta-impedância”.
Este circuito foi baseado no circuito que se encontra no seguinte link.
Esquemático
Componentes (BOM)
Circuito 1:
- 1x Resistência de 1K Ohms (R1)
Circuito 2:
- 1x Resistência de 220 Ohms (R2)
- 1x Resistência de 680 Ohms (R3)
- 1x Resistência de 1K Ohms (R4)
- 1x Resistência de 2.2K Ohms (R5)
- 1x Resistência de 4.7K Ohms (R6)
- 1x Resistência de 10K Ohms (R7)
- 1x Resistência de 22K Ohms (R8)
As resistências R9 e R10 são as que o circuito vai calcular o valor.
Para que haja alguma precisão na leitura dos valores aconselha-se que sejam usadas resistências com 1% de tolerância ou menos.
Pin-out dos IC/Componentes
Código
O primeiro sketch faz o teste usando um divisor de tensão simples.
const int resistorPin = A0;
int raw = 0;
const int Vin = 5;
float Vout = 0;
float R1 = 1000;
float Rx = 0;
float buffer = 0;
void setup() {
Serial.begin(9600);
}
void loop() {
raw = analogRead(resistorPin);
Vout = (5.0 / 1023.0) * raw;
buffer = (Vin / Vout) - 1;
Rx = R1 / buffer;
Serial.print("Voltage: ");
Serial.println(Vout);
Serial.print("Rx: ");
Serial.println(Rx);
delay(1000);
}
// Sketch uses 4,134 bytes (12%) of program storage space. Maximum is 32,256 bytes.
// Global variables use 234 bytes (11%) of dynamic memory, leaving 1,814 bytes for local variables. Maximum is 2,048 bytes.
O segundo sketch faz o teste usando um conjunto de resistências. Se não tiver os valores das resistência do esquema pode ajustar no código o valor das resistências, colocando-as sempre por ordem crescente.
const byte resistorPin = A0;
const byte resistorPins[] = {5, 6, 7, 8, 9, 10, 11};
# define NUMBERPINS sizeof(resistorPins)
const int resistorValues[NUMBERPINS] = {220, 680, 1000, 2200, 4700, 10000, 22000}; // Valor das resistências
int resistorReads[NUMBERPINS] = {};
double vx;
float rx;
double i;
boolean novalue;
void setup() {
pinMode(resistorPin, INPUT);
Serial.begin(9600);
while (!Serial) ;
Serial.println("CSEduino Ohmmeter");
}
int readvalues(byte mask) {
for(byte p = 0; p < NUMBERPINS; p++) {
pinMode(resistorPins[p], INPUT); // High-impedance
}
for(byte p = 0; p < NUMBERPINS; p++) {
if ((mask & (1 << p)) != 0) {
pinMode(resistorPins[p], OUTPUT);
digitalWrite(resistorPins[p], HIGH);
}
}
return analogRead(resistorPin);
}
void loop() {
for(byte p = 0; p < NUMBERPINS; p++) {
resistorReads[p] = readvalues(1 << p);
}
novalue = true;
for(byte p = NUMBERPINS; p > 0; p--) {
if (resistorReads[p-1] >= 450) {
vx = (resistorReads[p-1]) * (5.0 / 1024.0);
i = (5.0/vx) - 1;
rx = (resistorValues[p-1] / i);
novalue = false;
break;
}
}
if (novalue) {
vx = (resistorReads[0]) * (5.0 / 1024.0);
i = (5.0/vx) - 1;
rx = (resistorValues[0] / i);
}
if(vx > 4.8) {
Serial.println("----INFINITY----");
} else {
if(rx < 1000) {
Serial.print(rx);
} else {
rx = rx / 1000;
Serial.print(rx);
Serial.print("k");
}
Serial.println(" Ohms");
}
delay(200);
}
// Sketch uses 5,056 bytes (15%) of program storage space. Maximum is 32,256 bytes.
// Global variables use 291 bytes (14%) of dynamic memory, leaving 1,757 bytes for local variables. Maximum is 2,048 bytes.