DIY 1-MHz-Rechteckgenerator mit Arduino Nano – Einfache PWM-Schaltung
Komponenten und Materialien
| Bauteil | Menge | Hinweise |
|---|---|---|
| Arduino Nano R3 | 1 | |
| LCD-Display 16×2 (weiß auf blau) | 1 | Adafruit Standard |
| Taster (Momentan) | 3 | |
| Potentiometer 10 kΩ (Einmal-Drehung) | 1 |
Software und Online-Dienste
- Arduino IDE
Projektbeschreibung
Dies ist ein einfacher Rechteckwellengenerator, der die TimerOne-Bibliothek nutzt, um an Pin 9 ein PWM-Signal im Bereich von ca. 5 Hz bis 1 MHz zu erzeugen. Der Duty-Cycle lässt sich von 0 bis 100 % einstellen.
Der Aufbau ist sehr simpel und besteht nur aus wenigen Bauteilen:
- Arduino Nano Mikrocontroller
- LCD-Display
- Drei Pull-Up-Widerstände (für die Taster)
- Drei Taster
Bedienung und Funktionsweise
- Taster an Pin 6: Verringert die Periodendauer (erhöht Frequenz)
- Taster an Pin 7: Erhöht die Periodendauer (verringert Frequenz)
- Taster an Pin 13: Ändert den Duty-Cycle (in Schritten von 16/1024)
Die Anzeige auf dem LCD (16×2) zeigt:
- Obere Zeile: Periodendauer
T=xxxx µsund Duty-Cyclexx % - Untere Zeile: Frequenz
F=xxxx Hz
Der minimalste Schritt bei der Periodendauer beträgt 1 µs. Dadurch ändert sich die Frequenz diskret: 1 µs = 1 MHz, 2 µs = 500 kHz, 3 µs = 333,333 kHz usw. Bei niedrigeren Frequenzen wird die Einstellung feiner. Dies ist bei hohen Frequenzen etwas unpraktisch, aber der Preis für die Einfachheit.
In einem früheren Projekt habe ich einen ähnlichen Generator mit einem spezialisierten DDS-Chip gebaut, der diese Nachteile nicht hat und einen größeren Bereich bietet, aber komplexer aufzubauen ist.
Zur Visualisierung des Ausgangssignals nutze ich ein kleines einkanaliges Oszilloskop. Schließlich wird das Gerät in ein passendes Gehäuse eingebaut und ist ein weiteres nützliches Werkzeug in der Elektronik-Werkstatt.
Code
#include <TimerOne.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // RS, E, D4, D5, D6, D7
unsigned long t = 1000; // Periodendauer in µs (Default 1000 µs = 1 kHz)
unsigned long f; // Frequenz
unsigned long k = 512; // Duty-Cycle (0-1023), Default 50%
byte kn, kn1, kn2; // Tasterzustände
int drive = 0, drive0 = 0; // Zähler für langes Drücken
void setup() {
lcd.begin(16, 2);
pinMode(9, OUTPUT); // PWM-Ausgang
pinMode(6, INPUT); // Taster - Periode
pinMode(7, INPUT); // Taster + Periode
pinMode(13, INPUT); // Taster Duty-Cycle
}
void loop() {
Timer1.initialize(t); // Periode setzen
Timer1.pwm(9, k); // PWM mit Duty-Cycle k
kn = digitalRead(6); // Taster Pin 6
kn1 = digitalRead(7); // Taster Pin 7
kn2 = digitalRead(13); // Taster Pin 13
// --- Periode verringern (Frequenz erhöhen) ---
if (kn == HIGH) {
drive++;
if (drive < 30) t -= 1;
else if (drive < 60) t -= 10;
else if (drive < 100) t -= 100;
else t -= 1000;
} else {
drive = 0;
}
// --- Periode erhöhen (Frequenz verringern) ---
if (kn1 == HIGH) {
drive0++;
if (drive0 < 30) t += 1;
else if (drive0 < 60) t += 10;
else if (drive0 < 100) t += 100;
else t += 1000;
} else {
drive0 = 0;
}
// Begrenzung der Periodendauer
if (t == 0 || t > 300000) t = 1;
if (t > 200000 && t < 300000) t = 200000;
f = 1000000 / t; // Frequenz in Hz berechnen
int k1 = k * 100 / 1024; // Duty-Cycle in %
// --- Duty-Cycle ändern ---
if (kn2 == HIGH) {
k += 16; // Schrittweite 16/1024 (für feiner: 8)
if (k == 1024) k = 0; // Überlauf
}
// --- LCD-Anzeige aktualisieren ---
lcd.setCursor(0, 0);
lcd.print("T=");
lcd.print(t);
lcd.print(" us");
lcd.setCursor(12, 0);
lcd.print(k1);
lcd.print(" %");
lcd.setCursor(0, 1);
lcd.print("F=");
lcd.print(f);
lcd.print(" Hz");
delay(300);
// Anzeige kurz löschen (Flackern vermeiden)
lcd.setCursor(0, 0);
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print(" ");
}
Schaltplan
Herstellungsprozess
- Rechteckwellensignale verstehen: Grundlagen und Anwendungen
- Eigenen LUMAZOID bauen: DIY Arduino Musik-Visualisierer
- DIY Arduino Word Clock – Elegante Wortuhr mit RTC & Schieberegistern
- 20-kHz-Arduino-Oszilloskop mit Nokia 5110 LCD – Einfacher DIY-Bau
- Intelligentes Voltmeter mit Arduino & Smartphone bauen – Einfaches DIY-Projekt
- JX Wave Generator – Arduino-kompatibler DDS-Oszillator mit OLED-Display
- Einfachen Hindernissensor mit Arduino bauen – IR-LED & Photodiode Tutorial
- DIY VR-Skateboard mit Arduino, Google Cardboard und Bluetooth bauen
- Einfacher Taschenrechner mit Arduino UNO – Einsteigerprojekt
- Präzises DIY-Messrad mit Arduino Nano und Drehgeber