Voltímetro de 0-50V de quatro canais baseado no kit de laboratório digital NR05

Muitas vezes, é necessário controlar simultaneamente várias tensões, por exemplo, as tensões de saída de uma fonte de alimentação de computadores, várias baterias etc. Na última publicação, examinamos o princípio do bloqueio de código e, agora, com base no kit de expansão do kit de laboratório digital NR05 , montamos um digital um voltímetro com uma indicação dos resultados no visor embutido na placa. A faixa de tensões medidas pode ser alterada usando um divisor externo e a etapa de medição é determinada pela resolução do conversor analógico-digital (ADC) do microcontrolador Atmega 328 usado na placa Arduino e é de 1024 valores. Então, na faixa de tensão de 0 a 50V, a etapa de medição de tensão será de cerca de 50 mV, o que é suficiente para uso doméstico.



Vamos conectar as tensões medidas às entradas analógicas livres da placa. Essas são as entradas A0, A4, A5 e A7 localizadas na parte inferior direita da placa. Para usar a entrada A0, retire temporariamente o resistor R4 localizado perto do conector XP3 na parte inferior direita da placa.



Faremos um divisor externo com conectores para conectar as tensões medidas e uma placa de expansão usando o método LUT (a chamada "tecnologia de passar a laser") e gravar a placa em uma solução de cloreto férrico. Usamos resistores SMD, mas se você não tiver uma impressora a laser, poderá fazer o divisor desenhando condutores com uma caneta de feltro à prova d'água. Nesse caso, é melhor usar resistores de saída, pois a precisão do tamanho dos condutores resultantes será menor. Em detalhes, a tecnologia de fabricação de placas de circuito impresso por gravação em cloreto férrico pode ser estudada através da compra de um conjunto de NN201 produzido pelo Master Kit.

O painel divisor acabado é mostrado na foto abaixo.



A placa de expansão possui uma tela de cristal líquido de 2 linhas com 16 caracteres em cada linha. Nesse indicador, quatro leituras de 0 a 50 volts com uma casa decimal e identificadores de canal são bastante confortáveis ​​de serem colocadas.

É recomendável que as medições sejam realizadas várias vezes em um curto período de tempo, calculando a média de seus valores. Isso reduzirá erros de medição aleatórios.
Também percebemos no programa “congelando” os resultados quando você clica em um dos botões embutidos no quadro, por exemplo, no meio. Uma segunda pressão retomará as medições contínuas.

Usamos o LED conectado à 13ª saída digital do Arduino para indicar o processo de medição.

Com base no exposto, faremos um programa para o Arduino:

Spoiler
/*--------------------------------------------------------------
0-50, ,
, LCD-
16 , 2 ,


NR05 « »; 4 10
1, 100, A0,A4,A5,A7


5 V_REF
.
-
.

(
)
Vin
.
Vout .
DIV_* Vin/Vout.

startingelectronics.com
--------------------------------------------------------------*/
#include <LiquidCrystal.h>

// ( )
#define LED 13
//
#define NUM_SAMPLES 20
//
#define DIV_1 11.186
#define DIV_2 11.186
#define DIV_3 11.186
#define DIV_4 11.186
//
#define V_REF 4.575
//
#define NUM_KEYS 5
// ( )
int adcKeyVal[NUM_KEYS] = {30, 150, 360, 535, 760};

LiquidCrystal lcd(A1, A2, A3, 2, 4, 7);
unsigned long sum[4] = {0}; //
unsigned char sample_count = 0; //
float voltage[4] = {0.0}; //
int cnt = 0; //
int keyIsPressed = 0; // «»

void setup()
{
lcd.begin(16, 2);
pinMode(LED, OUTPUT);
digitalWrite(LED, LOW);
}

void loop()
{
// 3 , «»
if (get_key() == 3){
keyIsPressed = !keyIsPressed;
delay(500);
}
// (1),
if (keyIsPressed == 0){
digitalWrite(LED, LOW);
//
while (sample_count < NUM_SAMPLES) {
// sample channel A0, A4, A5, A7
sum[0] += analogRead(A0);
sum[1] += analogRead(A4);
sum[2] += analogRead(A5);
sum[3] += analogRead(A7);
sample_count++;
delay(10);
}
digitalWrite(LED, HIGH);
//
for (cnt = 0; cnt < 4; cnt++) {
voltage[cnt] = ((float)sum[cnt] / (float)NUM_SAMPLES * V_REF) / 1024.0;
}
//
lcd.setCursor(0, 0);
lcd.print(«A „);
lcd.print(voltage[0] * DIV_1, 1);
lcd.print(“V „);
// voltage 2 — B (pin A4)
lcd.setCursor(8, 0);
lcd.print(“B „);
lcd.print(voltage[1] * DIV_2, 1);
lcd.print(“V „);
// voltge 3 — C (pin A5)
lcd.setCursor(0, 1);
lcd.print(“C „);
lcd.print(voltage[2] * DIV_3, 1);
lcd.print(“V „);
// voltage 4 — D (pin A7)
lcd.setCursor(8, 1);
lcd.print(“D „);
lcd.print(voltage[3] * DIV_4, 1);
lcd.print(“V „);

//
sample_count = 0;
for (cnt = 0; cnt < 4; cnt++) sum[cnt] = 0;
delay(20);
}
}

//
int get_key()
{
int input = analogRead(A6);
int k;
for (k = 0; k < NUM_KEYS; k++)
if (input < adcKeyVal[k])
return k + 1;
return 0;
}


O programa está equipado com comentários suficientemente detalhados que explicam os recursos da implementação do algoritmo.

Talvez a característica mais importante seja o processo de calibrar as constantes descritas nos comentários envolvidos no cálculo das tensões medidas. Para calibrar o divisor (realizado uma vez), use uma fonte de tensão constante e estável. Como a calibração demora um pouco, você pode usar com êxito uma bateria de 9V “Krona” e um multímetro digital. Um multímetro do "Conjunto de um jovem engenheiro eletrônico" NR02 é bastante adequado. Este kit também é ótimo para o ensino de solda e montagem de PCB.

Deve-se notar que, quando a tensão de alimentação que chega ao Arduino muda, os valores de calibração da tensão de referência devem ser alterados de acordo, cujos valores relativos são medidos.

Para alterar a faixa de medição, é necessário aplicar um divisor com uma taxa de divisão diferente da tensão de entrada.

Source: https://habr.com/ru/post/pt393225/


All Articles