Industrial manufacturing
Industrial Internet of Things | Industrial materials | Equipment Maintenance and Repair | Industrial programming |
home  MfgRobots >> Industrial manufacturing >  >> Manufacturing Technology >> Manufacturing process

DIY 1 MHz Square Wave Generator with Arduino Nano – Easy PWM Circuit

Components and supplies

DIY 1 MHz Square Wave Generator with Arduino Nano – Easy PWM Circuit
Arduino Nano R3
×1
DIY 1 MHz Square Wave Generator with Arduino Nano – Easy PWM Circuit
Adafruit Standard LCD - 16x2 White on Blue
×1
DIY 1 MHz Square Wave Generator with Arduino Nano – Easy PWM Circuit
Pushbutton Switch, Momentary
×3
DIY 1 MHz Square Wave Generator with Arduino Nano – Easy PWM Circuit
Single Turn Potentiometer- 10k ohms
×1

Apps and online services

DIY 1 MHz Square Wave Generator with Arduino Nano – Easy PWM Circuit
Arduino IDE

About this project

This is a simple square-wave generator that basically uses the TimerOne library allow you to generate a PWM signal at pin 9 in the range from about 5Hz to 1 Mhz, and you can adjust the duty cycle from 0 to 100%.

Device is very simple to build and consist only a few components:

- Arduino Nano microcontroller

- LCD display

- Three pull up resistors

- and three push buttons

DIY 1 MHz Square Wave Generator with Arduino Nano – Easy PWM Circuit

The pulse generator has the ability to adjust the pulse repetition period using the buttons connected to digital inputs 6 and 7 of the Arduino. 13 input pin allows you to adjust the duty cycle. The duration and duty cycle readings are displayed on the first row of the LCD 16 × 2 indicator, and the frequency readings are displayed in the second row. The minimum step for adjusting the pulse repetition period is 1 μs, so the frequency will change discretely, for example, 1 μs is 1 MHz, 2 μs is 500 kHz, 3 μs is 333.333 Hz, and so on, and as the frequency decreases, the smoothness of its adjustment increases. This is quite impractical at higher frequencies but that is the price of simplicity. In one of my previous videos I have described the construction of a similar device but with the help of a specialized DDS chip that does not have these shortcomings and has a much larger range, but is more complex to build

To visualize the output signal I use small single- channel oscilloscope. Finally, the device is mounted in a suitable box, and it is another useful tool in the electronics laboratory.

Code

  • Arduino code
Arduino codeC/C++
#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), meander, pulse 


byte k1,kn,kn1,kn2;
int drive,drive0;

void setup()
{ 
  lcd.begin(16, 2);// LCD 16X2
  pinMode(9, OUTPUT);
  pinMode(6,INPUT);// button at input 6
  pinMode(7,INPUT);// button at input 7 
  pinMode(13,INPUT);// button at input 13
}
void loop()
{
  Timer1.initialize(t); // period    
  Timer1.pwm(9, k); // k - fill factor 0-1023. 
  kn=digitalRead(6);// button input 6 (- pulse period) 
  kn1=digitalRead(7);// button input 7 (+ pulse period)
  kn2=digitalRead(13);// button input 13 (+ circle fill factor)

  if(kn==HIGH){ // decreasing the period 
    drive++;
    if(drive<30){ 
      t=t-1;  
    }
    // if the button is held for a long time, the correction of the pulse 


    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){// adding a period 
    drive0++;
    if(drive0<30){
      t=t+1; 
      // if the button is held for a long time, the correction of the 


    }
    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){ // limiting the pulse duration to the minimum, if 


    t=1;
  }
  if(t>200000 && t<300000){ // limiting the pulse duration to the 




    t=200000;
  } 
  f=1000000/t; // calculate the frequency 
  k1=k*100/1024; // calculate% fill factor

  if(kn2==HIGH){// button for adjusting the fill factor (in a circle from 


    k=k+16;// step 16 out of 1024 (you can do 8 for smoother adjustment)
  }
  if(k==1024){
    k=0;
  }
// displaying information on the indicator
  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("                ");
}

Schematics

DIY 1 MHz Square Wave Generator with Arduino Nano – Easy PWM Circuit

Manufacturing process

  1. Understanding Square Wave Signals: Fundamentals and Applications
  2. DIY Arduino Word Clock – Build a Sleek Real-Time Display
  3. Build a 20 kHz Arduino Oscilloscope on a Nokia 5110 LCD – Easy DIY Guide
  4. JX Wave Generator – Arduino-Compatible DDS Oscillator with OLED Display
  5. Build a Precise DIY Measuring Wheel with Arduino Nano & Rotary Encoder
  6. Effortless Arduino Stopwatch: Build a Button-Activated Chronometer
  7. Build a Sensitive Metal Detector with Arduino Nano – DIY Guide
  8. Build a Complete Arduino‑Powered RC Airplane from Scratch
  9. Build an Arduino‑Powered RC Hovercraft: Full 3D‑Printed Design & Programming Guide
  10. Build a Multifunctional Arduino RC Transmitter: Step‑by‑Step DIY Guide