Zelfbouw 1 MHz blokgolfgenerator met Arduino Nano – Eenvoudig PWM-circuit
Onderdelen en benodigdheden
| Onderdeel | Aantal |
|---|---|
| Arduino Nano R3 | 1 |
| Adafruit Standard LCD - 16x2 Wit op Blauw | 1 |
| Drukknoppen (momentary) | 3 |
| Enkelvoudige potentiometer - 10k ohm | 1 |
Apps en online diensten
- Arduino IDE
Over dit project
Dit is een eenvoudige blokgolfgenerator die de TimerOne-bibliotheek gebruikt om een PWM-signaal te genereren op pin 9 in het bereik van ongeveer 5 Hz tot 1 MHz, met een instelbare duty cycle van 0 tot 100%.
Het apparaat is heel simpel te bouwen en bestaat uit slechts een paar componenten:
- Arduino Nano microcontroller
- LCD-display
- Drie pull-up weerstanden
- Drie drukknoppen

De pulsengenerator kan de pulsherhalingsperiode instellen met de knoppen aangesloten op digitale ingangen 6 en 7 van de Arduino. Ingang 13 stelt de duty cycle in. De duur en duty cycle worden op de eerste rij van de 16x2 LCD weergegeven, de frequentie op de tweede rij. De minimale stap voor het aanpassen van de pulsherhalingsperiode is 1 μs, waardoor de frequentie discret verandert: 1 μs = 1 MHz, 2 μs = 500 kHz, 3 μs = 333,333 Hz, enzovoort. Naarmate de frequentie daalt, neemt de gladheid van de instelling toe. Dit is bij hogere frequenties wat minder praktisch, maar dat is de prijs van eenvoudigheid. In een eerdere video beschreef ik een vergelijkbaar apparaat met een gespecialiseerde DDS-chip die deze tekortkomingen niet heeft en een veel groter bereik bezit, maar complexer te bouwen is.
Om het uitgangssignaal te visualiseren gebruik ik een kleine einkanaals oscilloscoop. Uiteindelijk is het apparaat in een geschikte behuizing gemonteerd en is het een nuttig hulpmiddel in de elektronicalaboratorium.
Code
Arduino code
#include
#include
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // RS,E,D4,D5,D6,D7
unsigned long t = 1000, f, k = 512; // standaard 1000 μs (1000 Hz), blokgolf, puls
byte k1, kn, kn1, kn2;
int drive, drive0;
void setup() {
lcd.begin(16, 2); // LCD 16x2
pinMode(9, OUTPUT);
pinMode(6, INPUT); // knop op ingang 6 (- pulsperiode)
pinMode(7, INPUT); // knop op ingang 7 (+ pulsperiode)
pinMode(13, INPUT); // knop op ingang 13 (+ duty cycle)
}
void loop() {
Timer1.initialize(t); // periode
Timer1.pwm(9, k); // k - vulfactor 0-1023
kn = digitalRead(6); // knop ingang 6 (- pulsperiode)
kn1 = digitalRead(7); // knop ingang 7 (+ pulsperiode)
kn2 = digitalRead(13); // knop ingang 13 (+ duty cycle)
if (kn == HIGH) { // periode verkleinen
drive++;
if (drive < 30) t = t - 1;
else if (drive > 30 && drive < 60) t = t - 10;
else if (drive >= 60 && drive < 100) t = t - 100;
else if (drive >= 100) t = t - 1000;
} else {
drive = 0;
}
if (kn1 == HIGH) { // periode vergroten
drive0++;
if (drive0 < 30) t = t + 1;
else if (drive0 > 30 && drive0 < 60) t = t + 10;
else if (drive0 >= 60 && drive0 < 100) t = t + 100;
else if (drive0 >= 100) t = t + 1000;
} else {
drive0 = 0;
}
if (t == 0 || t > 300000) t = 1; // limiet minimum pulsduur
if (t > 200000 && t < 300000) t = 200000; // limiet maximum pulsduur
f = 1000000 / t; // frequentie berekenen
k1 = k * 100 / 1024; // duty cycle percentage berekenen
if (kn2 == HIGH) { // knop voor duty cycle aanpassen (cirkel)
k = k + 16; // stap 16 uit 1024 (kunt 8 maken voor gladder)
}
if (k == 1024) k = 0;
// Informatie tonen op display
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);
lcd.setCursor(0, 0);
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print(" ");
}
Schema's
Productieproces
- Bouw Je Eigen LUMAZOID: Een DIY Arduino Muziek Visualizer
- DIY Arduino Woordklok – Bouw een Elegant Real-Time Display
- Bouw een 20 kHz Arduino Oscilloscoop op een Nokia 5110 LCD – Eenvoudige DIY Handleiding
- Een slimme voltmeter bouwen met Arduino en smartphone – Eenvoudig DIY-project
- JX Wave Generator – Arduino-compatibele DDS-oscillator met OLED-display
- Een eenvoudige obstakelsensor bouwen met Arduino – IR LED & Fotodiodo Tutorial
- Bouw een DIY VR-skateboard met Arduino, Google Cardboard en Bluetooth
- Bouw een eenvoudige rekenmachine met Arduino UNO – Makkelijk project
- Een nauwkeurig meetwieltje bouwen met Arduino Nano en draaiencoder
- Eenvoudige Arduino Stopwatch: Knop-geactiveerde Chronometer
- Blokgolf Signalen Begrijpen: Fundamenten en Toepassingen