Benutzer-Werkzeuge

Webseiten-Werkzeuge


projekte:swr-meter_kurzwelle

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
projekte:swr-meter_kurzwelle [2016-12-21 22:21] – [Dateien] danielwfprojekte:swr-meter_kurzwelle [2022-11-17 22:34] (aktuell) – Externe Bearbeitung 127.0.0.1
Zeile 1: Zeile 1:
 ====== SWR-Meter Kurzwelle ====== ====== SWR-Meter Kurzwelle ======
  
-Für den Funkbetrieb auf Kurzwelle und dem Selbstbau von Antennen ist ein Stehwellen-Messgerät erforderlich. +(siehe auch https://wiki.funkfreun.de/projekte/swr-meter_kurzwelle ) 
-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, Senderverstärkers oder eines externen Tuners ist oft ein externes SWR-Meter notwendig. \\+ 
 +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, Senderverstärkers oder eines externen Tuners ist oft ein externes SWR-Meter notwendig.\\
 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 8: Zeile 9:
  
 Das hier vorgestellte SWR-Meter besteht aus zwei Komponenten: Das hier vorgestellte SWR-Meter besteht aus zwei Komponenten:
 +
   * **SWR-Messbrücke:** \\ für verschiedene Leistungen anzupassen, gibt nur zwei analoge Spannungen aus.   * **SWR-Messbrücke:** \\ für verschiedene Leistungen anzupassen, gibt nur zwei analoge Spannungen aus.
   * **Arduino Nano mit I²C-Textdisplay:** \\ misst am ADC-Eingang die analogen Spannung und gibt die errechneten Werte auf dem Display und seriell aus.   * **Arduino Nano mit I²C-Textdisplay:** \\ misst am ADC-Eingang die analogen Spannung und gibt die errechneten Werte auf dem Display und seriell aus.
-Beide Komponenten sind beliebig austauschbar, so dass sich z.B. die SWR-Messbrücke auch an einem bereits vorhandenem Micocontroller-Projekt verwenden lässt. +Beide Komponenten sind beliebig austauschbar, so dass sich z.B. die SWR-Messbrücke auch an einem bereits vorhandenem Micocontroller-Projekt verwenden lässt.
  
 ===== Dateien ===== ===== Dateien =====
  
-Das Zip-Archiv mit Arduino-Code, Bestückungsanleitung, Fritzing-Projekt und Ätzvorlagen ist hier zu finden: [[https://wiki.hackerspace-bremen.de/_media/projekte/hshb-swr-meter.zip|hshb-swr-meter.zip]]+Das Zip-Archiv mit Arduino-Code, Bestückungsanleitung, Fritzing-ProjektÄtzvorlagen und bebilderter Aufbauanleitung ist hier zu finden: [[https://wiki.hackerspace-bremen.de/_media/projekte/hshb-swr-meter.zip|hshb-swr-meter.zip]] (letzte Aktualisierung 03-Jan-2017)
  
 Für die Teile der SWR-Messbrücke gibt es einen [[https://www.reichelt.de/my/1292009|Reichelt-Warenkorb]]. \\ Für die Teile der SWR-Messbrücke gibt es einen [[https://www.reichelt.de/my/1292009|Reichelt-Warenkorb]]. \\
Zeile 22: Zeile 24:
 ===== Messbrücke ===== ===== Messbrücke =====
  
-**Der Aufbau dieses SWR-Meters basiert auf der [[http://dl6gl.de/amateurfunk/swr-messbruecke-mit-software-korrektur-der-diodenkennlinie|"SWR-Messbrücke mit Software-Korrektur der Diodenkennlinie" von Georg Latzel, DL6GL]].** \\ Da unser SWR-Meter jedoch auch mit 5V betrieben werden soll (=Arduino-VCC, USB-Spannung), haben wir ein paar Schaltungsänderungen gemacht:+**Der Aufbau dieses SWR-Meters basiert auf der [[https://dl6gl.de/swr-messbruecke-mit-software-korrektur-der-diodenkennlinie.html|"SWR-Messbrücke mit Software-Korrektur der Diodenkennlinie" von Georg Latzel, DL6GL]].** \\ Da unser SWR-Meter jedoch auch mit 5V betrieben werden soll (=Arduino-VCC, USB-Spannung), haben wir ein paar Schaltungsänderungen gemacht: 
   * 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-"Pulldowns" als Spannungsteiler an den nicht-invertierenden Eingängen. \\ Da der Arbeitsbereich des OpAmps durch die geringere Betriebsspannung eingeschränkt ist, wird die Messspannung (max 5V) halbiert. Da der OpAmp jedoch nicht nur bis 2.5V, sondern bis 3.8V verstärken kann, erhöht sich damit auch die maximal zu messende Leistung um ca. das 1,5fache. Das wird zwar im Arduino-Code nicht weiter umgerechnet, erhöht aber dennoch den maximalen möglichen Leistungsbereich.   * Ergänzen von 100kOhm-"Pulldowns" als Spannungsteiler an den nicht-invertierenden Eingängen. \\ Da der Arbeitsbereich des OpAmps durch die geringere Betriebsspannung eingeschränkt ist, wird die Messspannung (max 5V) halbiert. Da der OpAmp jedoch nicht nur bis 2.5V, sondern bis 3.8V verstärken kann, erhöht sich damit auch die maximal zu messende Leistung um ca. das 1,5fache. Das wird zwar im Arduino-Code nicht weiter umgerechnet, erhöht aber dennoch den maximalen möglichen Leistungsbereich.
-  * Entfernen des 4,7kOhm-Serienwiderstands am Ausgang. Da die Betriebsspannung halbiert wurde, ist eine Spannungsteilung für den darauf folgenden Microcontroller-Eingang nicht erforderlich und erhöht die Messgenauigkeit des AD-Wandlers. +  * Entfernen des 4,7kOhm-Serienwiderstands am Ausgang. Da die Betriebsspannung halbiert wurde, ist eine Spannungsteilung für den darauf folgenden Microcontroller-Eingang nicht erforderlich und erhöht die Messgenauigkeit des AD-Wandlers.
  
-Der Schaltplan, die Platine und die Bestückung sind hier zusammengefasst: [[https://wiki.hackerspace-bremen.de/_media/projekte/hshb-swr-koppler.pdf|hshb-swr-koppler.pdf]] \\  +Der Schaltplan, die Platine und die Bestückung sind hier zusammengefasst: [[https://wiki.hackerspace-bremen.de/_media/projekte/hshb-swr-koppler.pdf|hshb-swr-koppler.pdf]] \\ 
- +Die bebilderte Anleitung zum Aufbau des Messkopplers ist hier: [[https://wiki.hackerspace-bremen.de/_media/projekte/hshb-swr-meter.pdf|hshb-swr-meter.pdf]] (als fehlerhaft markierte Bilder werden noch ersetzt)
-//**TODO:** Fotos vom mechanischen Aufbau des Messkopplers//+
  
 ===== Arduino ===== ===== Arduino =====
Zeile 36: 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^  Pin Name^Arduino Pin| 
-| I2C-Textdisplay    | SDA | A4 | +|I2C-Textdisplay  |SDA|A4| 
- | SCL | A5 | +  |SCL|A5| 
- | VCC | 5V | +  |VCC|5V| 
- | GND | GND | +  |GND|GND| 
-| SWR-Messbrücke | F | A0 | +|SWR-Messbrücke|F|A0| 
-| | R | A1 | +| |R|A1| 
- | + | 5V | +  |+|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://dl6gl.de/amateurfunk/swr-messbruecke-mit-software-korrektur-der-diodenkennlinie|Korrektur der Diodenkennlinie]] (Leseempfehlung!). \\ +
-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, bin ich für jeden Tip per Mail an danielwf@hackerspace-bremen.de dankbar - man lernt ja schließlich nie aus ;)  \\+
  
 +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://dl6gl.de/amateurfunk/swr-messbruecke-mit-software-korrektur-der-diodenkennlinie|Korrektur der Diodenkennlinie]] (Leseempfehlung!). \\
 +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, bin ich für jeden Tip per Mail an dl2ab@darc.de dankbar - man lernt ja schließlich nie aus ;) \\
 Folgende Parameter sind von jedem selbst noch anzupassen: Folgende Parameter sind von jedem selbst noch anzupassen:
-  * Die I²C-Adresse (und ggf. abweichende Pinbelegung) bei "LiquidCrystal_I2C lcd( ..." 
-  * 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 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" anzeigt. \\ +  * Die I²C-Adresse (und ggf. abweichende Pinbelegung) bei "LiquidCrystal_I2C lcd( …" 
-Wie bei allen anderen SWR-Metern ist hier dann aber der Nachteil, dass der SWR-Wert bei unterschiedlichen Leistungen leicht abweichend ist (z.B. -0.15 bei 15W statt 50W), da die Diodenkennlinie sich bemerkbar macht. \\ Wer diese Korrektur wünscht, kann sie mit "bool diodeCorr = 1;" vornehmen, verzichtet damit aber auch auf die Vergleichbarkeit mit konventionellen SWR-Metern. \\ Für die Leistungsmessung wird immer der genauere Kennlinien-korrigierte Wert genommen.+  * 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 'powerF' und 'swr'. Wer statt einem Textdisplay lieber eine andere Anzeige benutzen will (z.B. 7Segment, Nixie-Röhren oder zwei 8×8-LED-Bausteine), braucht nur den Code für das Textdisplay rauszuschmeißen und durch seinen eigenen zu ergänzen. 
 + 
 +* 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" anzeigt. \\ Wie bei allen anderen SWR-Metern ist hier dann aber der Nachteil, dass der SWR-Wert bei unterschiedlichen Leistungen leicht abweichend ist (z.B. -0.15 bei 15W statt 50W), da die Diodenkennlinie sich bemerkbar macht. \\ Wer diese Korrektur wünscht, kann sie mit "bool diodeCorr = 1;" vornehmen, verzichtet damit aber auch auf die Vergleichbarkeit mit konventionellen SWR-Metern. \\ Für die Leistungsmessung wird immer der genauere Kennlinien-korrigierte Wert genommen.
  
-**Arduino-Sketch** SWR-Example.ino (Arduino 1.6.9, Stand 21.12.2016)+**Arduino-Sketch**  SWR-Example.ino (Arduino 1.6.9, Stand 03.01.2017, ist auch im oben verlinkten Zip-Archiv enthalten)
  
 <code c> <code c>
Zeile 68: Zeile 69:
 //     by Daniel Wendt-Fröhlich, DL2AB (BugReports/Changes to danielwf@hackerspace-bremen.de, dl2ab@darc.de) for //     by Daniel Wendt-Fröhlich, DL2AB (BugReports/Changes to danielwf@hackerspace-bremen.de, dl2ab@darc.de) for
 //          "Hackerspace Bremen e.V." https://hackerspace-bremen.de / HSHB Amateur Radio Group http://hshb.de/afu //          "Hackerspace Bremen e.V." https://hackerspace-bremen.de / HSHB Amateur Radio Group http://hshb.de/afu
-//     License CC-by-SA 3.0 - Nov-Dec 2016 - Bremen(GER) -- http://creativecommons.org/licenses/by-sa/3.0/de/ +//     License CC-by-SA 3.0 - 11/2016-01/2017 - Bremen(GER) -- http://creativecommons.org/licenses/by-sa/3.0/de/ 
 // //
 // //
Zeile 96: Zeile 97:
 LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);       // Set the LCD I2C address, SainSmartLCD2004 0x3F, maybe try 0x38 or 0x20 or 0x27 LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);       // Set the LCD I2C address, SainSmartLCD2004 0x3F, maybe try 0x38 or 0x20 or 0x27
 bool DisplayRefresh = 1;                           bool DisplayRefresh = 1;                          
 +unsigned long printMillis = 0;
 +unsigned long serialMillis = 0;
 +
  
 //     ---------------------------------------------SWR-Meter-Parameters------------------------------------------------------- //     ---------------------------------------------SWR-Meter-Parameters-------------------------------------------------------
  
 // Configuration // Configuration
-int maxPower = 50;                                 // maximum Power in Watt (incl. corrections) , maxPower = (5*N/1.414)² * 50ohm | [N=7 windings on coupler => 10W] [N=9=>20W] [N=14=>50W] [N=20=>100W] [N=28=>200W]  +int maxPower = 90;                                 // maximum Power in Watt (incl. corrections) , maxPower = (5*N/1.414)² * 50ohm | [N=7 windings on coupler => 10W] [N=9=>20W] [N=14=>50W] [N=20=>100W] [N=28=>200W]  
 int swrFpin = 0;                                   // SWR-Coupler Connections int swrFpin = 0;                                   // SWR-Coupler Connections
 int swrRpin = 1; int swrRpin = 1;
Zeile 161: Zeile 165:
   delay(2000);    delay(2000); 
   lcd.clear();      lcd.clear();   
 +
  
 } }
Zeile 172: Zeile 177:
  
   readMeter();   readMeter();
-  Serial.print(powerF,0); + 
-  Serial.print(" Watt; SWR "); +  if (powerF > powerPeakpowerPeak = powerF
-  Serial.println(swr,2); +  if (printMillis < millis() ) { 
-   +    lcd.setCursor(0,0);                              // LCD Output 1st line for Power 
-  lcd.setCursor(0,0);                              // LCD Output 1st line for Power +    lcd.print("PWR ");                               //  
-  lcd.print("PWR ");                               //  +    if (powerPeak<100)lcd.print(" ");                   // clears empty spaces for smaller values and   
-  if (powerF<100)lcd.print(" ");                   // clears empty spaces for smaller values and   +    if (powerPeak<10)lcd.print(" ");                    //  moves value for fixed position 
-  if (powerF<10)lcd.print(" ");                    //  moves value for fixed position +    lcd.print(powerPeak,0);                             // print power  
-  lcd.print(powerF,0);                             // print power  +    lcd.print("W "); 
-  lcd.print("W ");+     
 +    char wattMeter[7] = "       ";                   // meter for power, cleared array 
 +    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,0); lcd.print(wattMeter);
      
-  char wattMeter[7] = "       ";                   // meter for power, cleared array 
-  for (byte i=1; i<=6; i++) { 
-    if (powerF > (i * maxPower/7) ) wattMeter[i-1] = (char)0xFF; 
-  } 
-  if (powerF > maxPower) wattMeter[6] = '!'; 
-  lcd.setCursor(9,0); lcd.print(wattMeter); 
  
-  lcd.setCursor(0,1); lcd.print("SWR ");            // LCD Output 2nd line for SWR +    lcd.setCursor(0,1); lcd.print("SWR ");            // LCD Output 2nd line for SWR 
-  if (swr < 0.1 ) swr = 0;                          // needed for disconnected SWR-bridge +    if (swr < 0.1 ) swr = 0;                          // needed for disconnected SWR-bridge 
-  if (swr > 9.99) {lcd.setCursor(4,1); lcd.print(">10!");           // if SWR > 10 - usually if SWR-bridge is disconnected +    if (swr > 9.99) {lcd.setCursor(4,1); lcd.print(">10!");           // if SWR > 10 - usually if SWR-bridge is disconnected 
-  if (swr <= 9.99) {lcd.setCursor(4,1); lcd.print((float)swr,2);    // print SWR-value+    if (swr <= 9.99) {lcd.setCursor(4,1); lcd.print((float)swr,2);    // print SWR-value 
 + 
 +    char swrMeter[7] = "       ";                     // meter for swr, cleared array 
 +    if (swr > 1,2 ) swrMeter[0]=(char)0xFF; 
 +    for (byte i=1;i<=6; i++) { 
 +      if (swr > ((i*0.5)+1)){ 
 +        swrMeter[i] = (char)0xFF; 
 +        if (3 <= ((i*0.5)+1)) swrMeter[i] = '!'; 
 +      }
  
-  char swrMeter[7] = "       ";                     // meter for swr, cleared array 
-  if (swr > 1,2 ) swrMeter[0]=(char)0xFF; 
-  for (byte i=1;i<=6; i++) { 
-    if (swr > ((i*0.5)+1)){ 
-      swrMeter[i] = (char)0xFF; 
-      if (3 <= ((i*0.5)+1)) swrMeter[i] = '!'; 
     }     }
 +    lcd.setCursor(9,1); lcd.print(swrMeter);
  
 +    printMillis = millis() + 200;
 +    powerPeak = 0;
 +
 +    if (powerF > 0){
 +      Serial.print(powerF,0);
 +      Serial.print(" Watt; SWR ");
 +      Serial.println(swr,2);
 +    }
   }   }
-  lcd.setCursor(9,1); lcd.print(swrMeter); +  
-  delay(200);+
      
 } }
- 
- 
  
 </code> </code>
 +
 +\\
  
  
projekte/swr-meter_kurzwelle.1482355310.txt.gz · Zuletzt geändert: 2022-11-17 22:34 (Externe Bearbeitung)