Search This Blog

Friday, August 10, 2018

DIY Programmable Function Generator Using Arduino Uno

Arduino Uno ကို function generator အနေ နဲ့ သုံးပြီး လိုချင် တဲ့ low frequency waveform တွေကို စိတ်ကြိုက် ထုတ်နိုင် ပါတယ်။ သူ့ရဲ့ အားသာချက် က လိုသလို ပရိုဂရမ် ရေးပြီး စိတ်ကြိုက် customize အမျိုးမျိုး ထုတ်နိုင်၊ အချိန် အလိုက် ပြောင်းနိုင် တာဖြစ်ပြီး၊ အားနည်း ချက်ကတော့ အရမ်း မြင့်တဲ့ frequency တွေကို ထုတ် မပေးနိုင် တာ ဖြစ်ပါတယ်။ Arduino ရဲ့ analog output က pwm သုံးထား တာမို့ ရလဒ် ပိုကောင်းအောင်၊ pwm frequency ကို 8 kHz လောက် ပြောင်းထား ပါတယ်။ ဒီထက် ရလဒ် ပိုကောင်း ချင်ရင် DAC နဲ့ တွဲသုံး လို့လည်း ရပါတယ်။


Figure. Arduino function generator ၏ အထွက်ကို oscilloscope ဖြင့် တိုင်းတာ ရရှိပုံ။


Arduino ကို Function generator အနေနဲ့ သုံးဖို့ အတွက် လိုင်ဘရီ လေးတစ်ခု ရေးထား ပါတယ်။ သူက Pin3 ကနေ waveform တွေကို ထုတ်ပေး နိုင် သလို analog input A0 နဲ့ A1 ကို ဖတ်ပြီး၊ serial plotter မှာ ပြန်ကြည့် လို့ ရအောင် baud rate 115200 နဲ့ print ထုတ်ပေး ပါတယ်။ Function generator ကို Arduino code မှာ ထည့်သုံး ချင်ရင် အောက်က အဆင့် တွေ အတိုင်း ထည့်သုံး နိုင် ပါတယ်။

Step 1

ပရိုဂရမ် ရှိတဲ့ folder မှာ
CE_FGen.h (https://github.com/yan9a/arduino/blob/master/Function_Generator/CE_FGen.h)
ဆိုတဲ့ လိုင်ဘရီ ဖိုင်ကို ကူးထည့်ထား ပါမယ်။

Step 2

Arduino program ရဲ့ အစမှာ
#include "CE_FGen.h"
CE_FGen fg;

ဆိုပြီး ဖိုင်ကို include လုပ်၊ ပြီးရင် သူ့ရဲ့ instance တစ်ခု ကြေငြာ လိုက်ပါမယ်။

Step 3

Setup မှာ
void setup() {  
  fg.Begin(500); // ( sampling_freq )
  fg.Set(CE_SINUSOIDAL,5,1,1); // ( waveform , wave_freq , v_peak2peak , v_average )
}
ဆိုပြီး ထုတ်မယ့် waveform အတွက် sampling frequency တစ်ခု နဲ့ initialize လုပ်လိုက် ပါမယ်။ ဒီ နမူနာ မှာ တော့ sampling frequency ကို 500 Hz သုံးလိုက် ပါတယ်။ ပြီးရင် ထုတ်ချင်တဲ့ waveform ပုံစံ၊ ထွက်လာ မယ့် wave ရဲ့ frequency ၊ peak to peak voltage တန်ဖိုး၊ ပျမ်းမျှ voltage (offset တန်ဖိုး) တွေကို Set ဆိုတဲ့ method နဲ့ သတ်မှတ် လိုက်ပါတယ်။ သုံးလို့ ရတဲ့ waveform ပုံစံ တွေက
  • CE_HARMONIC
  • CE_SAWTOOTH
  • CE_SINUSOIDAL
  • CE_SQUARE
  • CE_TRIANGULAR
တွေပါ။

Step 4

Loop ထဲမှာ
void loop() {
  fg.Poll(); 
}
ဆိုပြီး Poll ဆိုတဲ့ method ကို ခေါ်နေ မယ် ဆိုရင်၊ သတ်မှတ် ထားတဲ့ sampling rate နဲ့ waveform ကို ထုတ်ပေး မှာ ဖြစ်ပါတယ်။

Test Program

ရလာ တဲ့ နမူနာ test program ကို အောက်မှာ ပြထား ပါတယ်။
#include "CE_FGen.h"
CE_FGen fg;
void setup() {  
  fg.Begin(500); // ( sampling_freq )
  fg.Set(CE_SINUSOIDAL,5,1,1); // ( waveform , wave_freq , v_peak2peak , v_average )
}
void loop() {
  fg.Poll(); 
}


Waveform တွေကို အမျိုးမျိုး တစ်လှည့်စီ ထုတ်ပေးတဲ့ နောက်ထပ် နမူနာ တစ်ခု ကို အောက်က လင့်ခ်မှာ တွေ့နိုင် ပါတယ်။
Function_Generator.ino (https://github.com/yan9a/arduino/blob/master/Function_Generator/Function_Generator.ino)


Test Circuit

Function generator ကို စမ်းကြည့် ဖို့အတွက် small signal N channel MOSFET လေး တစ်ခု ကို common source configuration နဲ့ ချိတ်ပြီး၊ waveform input တွေပေး ၊ ပြီးတော့ ထွက်လာ တဲ့ inverted output နဲ့ gate voltage အဝင် တွေကို A0 , A1 တို့နဲ့ ဖတ်ပြီး serial plotter နဲ့ 115200 baud rate ထားပြီး ကြည့် ကြည့် ပါမယ်။ အဲဒီ test circuit ကို အောက်က အတိုင်း ဆက်ထား ပါတယ်။


Figure. Test circuit



Figure. Schematic diagram for the test circuit


ချိတ်ဆက် ပြီးတဲ့ အခါ potentiometer လေးကို လှည့်ပြီး drain quiescent output voltage ကို အထွက် ရဲ့ အလယ်နား 3 V ဝန်းကျင် ဖြစ်အောင် ချိန်လိုက် ပါမယ်။ အဲဒီ နောက် function generator ရဲ့ အထွက် ကို gate အဝင် မှာ ပေးလိုက် တဲ့ အခါ၊ သူ့ကို ချဲ့ပြီး ထွက်လာ တဲ့ inverted waveform ကို serial plotter မှာ တွေ့ ရမှာ ဖြစ် ပါတယ်။ ချဲ့ဆ ပိုများ ချင်ရင် source မှာ bypass capacitor တစ်လုံး ထပ်ဖြည့် နိုင် ပါတယ်။