Vierkanaliges 0-50-V-Voltmeter basierend auf dem Digital Laboratory Kit NR05

Oft müssen mehrere Spannungen gleichzeitig gesteuert werden, z. B. die Ausgangsspannungen eines Computer-Netzteils, mehrere Batterien usw. In der letzten Veröffentlichung haben wir das Prinzip der Codesperre untersucht und bauen nun auf der Grundlage des Erweiterungskits des Digital Laboratory Kits NR05 ein Vierkanal-Digital auf ein Voltmeter mit einer Anzeige der Ergebnisse auf dem in die Platine eingebauten Display. Der Bereich der gemessenen Spannungen kann mit einem externen Teiler geändert werden. Der Messschritt wird durch die Auflösung des Analog-Digital-Wandlers (ADC) des auf der Arduino-Platine verwendeten Atmega 328-Mikrocontrollers bestimmt und beträgt 1024 Werte. Im Spannungsbereich von 0 bis 50 V beträgt der Spannungsmessschritt dann etwa 50 mV, was für den Hausgebrauch völlig ausreicht.



Wir werden die gemessenen Spannungen an die freien Analogeingänge der Karte anschließen. Dies sind die Eingänge A0, A4, A5 und A7 im unteren rechten Teil der Karte. Um den Eingang A0 zu verwenden, lassen Sie den Widerstand R4 in der Nähe des XP3-Anschlusses im unteren rechten Teil der Platine vorübergehend fallen.



Wir werden einen externen Teiler mit Anschlüssen zum Anschließen der gemessenen Spannungen und einer Expansionsplatine nach der LUT-Methode (der sogenannten "Laser-Bügeltechnologie") herstellen und die Platine in eine Lösung aus Eisenchlorid ätzen. Wir haben SMD-Widerstände verwendet. Wenn Sie jedoch keinen Laserdrucker haben, können Sie den Teiler herstellen, indem Sie Leiter mit einem wasserdichten Filzstift zeichnen. In diesem Fall ist es besser, Ausgangswiderstände zu verwenden, da die Größengenauigkeit der resultierenden Leiter geringer ist. Im Detail kann die Technologie zur Herstellung von Leiterplatten durch Ätzen in Eisenchlorid durch den Kauf eines von Master Kit hergestellten NN201-Satzes untersucht werden.

Die fertige Trennwand ist auf dem Foto unten dargestellt.



Die Erweiterungskarte verfügt über eine 2-zeilige Flüssigkristallanzeige mit 16 Zeichen in jeder Zeile. Auf einem solchen Indikator lassen sich vier Messwerte von 0 bis 50 Volt mit einer Dezimalstelle und Kanalkennungen recht bequem platzieren.

Es ist ratsam, die Messungen selbst in kurzer Zeit mehrmals durchzuführen und ihre Werte zu mitteln. Dies reduziert zufällige Messfehler.
Wir erkennen im Programm auch, dass die Ergebnisse „eingefroren“ werden, wenn Sie auf eine der im Board integrierten Schaltflächen klicken, beispielsweise die mittlere. Ein zweites Drücken setzt die kontinuierlichen Messungen fort.

Wir verwenden die LED, die an den 13. digitalen Ausgang von Arduino angeschlossen ist, um den Messvorgang anzuzeigen.

Basierend auf dem Vorstehenden werden wir ein Programm für Arduino erstellen:

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;
}


Das Programm ist mit ausreichend detaillierten Kommentaren ausgestattet, die die Merkmale der Algorithmusimplementierung erläutern.

Das vielleicht wichtigste Merkmal ist der Prozess der Kalibrierung der Konstanten, die in den Kommentaren zur Berechnung der gemessenen Spannungen beschrieben sind. Verwenden Sie zum Kalibrieren des Teilers (einmal durchgeführt) eine stabile Konstantspannungsquelle. Da die Kalibrierung nur kurze Zeit dauert, können Sie eine 9-V-Krona-Batterie und ein Digitalmultimeter erfolgreich verwenden. Ein Multimeter aus dem "Set eines jungen Elektronikingenieurs" NR02 ist durchaus geeignet. Dieses Kit eignet sich auch hervorragend zum Unterrichten von Löten und Leiterplattenbestückung.

Es ist zu beachten, dass bei einer Änderung der an Arduino ankommenden Versorgungsspannung die Kalibrierungswerte der Referenzspannung entsprechend geändert werden müssen, deren relative Werte gemessen werden.

Um den Messbereich zu ändern, muss ein Teiler mit einem anderen Teilungsverhältnis der Eingangsspannung angelegt werden.

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


All Articles