Generador de onda cuadrada 1 MHz DIY con Arduino Nano – Circuito PWM fácil
Componentes y suministros
| Arduino Nano R3 | × | 1 |
| Pantalla LCD 16×2 (blanco sobre azul, estándar Adafruit) | × | 1 |
| Pulsadores momentáneos | × | 3 |
| Potenciómetro monovuelta 10 kΩ | × | 1 |
Aplicaciones y servicios en línea
- Arduino IDE
Sobre este proyecto
Este es un generador de onda cuadrada simple que utiliza la librería TimerOne para generar una señal PWM en el pin 9, en un rango de aproximadamente 5 Hz a 1 MHz, con ciclo de trabajo ajustable del 0 al 100 %.
El dispositivo es muy sencillo de construir y consta solo de unos pocos componentes:
- Microcontrolador Arduino Nano
- Pantalla LCD
- Tres resistencias pull-up
- Tres pulsadores

El generador permite ajustar el período de repetición del pulso mediante los botones conectados a las entradas digitales 6 y 7 del Arduino. El pin 13 permite ajustar el ciclo de trabajo. La duración y el ciclo de trabajo se muestran en la primera fila del LCD 16×2, y la frecuencia en la segunda. El paso mínimo para ajustar el período es 1 µs, por lo que la frecuencia cambia de forma discreta: 1 µs = 1 MHz, 2 µs = 500 kHz, 3 µs = 333,333 Hz, etc. A medida que la frecuencia disminuye, la suavidad del ajuste aumenta. Esto es poco práctico a frecuencias altas, pero es el precio de la simplicidad. En un vídeo anterior describí la construcción de un dispositivo similar pero con un chip DDS especializado que no tiene estos inconvenientes y tiene un rango mucho mayor, aunque es más complejo de construir.
Para visualizar la señal de salida uso un pequeño osciloscopio monocanal. Finalmente, el dispositivo se monta en una caja adecuada, convirtiéndose en otra herramienta útil en el laboratorio de electrónica.
Código
Código Arduino
#include <TimerOne.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // RS, E, D4, D5, D6, D7
unsigned long t = 1000, f, k = 512; // default 1000 µs (1000 Hz), meandro, pulso
byte k1, kn, kn1, kn2;
int drive, drive0;
void setup() {
lcd.begin(16, 2); // LCD 16×2
pinMode(9, OUTPUT);
pinMode(6, INPUT); // botón en entrada 6 (- período)
pinMode(7, INPUT); // botón en entrada 7 (+ período)
pinMode(13, INPUT); // botón en entrada 13 (+ ciclo de trabajo)
}
void loop() {
Timer1.initialize(t); // período
Timer1.pwm(9, k); // k - factor de llenado 0-1023
kn = digitalRead(6); // botón entrada 6 (- período)
kn1 = digitalRead(7); // botón entrada 7 (+ período)
kn2 = digitalRead(13); // botón entrada 13 (+ ciclo de trabajo)
if (kn == HIGH) { // disminuir período
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) { // aumentar período
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) { // limitar duración del pulso al mínimo
t = 1;
}
if (t > 200000 && t < 300000) { // limitar duración del pulso
t = 200000;
}
f = 1000000 / t; // calcular frecuencia
k1 = k * 100 / 1024; // calcular % ciclo de trabajo
if (kn2 == HIGH) { // botón para ajustar ciclo de trabajo (en círculo)
k = k + 16; // paso 16 de 1024 (puedes usar 8 para ajuste más suave)
}
if (k == 1024) {
k = 0;
}
// Mostrar información en el 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(" ");
}
Esquemáticos

Proceso de manufactura
- Construya su propio LUMAZOID: Visualizador de música DIY con Arduino
- Reloj de Palabras DIY con Arduino: Construye una Pantalla Elegante en Tiempo Real
- Construya un osciloscopio Arduino de 20 kHz en LCD Nokia 5110: Guía DIY fácil
- Construye un Voltímetro Inteligente con Arduino y Smartphone – Proyecto DIY Fácil
- Generador de Ondas JX – Oscilador DDS Compatible con Arduino con Pantalla OLED
- Sensor de obstáculos IR casero con Arduino – Tutorial fácil con LED IR y fotodiodo
- Construye un Skateboard VR Casero con Arduino, Google Cardboard y Bluetooth
- Calculadora Básica con Arduino UNO - Proyecto Fácil para Principiantes
- Construir una rueda medidora DIY precisa con Arduino Nano y encoder rotativo
- Cronómetro Arduino Sencillo: Activado por Botón con EEPROM e Interrupciones
- Comprender Señales de Onda Cuadrada: Fundamentos y Aplicaciones