projekte:swr-meter_kurzwelle
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende ÜberarbeitungNächste ÜberarbeitungBeide Seiten der Revision | ||
projekte:swr-meter_kurzwelle [2016-12-21 18:12] – danielwf | projekte:swr-meter_kurzwelle [2021-01-31 12:39] – [Messbrücke] snoopy | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
====== SWR-Meter Kurzwelle ====== | ====== SWR-Meter Kurzwelle ====== | ||
- | **DIESER TEXT IST NOCH NICHT FERTIGGESTELLT!** | + | (siehe auch https:// |
- | Für den Funkbetrieb auf Kurzwelle und dem Selbstbau von Antennen ist ein Stehwellen-Messgerät erforderlich. | + | Für den Funkbetrieb auf Kurzwelle und dem Selbstbau von Antennen ist ein Stehwellen-Messgerät erforderlich. Viele Kurzwellen-Transceiver haben dieses zwar eingebaut, aber die Anzeige-Elemente werden oft auch für andere Messwerte benötigt. Spätestens jedoch bei der Verwendung eines Selbstbaugerätes, |
- | Viele Kurzwellen-Transceiver haben dieses zwar eingebaut, aber die Anzeige-Elemente werden oft auch für andere Messwerte benötigt. Spätestens jedoch bei der Verwendung eines Selbstbaugerätes, | + | |
Billige, fertige Analog-Geräte sind für ca. 50€ zu haben. Ein hochwertigerer Selbstbau auf Basis eines Mikrocontrollers ist jedoch nicht nur weit günstiger, sondern ließe sich um viele weitere Funktionen und Komponenten erweitern, wie z.B. eine serielle Ausgabe von Sendeleistung und SWR-Wert oder das Autotuning einer MagLoop-Antenne. | Billige, fertige Analog-Geräte sind für ca. 50€ zu haben. Ein hochwertigerer Selbstbau auf Basis eines Mikrocontrollers ist jedoch nicht nur weit günstiger, sondern ließe sich um viele weitere Funktionen und Komponenten erweitern, wie z.B. eine serielle Ausgabe von Sendeleistung und SWR-Wert oder das Autotuning einer MagLoop-Antenne. | ||
Zeile 10: | Zeile 9: | ||
Das hier vorgestellte SWR-Meter besteht aus zwei Komponenten: | Das hier vorgestellte SWR-Meter besteht aus zwei Komponenten: | ||
+ | |||
* **SWR-Messbrücke: | * **SWR-Messbrücke: | ||
* **Arduino Nano mit I²C-Textdisplay: | * **Arduino Nano mit I²C-Textdisplay: | ||
- | Beide Komponenten sind beliebig austauschbar, | + | Beide Komponenten sind beliebig austauschbar, |
===== Dateien ===== | ===== Dateien ===== | ||
- | Ein Zip-Archiv mit Arduino-Code, | + | Das Zip-Archiv mit Arduino-Code, |
Für die Teile der SWR-Messbrücke gibt es einen [[https:// | Für die Teile der SWR-Messbrücke gibt es einen [[https:// | ||
- | Dazu wird nur noch ein beliebiger " | + | Dazu wird nur noch ein beliebiger " |
Die gesamten Materialkosten liegen bei ca. 25€ | Die gesamten Materialkosten liegen bei ca. 25€ | ||
===== Messbrücke ===== | ===== Messbrücke ===== | ||
- | **Der Aufbau dieses SWR-Meters basiert auf der [[http://dl6gl.de/ | + | **Der Aufbau dieses SWR-Meters basiert auf der [https:// |
* Der OpAmp TLC272 wird nur mit 5V betrieben (3.8V Arbeitsbereich an den Eingängen) | * Der OpAmp TLC272 wird nur mit 5V betrieben (3.8V Arbeitsbereich an den Eingängen) | ||
* Die 10k-Ohm-Widerstände an den invertierenden Eingängen haben wir entfernt. \\ Der Ausgang der beiden OpAmps wird direkt auf den invertierenden Eingang gelegt (=Impedanzwandler). Durch die Impedanzwandlung wird der Messkreis weniger gedämoft, es sind längere Verbindungsleitungen verwendbar und der Arduino-ADC-Eingang bleibt durch Überspannungen geschützt. | * Die 10k-Ohm-Widerstände an den invertierenden Eingängen haben wir entfernt. \\ Der Ausgang der beiden OpAmps wird direkt auf den invertierenden Eingang gelegt (=Impedanzwandler). Durch die Impedanzwandlung wird der Messkreis weniger gedämoft, es sind längere Verbindungsleitungen verwendbar und der Arduino-ADC-Eingang bleibt durch Überspannungen geschützt. | ||
* Ergänzen von 100kOhm-" | * Ergänzen von 100kOhm-" | ||
- | * Entfernen des 4, | + | * Entfernen des 4, |
- | Der Schaltplan, die Platine und die Bestückung sind hier zusammengefasst: | + | Der Schaltplan, die Platine und die Bestückung sind hier zusammengefasst: |
- | + | Die bebilderte Anleitung zum Aufbau des Messkopplers | |
- | //**TODO:** Fotos vom mechanischen | + | |
===== Arduino ===== | ===== Arduino ===== | ||
Zeile 38: | Zeile 38: | ||
Am Arduino sind der SWR-Koppler und das I2C-Textdisplay wie folgt anzuschließen: | Am Arduino sind der SWR-Koppler und das I2C-Textdisplay wie folgt anzuschließen: | ||
- | ^ Modul ^ Pin Name ^ Arduino Pin ^ | + | ^Modul^ |
- | | I2C-Textdisplay | + | |I2C-Textdisplay |
- | | | SCL | A5 | | + | | |
- | | | VCC | 5V | | + | | |
- | | | GND | GND | | + | | |
- | | SWR-Messbrücke | F | A0 | | + | |SWR-Messbrücke|F|A0| |
- | | | R | A1 | | + | | |R|A1| |
- | | | + | 5V | | + | | |
- | | | -| GND | | + | | |-|GND| |
+ | |||
+ | Der Arduino-Code ist auch im oben verlinkten Zip-Archiv enthalten. \\ Implentiert wurde ebenfalls die von Georg Latzel, DL6GL beschriebene und für die BAT43 ermittelte [[http:// | ||
+ | Wie immer eine kurze Warnung vorab: ich bin kein Programmierer und es gibt die ein oder andere Stelle, die man noch verbessern könnte. Auch wenn der Code gut funktioniert, | ||
+ | Folgende Parameter sind von jedem selbst noch anzupassen: | ||
+ | |||
+ | * Die I²C-Adresse (und ggf. abweichende Pinbelegung) bei " | ||
+ | * Maximale Leistung (je nach Windungszahl) bei " int maxPower = … " | ||
+ | * Die Korrektur der Diodenkennlinie bei " bool diodeCorr = … " * | ||
+ | |||
+ | Alle anderen Konfigurationsmöglichkeiten sind im Code auch dokumentiert. \\ \\ Die Ausgabe erfolgt über die FLOAT-Variablen ' | ||
+ | |||
+ | * Die Korrektur der Diodenkennlinie lässt sich mit "bool diodeCorr = 0;" ausschalten. Damit ist der angezeigte Wert vergleichbar mit konventionellen analogen SWR-Metern, die diese Korrektur auch nicht vornehmen. Der Wert stimmt dadurch mit den Werten überein, die z.B. auch mein "Yaesu FT-990" | ||
+ | |||
+ | **Arduino-Sketch** | ||
+ | |||
+ | <code c> | ||
+ | // | ||
+ | // .----------------------------------------------------------------------------------------------------------------------------------------------------------------. | ||
+ | // | SWR-Meter Example | ||
+ | // ' | ||
+ | // by Daniel Wendt-Fröhlich, | ||
+ | // " | ||
+ | // | ||
+ | // | ||
+ | // | ||
+ | // Use SWR-circuit from here http:// | ||
+ | // For 5V-Operation some changes are needed: | ||
+ | // - Remove 10k-Resistors at OpAmps and connect outputs to inverted inputs directly | ||
+ | // - Add 100k to noninverted-inputs of OpAmps | ||
+ | // - remove inline 4.7k at output, we need only the Pulldown 4, | ||
+ | // | ||
+ | // | ||
+ | // | ||
+ | // | ||
+ | // | ||
+ | // | ||
+ | // Display SDA: A4 (check/ | ||
+ | // Display SCL: A5 | ||
+ | // SWR-Bridge F: A0 | ||
+ | // SWR-Bridge R: A1 | ||
+ | // | ||
+ | // | ||
+ | // .----------------------------------------------------------------------------------------------------------------------------------------------------------------. | ||
+ | // | Libraries and Settings | ||
+ | // ' | ||
+ | // | ||
+ | #include < | ||
+ | #include < | ||
+ | LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); | ||
+ | bool DisplayRefresh = 1; | ||
+ | unsigned long printMillis = 0; | ||
+ | unsigned long serialMillis = 0; | ||
+ | |||
+ | |||
+ | // | ||
+ | |||
+ | // Configuration | ||
+ | int maxPower = 90; // maximum Power in Watt (incl. corrections) , maxPower = (5*N/ | ||
+ | int swrFpin = 0; // SWR-Coupler Connections | ||
+ | int swrRpin = 1; | ||
+ | bool diodeCorr = 0; // 1 = correction of diode characteristic | ||
+ | // 0 = no correction, comparable to analog SWR-Meters. only used for SWR, power will be always corrected. | ||
+ | |||
+ | // Parameters for used Diode, see http:// | ||
+ | float a = 0.25161; | ||
+ | float b = -0.85798; | ||
+ | float c = 1; | ||
+ | |||
+ | // Values for Calculation | ||
+ | float areadF; | ||
+ | float areadR; | ||
+ | float voltageF; | ||
+ | float voltageR; | ||
+ | float calcF; | ||
+ | float calcR; | ||
+ | float powerF; | ||
+ | float powerPeak; | ||
+ | float swr; // calculated swr | ||
+ | |||
+ | void readMeter(){ | ||
+ | areadF = analogRead(swrFpin); | ||
+ | areadR = analogRead(swrRpin); | ||
+ | voltageF = areadF * 0.0048828125; | ||
+ | voltageR = areadR * 0.0048828125; | ||
+ | |||
+ | calcF = pow(voltageF, | ||
+ | calcF = calcF * a; // CorrectionFactor = a * ( voltage ^ b) + c | ||
+ | calcF = calcF + c; | ||
+ | calcF = calcF * voltageF; | ||
+ | |||
+ | calcR = pow(voltageR, | ||
+ | calcR = calcR * a; | ||
+ | calcR = calcR + c; | ||
+ | calcR = calcR * voltageR; | ||
+ | |||
+ | powerF = (maxPower * 8) * ( sq(calcF) / 50 ); // with maxPower=ADC=2.5V -> Padc = (2.5V)² / 50 = 0,125 ==> maxPower / 0,125 = maxPower * 8 | ||
+ | // than (maxPower * 8 ) * Padc ==> (maxPower * 8 ) * (voltageF² / 50ohm) | ||
+ | |||
+ | |||
+ | if (diodeCorr == 1) swr = (calcF + calcR) / (calcF - calcR); | ||
+ | if (diodeCorr == 0) swr = (areadF + areadR) / (areadF - areadR); | ||
+ | } | ||
+ | |||
+ | |||
+ | // .----------------------------------------------------------------------------------------------------------------------------------------------------------------. | ||
+ | // | SETUP | | ||
+ | // ' | ||
+ | |||
+ | void setup() { | ||
+ | |||
+ | Serial.begin(9600); | ||
+ | |||
+ | lcd.begin(16, | ||
+ | lcd.backlight(); | ||
+ | lcd.setCursor(4, | ||
+ | lcd.setCursor(4, | ||
+ | delay(2000); | ||
+ | lcd.clear(); | ||
+ | |||
+ | |||
+ | } | ||
+ | |||
+ | // .----------------------------------------------------------------------------------------------------------------------------------------------------------------. | ||
+ | // | LOOP | | ||
+ | // ' | ||
+ | |||
+ | |||
+ | void loop() { | ||
+ | |||
+ | readMeter(); | ||
+ | |||
+ | if (powerF > powerPeak) powerPeak = powerF; | ||
+ | if (printMillis < millis() ) { | ||
+ | lcd.setCursor(0, | ||
+ | lcd.print(" | ||
+ | if (powerPeak< | ||
+ | if (powerPeak< | ||
+ | lcd.print(powerPeak, | ||
+ | lcd.print(" | ||
+ | |||
+ | char wattMeter[7] = " | ||
+ | for (byte i=1; i<=6; i++) { | ||
+ | if (powerPeak > (i * maxPower/7) ) wattMeter[i-1] = (char)0xFF; | ||
+ | } | ||
+ | if (powerPeak > maxPower) wattMeter[6] = ' | ||
+ | lcd.setCursor(9, | ||
+ | |||
+ | |||
+ | lcd.setCursor(0, | ||
+ | if (swr < 0.1 ) swr = 0; // needed for disconnected SWR-bridge | ||
+ | if (swr > 9.99) {lcd.setCursor(4, | ||
+ | if (swr <= 9.99) {lcd.setCursor(4, | ||
+ | |||
+ | char swrMeter[7] = " | ||
+ | if (swr > 1,2 ) swrMeter[0]=(char)0xFF; | ||
+ | for (byte i=1; | ||
+ | if (swr > ((i*0.5)+1)){ | ||
+ | swrMeter[i] = (char)0xFF; | ||
+ | if (3 <= ((i*0.5)+1)) swrMeter[i] = ' | ||
+ | } | ||
+ | |||
+ | } | ||
+ | lcd.setCursor(9, | ||
+ | |||
+ | printMillis = millis() + 200; | ||
+ | powerPeak = 0; | ||
+ | |||
+ | if (powerF > 0){ | ||
+ | Serial.print(powerF, | ||
+ | Serial.print(" | ||
+ | Serial.println(swr, | ||
+ | } | ||
+ | } | ||
+ | |||
+ | |||
+ | } | ||
+ | |||
+ | </ | ||
+ | |||
+ | \\ | ||
projekte/swr-meter_kurzwelle.txt · Zuletzt geändert: 2022-11-17 22:34 von 127.0.0.1