亲,“电路城”已合并升级到更全、更大、更强的「新与非网」。点击查看「新与非网」

本网页已闲置超过3分钟,按键盘任意键或点击空白处,即可回到网页

DIY简单方波发生器,高达1MHz

发布时间:2021-02-19
分享到:

DIY简单方波发生器,高达1MHz

发布时间:2021-02-19
分享到:

这是一个简单的方波发生器,主要使用TimerOne库,可让您在引脚9产生PWM信号。

硬件部件:

  • Arduino Nano R3    ×    1个    
  • Adafruit标准LCD-16x2蓝色白色×    1个    
  • 按钮开关,瞬间    ×    3    
  • 单圈电位器-10k欧姆×    1个    

软件应用程序和在线服务:

  • Arduino IDE    

这是一个简单的方波发生器,主要使用TimerOne库,使您可以在引脚9处生成PWM信号,范围约为5Hz至1 Mhz,并且可以将占空比从0调整到100%。

原理图:

设备非常易于构建,仅包含几个组件:

  • Arduino Nano微控制器
  • 液晶显示器
  • 三个上拉电阻
  • 三个按钮

脉冲发生器可以使用连接到Arduino数字输入6和7的按钮来调整脉冲重复周期。13个输入引脚可让您调整占空比。持续时间和占空比读数显示在LCD 16×2指示器的第一行中,频率读数显示在第二行中。调整脉冲重复周期的最小步长是1μs,因此频率将离散变化,例如1μs是1 MHz,2μs是500 kHz,3μs是333.333 Hz,依此类推,并且随着频率的降低,其调整的平滑度增加。这在较高的频率上是不切实际的,但这就是简化的代价。

为了可视化输出信号,我使用了小型单通道示波器。最后,将设备安装在合适的盒子中,这是电子实验室中的另一个有用工具。

源码:

#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 duration is equal to duty cycle k = 512 (50%)
byte k1,kn,kn1,kn2;
int drive,drive0;

void setup()
{
  lcd.begin(16, 2);// LCD 16X2
  pinMode(10, 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. We remove the signal from the output 9
  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 period x10 x100 x1000 is accelerated
    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 period x10 x100 x1000 is accelerated
    }
    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 0 μs or more than 300 ms (3.33 Hz), then the period is 1 μs
    t=1;
  }
  if(t>200000 && t<300000){ // limiting the pulse duration to the maximum, if more than 200 ms, but less than 300 ms (3.33 Hz), then the period is 200 ms (5 Hz)
    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 50 to 100%, then from 0 to 100%)
    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("                ");
}

 

加入微信技术交流群

技术交流,职业进阶

关注与非网服务号

获取电子工程师福利

加入电路城 QQ 交流群

与技术大牛交朋友

讨论