Ich habe den Frequenzzähler auf einer 4 x 6 cm großen Platine aufgebaut. Mit einer Sockelleiste wird das 1602 LCD Display drauf gesteckt. Die Stromversorgung wird an den Klemmen mit 5V herausgeführt. Hier kommt auch das Frequenz-Signal rein.
Basierend auf diesen vorherigen Artikeln wird nun alles zusammengeführt.
– Frequenzzähler Teil 1 & Teil 2
– LCD Display Teil 1 & Teil 2
– Arduino Uno als ISP
– Ein Frequenzzähler für niedrige Frequenzen …
Die Materialiste.
1 x Lochrasterplatine ca. 4 x 6 cm
1 x 26-poliger IC Sockel
1 x 16 polige Sockelleiste die Aufnahme des LCD Displays
1 x LCD Display 1602 mit 4-Bit Ansteuerung
1 x 16-polige Stiftleiste für das LCD Display
1 x 16MHz Quarz
2 x 15pF Kondensatoren SMD
1 x 100 Ohm Widerstand
1 x 1k Ohm Widerstand
1 x 5k Ohm Drehwiderstand
1 x 10uF Tantal Kondensator
1 x 4-polige Schraubklemme
1 Rolle Fädeldraht lötbar (ich verwende 0,28mm Material lackiert)
Alles zusammen für ca. 10-15 Euro Materialwert.
Nun zur Aufbaubeschreibung.
1. Als erstes werden in die Ecklöcher der Lochraster Platine 3mm Schrauben eingesetzt mit Muttern. Sie schauen unter raus und sind die Standfüße. Damit liegt die Platine nicht wackelig auf dem Tisch und es kann kein Kurzschluß durch herumliegende Metallteile (Drähte) entstehen.
2. Das LCD Display bekommt eine 16-polige Stiftleiste
3. Die 16-polige Sockelleiste wird an den Rand der Platine gesetzt, sodaß das LCD Display später direkt über der Platine liegt.
4. Der 28-polige Sockel für den ATMEGA328P-PU wird aufgelötet.
5. Der 16MHz Quarz wird an die IC-Pins 9 und 10 gelötet. Zwei Kondensatoren mit 15pF werden von den Pins an Masse gelegt.
6. Zur Stabilisierung der Spannungsversorgung wird ein 10nF Tantal ELKO an die Pins 7 (+) und 8 (-) gelötet.
7. Der Kontrast-Regelwiderstand wird aus einem 1kOhm Widerstand und einem 4,7kOhm Trimm-Widerstand aufgebaut. Eine kleine senkrechte Bauform ist später leichter von der Seite einzustellen, ich hatte aber nur einen liegenden Widerstand in der Kiste.
8. Es kann noch ein 6-poliger Programmier-Stecker aufgelötet werden. Ich habe mich später aber entschieden den ATMEGA328 auf dem Steckbrett zu programmieren. Daher ist er vorhanden, wird hier aber nicht verwendet.
9. Die 4-polige Schraubklemme wird an den Rand gesetzt.
Die Belegung von links nach recht:
– 1 frei, hier kann eine 9 oder 12v Stromversorgung angeschlossen werden. Dazu ist aber noch ein 5V Regler auf dem Board notwendig. Platz ist noch vorhanden.
– 2 Versorgungsspannung + 5V
– 3 Masse Versorgungsspannung und Signal
– 4 Signaleingang zum Vorverstärker
10. Daneben sitzt der Eingangsverstärker Transistor. Die Widerstände und der Eingangskondensator sind unter der Platine in SMD Bauform verlötet. Aufbau wie hier, nur habe ich einen 2,2uF Kondensator im Eingang verwendet. Der Ausgang geht auf PIN 11.
11. Der Kathoden Anschluß der LCD Beleuchtung (LCD -) bekommt noch einen 100 Ohm Widerstand gegen Masse.
12. Nun werden alle Anschlüsse nacheinander mit Fädeldraht verbunden und verlötet. Hierfür habe ich gut 1m verbraucht. Erst die Display Verbindungen und dann die Stromversorgung
Hier die Display Verbindungen.
Von der LCD Sockelleiste geht es direkt zum entsprechenden 328 IC Pin. Die Arduino Uno Bezeichnungen sind hier auch noch erwähnt weil das für die Entwicklung auf den Steckbrett wichtig war.
LCD > Arduino > 328 IC 28DIL Gehäuse
————-
VSS > GND > P8
VDD > +5V > P7
V0 > 5k Poti + 1kOhm Widerstand > GND
RS > Pin 12 > P18
R/W > Pin 13 > P19
E > Pin 11 > P17
D4 > Pin 7 > P13
D5 > Pin 8 > P14
D6 > Pin 9 > P15
D7 > Pin 10 > P16
A > +5V
K > 100 Ohm Widerstand > GND
Die Software
// Arduino 328 Frequenzzähler auf Platine // von 1 Hz bis ca. 5 MHz // > 900 Hz Eingangsspannung muss an Pin 5 mit ca. 5V Pegel ankommen. // < 1000 Hz Eingangsspannung muss an Pin 5 mit ca. 5V Pegel ankommen. // V 1.2: 1602 Display hinzugefügt // V 2.0: niedrige Frequenzen hinzugefügt // V 2.41: hohe Frequenzen umgeschieben und lcdOut() hinzugefügt // V 2.42: FreqCounter Library wieder genommen // V 2.43: auf Nano 328 angepasst // V 2.44: auf Platine 328 + NPN Emitter Schutzschaltung // // Stromaufnahme incl. Display Beleuchtung 28mA // Messbereich bis ca. 5 MHz, je nach Symmetrie des Signals (max. 8 MHz) // Messsignal Amplitude min. 100mV SS // Eingangsschaltung: 2uF + BE-Strecke ( NPN 0,7V ) // // Matthias Busse 16.11.2014 Version 2.44 // http://interface.khm.de/index.php/lab/experiments/arduino-frequency-counter-library/ #include < FreqCounter.h> #include LiquidCrystal lcd(12, 13, 11, 7, 8, 9, 10); /* LCD Display Anschlüsse: LCD > Arduino > 328 IC 28DIL Gehäuse ------------- VSS > GND > P8 VDD > +5V > P7 V0 > 5k Poti + 1kOhm Widerstand > GND RS > Pin 12 > P18 R/W > Pin 13 > P19 E > Pin 11 > P17 D4 > Pin 7 > P13 D5 > Pin 8 > P14 D6 > Pin 9 > P15 D7 > Pin 10 > P16 A > +5V K > 100 Ohm Widerstand > GND Frequenz Messeingang > 2uF > BC547B NPN Emitterschaltung > P11, beim 328 28DIL Gehäuse Messbereich bis ca. 5 MHz Eingangsamplitude min. 100mV SS */ unsigned long rfreq, mfreq; int mihz=0, hz=0, khz=0, mehz=0; // mHz, Hz, kHz und MHz je 3 Ziffern char sfreq[15]; // sfreq=Stringfrequenz static int schnell=0; // > 1kHz = 1 static int slgrenze=2000; // schnell / langsam Grenze double sum=0, mfrequency, rfrequency; int count=0; // langsam int k=0,pin=5; unsigned long T; // Periodendauer in us double fsum=0.0; // Summieren double f=0; // Frequenz in MHz unsigned long time; // Startzeit void setup() { pinMode(pin, INPUT); // Serial.begin(38400); // Serielle Ausgabe lcd.begin(20,4); lcd.clear(); lcd.setCursor(0,0); lcd.print("Frequenz Zaehler"); lcd.setCursor(0,1); // Display ausgeben lcd.print(" MBS Ver. 2.44 "); // 2 Sekunden wegzählen, da die ersten beiden Messungen eh murks sind. FreqCounter::f_comp=120; // Cal Wert FreqCounter::start(1000); // 1 s Gate Time while (FreqCounter::f_ready == 0) mfreq=FreqCounter::f_freq; FreqCounter::f_comp=120; // Cal Wert FreqCounter::start(1000); // 1 s Gate Time while (FreqCounter::f_ready == 0) mfreq=FreqCounter::f_freq; schnell=0; if(mfreq > slgrenze) schnell=1; } void loop() { if(schnell==1) { FreqCounter::f_comp=120; // Cal Wert FreqCounter::start(1000); // 1 s Gate Time while (FreqCounter::f_ready == 0) mfreq=FreqCounter::f_freq; lcdOut((double)mfreq); if(mfreq < (slgrenze*0.97)) { // auf langsam umschalten schnell=0; } } // if (schnell==1) else { // langsam time=micros(); do { T = pulseIn(pin, HIGH) + pulseIn(pin, LOW); if (T==0) { // Serial.println("Timeout."); } else { f=1/(double)T; // f=1/T k++; } fsum+=f*1e6; } while( micros() < (time+1e6)); // 1 Sekunde mitteln mfrequency = fsum/k*0.9925; lcdOut(mfrequency); fsum=0.0; k=0; if(mfrequency > (slgrenze*1.03)) { schnell=1; } } // else langsam */ } // loop void lcdOut(double f) { // Frequenz formatiert ausgeben // auf dem 16x2 LCD Display // // Matthias Busse Version 1.0 int nachkomma=0; unsigned long rf; rf=(unsigned long)f*1000; if((f-(int)f) > 0.005) { // Nachkommastellen rf=(unsigned long)(f*1000); nachkomma=1; mihz = rf-(int(rf/1000)*1000); rf=(rf-mihz)/1000; } rf=(unsigned long)f; hz = rf-(int(rf/1000)*1000); rf=(rf-hz)/1000; khz = rf-(int(rf/1000)*1000); rf=(rf-khz)/1000; mehz = rf-(int(rf/1000)*1000); if(f >= 1000000.0) {sprintf(sfreq," %3d %03d %03d Hz",mehz,khz,hz);} if((f > slgrenze)&& (f<1000000.0)) {sprintf(sfreq," %3d %03d Hz",khz,hz);} else if((f >= 1000.0) && (f<1000000.0)) {sprintf(sfreq," %3d %03d,%03d Hz",khz,hz,mihz);} if((f>=1.0) && (f < 1000.0)) {sprintf(sfreq," %3d,%03d Hz",hz,mihz);} if(f < 1.0) {sprintf(sfreq," 0,%03d Hz",hz,mihz);} lcd.setCursor(1,1); // Display ausgeben lcd.print(" "); lcd.setCursor(1,1); lcd.print(sfreq); }
Die IC Programmierung.
Nach der Programmentwicklung auf dem Steckbrett wurde der ATMEA238P-PU Chip vom Uno aus programmiert wie in diesem Artikel beschrieben und dann auf die Platine gesteckt.
Der erste Test
Alle Verbindungen werden überprüft und durchgeklingelt. Nachbar Lötpads werden auf Isolation überprüft. Dann kann es los gehen.
5V werden angeschlossen. Die Schaltung läuft und die Stromaufnahme ist ca. 28mA, alles OK.
Mit einem Frequenzgenerator werden die Grenzen ermittelt.
Die Eingangsspannung sollte mindestens 100mV Spitze-Spitze betragen, dann werden Frequenzen bis zu ca. 5MHz gemessen, abhängig von der Symmetrie. Theoretisch sind sogar 8MHz (halbe Taktfrequenz ) möglich.
von Matthias Busse
Ein Nachtrag: Der Frequenz Messfehler liegt bei ca. 60ppm also in der 4. oder 5. Stelle der angezeigten Frequenz bei den verwendeten Standard Bauteilen. Für eine genauere Messung der Frequenz kann dieses Uhrzeit Modul mit eingebunden werden. Dadurch kann der Fehler der Messung kleiner 3ppm werden und liegt damit an der 5. oder 6. Stelle der Frequenz.
Pingback: Frequenzzähler mit LCD Display am Arduino Uno. | Shelvin – Elektronik ausprobiert und erläutert
Pingback: Der Frequenzgenerator und Frequenzzähler | Shelvin – Elektronik ausprobiert und erläutert
Pingback: Ein simpler Rechteckgenerator mit dem Arduino | Shelvin – Elektronik ausprobiert und erläutert
Hallo,
sehr gute Darstellung. Ist es möglich ein Schaltbild zu bekommen?
Dann könnte man besser erkennen, wie die beiden 15nF Kondensatoren und der 100 Ohm Widerstand
eingebaut wurden.
Vielen Dank vorab.
Viele Grüße
JGR
Ich habe das Bild für die Standard Quarz Beschaltung eingefügt.
Der 100 Ohm Widerstand ist für die LCD Beleuchtung und wird von LCD- (Kathode der LED Beleuchtung) zu Masse geschaltet.
Da war ein Fehler in der Beschreibung.
Die Quarz Kondensatoren sind nicht 15nF sondern 15pF.
Das ist jetzt geändert.
Danke Manfred
Schöner Artikel. Inzwischen gibt es ja arduinoartige Boards mit ESP8266 die mit 80 MHz getaktet werden. Das müßte doch wesentlich höhere Grenzfrequenzen ergeben. Schon probieert?
Gruß aus München
Werner
Damit sollte es dann bis 30 MHz funktionieren.
Theoretisch liegt die maximal meßbare Frequenz bei der halben Taktfrequenz wenn das Meßsignal symetrisch ist. In der Praxis ist das aber nicht sicher erreichbar, 1/3 ist da realistisch.
Pingback: Den Arduino Quarztakt auf 3ppm genau bestimmen mit der DS3231 RTC | Shelvin – Elektronik ausprobiert und erläutert