Main Content

Circuitos_1

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

Circuitos_3_Schematics

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

Circuitos15_4_Pinout_Resistencias

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.