Posting kali ini bertujuan untuk membangkitkan signal DDS menggunakan IC AD 9850. IC ini sudah tersedia dalam bentuk modul. Keluaran IC ini berupa gelombang sinus dan kotak. Karena IC ini bersifat programmable maka frekuensi akan disetting menggunakan Arduino Uno.
Kemudian dibuat pula program untuk mengecek frekuensi yang dikeluarkan oleh IC tersebut setelah diprogram sebelumnya. Aplikasi penghitung frekuensi ini juga dapat digunakan untuk menghitung frekuensi yang lain dengan cara menghubungkan sumber frekuensi ke pin T1 (timer1 sebagai counter.
Untuk menghitung frekuensi yang dikeluarkan oleh DDS AD9850 maka output signal kotak dihubungkan ke pin T1 dari Arduino Uno.
Hasil penghitungan frekuensi kemudian ditampilkan dalam LCD 16x2 dan dikirim ke PC secara serial.
Konfigurasi Pin Arduino Uno |
Konfigurasi Pin Modul DDS AD9850 |
LiquidCrystal lcd(12,13,3,4,6,7); //Konfigurasi schematic LCD Keypad
Konfigurasi DDS AD9850:
///////////////AD9850
#define W_CLK 8 // Pin 8 - connect to AD9850 module word load clock pin (CLK)
#define FQ_UD 9 // Pin 9 - connect to freq update pin (FQ)
#define DATA 10 // Pin 10 - connect to serial data load pin (DATA)
#define RESET 11 // Pin 11 - connect to reset pin (RST)
///////////////AD9850
#define W_CLK 8 // Pin 8 - connect to AD9850 module word load clock pin (CLK)
#define FQ_UD 9 // Pin 9 - connect to freq update pin (FQ)
#define DATA 10 // Pin 10 - connect to serial data load pin (DATA)
#define RESET 11 // Pin 11 - connect to reset pin (RST)
///////////////AD9850
Konfigurasi Counter1:
Pin output gelombang kotak dari DDS AD9850 dihubungkan ke pin T1 pada Arduino Uno.
Berikut Source Code Lengkapnya:
/*
Author: Muhammad Nurul Puji
muhammadpuji.its@gmail.com
This program have been tested on Arduino Uno R3, DDS AD9850 and LCD Keypad
2013
*/
#include <LiquidCrystal.h>
LiquidCrystal lcd(12,13,3,4,6,7); //Konfigurasi schematic LCD Keypad
///////////////AD9850
#define W_CLK 8 // Pin 8 - connect to AD9850 module word load clock pin (CLK)
#define FQ_UD 9 // Pin 9 - connect to freq update pin (FQ)
#define DATA 10 // Pin 10 - connect to serial data load pin (DATA)
#define RESET 11 // Pin 11 - connect to reset pin (RST)
#define pulseHigh(pin) {digitalWrite(pin, HIGH); digitalWrite(pin, LOW); }
String freq; // string to hold the frequency
///////////////AD9850
/////////Freq Cek
float freq_cek;
int kilo,mega, timer0;
String freq_satuan;
/////////Freq Cek
void setup()
{
///////////setting counter atau timer
timer0;
kilo=0;
mega=0;
freq_cek=0;
freq_satuan="Hz";
cli();//stop interrupts
//set timer0 interrupt
TCCR0A = 0;// set entire TCCR0A register to 0
TCCR0B = 0;// same for TCCR0B
TCNT0 = 0;//initialize counter value to 0
// set compare match register for 2khz increments
OCR0A = 249;// 250 (dimulai dari 0) - karena prescaler 64 (250KHz) maka diperlukan 1000 kali interrupt untuk 1 detik
// turn on CTC mode
TCCR0A |= (1 << WGM01);
// Set CS01 and CS00 bits for 64 prescaler (250KHz)
TCCR0B |= (1 << CS01) | (1 << CS00);
// enable timer compare interrupt
TIMSK0 |= (1 << OCIE0A);
//set timer1 interrupt sebagai counter sinyal frekuensi yang masuk
TCCR1A = 0;// set entire TCCR1A register to 0
TCCR1B = 0;// same for TCCR1B
TCNT1 = 0;//initialize counter value to 0
// set compare match register for 1hz increments
OCR1A = 999;//seribu kali - mulai dari 0
// turn on CTC mode
TCCR1B |= (1 << WGM12);
// Set CS10 and CS11 bits for external clock T1 falling edge
TCCR1B |= (1 << CS12) | (1 << CS11);
// enable timer compare interrupt
TIMSK1 |= (1 << OCIE1A);
sei();//allow interrupts
//////////////setting counter atau timer
///////////////AD9850
pinMode(FQ_UD, OUTPUT);
pinMode(W_CLK, OUTPUT);
pinMode(DATA, OUTPUT);
pinMode(RESET, OUTPUT);
pulseHigh(RESET);
pulseHigh(W_CLK);
pulseHigh(FQ_UD); // this pulse enables serial mode on the AD9850 - Datasheet page 12.
sendFrequency(1000000); //tes frekuensi 1MHz
///////////////AD9850
Serial.begin(9600);
lcd.begin(16,2);
}
void loop()
{
//lcd.clear();
Serial.print(freq_cek);
Serial.print(" ");
Serial.println(freq_satuan);
lcd.setCursor(0,0);
lcd.print("Freq DDS AD9850");
lcd.setCursor(0,1);
lcd.print("Freq= ");
lcd.print(freq_cek);
lcd.print(" ");
lcd.print(freq_satuan);
//delay(500);
}
//////////////untuk handle interrupt counter dan timer
ISR(TIMER0_COMPA_vect){//timer0 interrupt
timer0++;
if (timer0==1000) { //setiap 1 detik dicek jumlah pulsanya
if (mega>0){
freq_cek=((float)mega+((float)kilo/1000) + ((float)TCNT1/1000000))*1; //dikali 1 supaya 1 detik
freq_satuan = "MHz ";
}else if (kilo>0){
freq_cek=((float)kilo + ((float)TCNT1/1000))*1; //dikali 1 supaya 1 detik
freq_satuan = "KHz ";
}else {
freq_cek = ((float)TCNT1) * 1;
freq_satuan = "Hz ";
}
timer0=0;
kilo=0;
mega=0;
TCNT1=0;
TCNT0=0;
}
}
ISR(TIMER1_COMPA_vect){//counter1 interrupt
kilo++;
if (kilo==1000){
mega++;
kilo=0;
}
}
//////////////untuk handle interrupt counter dan timer
/////////////////////AD9850
// frequency calc from datasheet page 8 = <sys clock> * <frequency tuning word>/2^32
void sendFrequency(double frequency) {
int32_t freq = frequency * 4294967295/125000000; // note 125 MHz clock on 9850.
for (int b=0; b<4; b++, freq>>=8) {
tfr_byte(freq & 0xFF);
}
tfr_byte(0x000); // Final control byte, all 0 for 9850 chip
pulseHigh(FQ_UD); // Done! Should see output
}
// transfers a byte, a bit at a time, LSB first to the 9850 via serial DATA line
void tfr_byte(byte data)
{
for (int i=0; i<8; i++, data>>=1) {
digitalWrite(DATA, data & 0x01);
pulseHigh(W_CLK); //after each bit sent, CLK is pulsed high
}
}
/////////////////////AD9850
Author: Muhammad Nurul Puji
muhammadpuji.its@gmail.com
This program have been tested on Arduino Uno R3, DDS AD9850 and LCD Keypad
2013
*/
#include <LiquidCrystal.h>
LiquidCrystal lcd(12,13,3,4,6,7); //Konfigurasi schematic LCD Keypad
///////////////AD9850
#define W_CLK 8 // Pin 8 - connect to AD9850 module word load clock pin (CLK)
#define FQ_UD 9 // Pin 9 - connect to freq update pin (FQ)
#define DATA 10 // Pin 10 - connect to serial data load pin (DATA)
#define RESET 11 // Pin 11 - connect to reset pin (RST)
#define pulseHigh(pin) {digitalWrite(pin, HIGH); digitalWrite(pin, LOW); }
String freq; // string to hold the frequency
///////////////AD9850
/////////Freq Cek
float freq_cek;
int kilo,mega, timer0;
String freq_satuan;
/////////Freq Cek
void setup()
{
///////////setting counter atau timer
timer0;
kilo=0;
mega=0;
freq_cek=0;
freq_satuan="Hz";
cli();//stop interrupts
//set timer0 interrupt
TCCR0A = 0;// set entire TCCR0A register to 0
TCCR0B = 0;// same for TCCR0B
TCNT0 = 0;//initialize counter value to 0
// set compare match register for 2khz increments
OCR0A = 249;// 250 (dimulai dari 0) - karena prescaler 64 (250KHz) maka diperlukan 1000 kali interrupt untuk 1 detik
// turn on CTC mode
TCCR0A |= (1 << WGM01);
// Set CS01 and CS00 bits for 64 prescaler (250KHz)
TCCR0B |= (1 << CS01) | (1 << CS00);
// enable timer compare interrupt
TIMSK0 |= (1 << OCIE0A);
//set timer1 interrupt sebagai counter sinyal frekuensi yang masuk
TCCR1A = 0;// set entire TCCR1A register to 0
TCCR1B = 0;// same for TCCR1B
TCNT1 = 0;//initialize counter value to 0
// set compare match register for 1hz increments
OCR1A = 999;//seribu kali - mulai dari 0
// turn on CTC mode
TCCR1B |= (1 << WGM12);
// Set CS10 and CS11 bits for external clock T1 falling edge
TCCR1B |= (1 << CS12) | (1 << CS11);
// enable timer compare interrupt
TIMSK1 |= (1 << OCIE1A);
sei();//allow interrupts
//////////////setting counter atau timer
///////////////AD9850
pinMode(FQ_UD, OUTPUT);
pinMode(W_CLK, OUTPUT);
pinMode(DATA, OUTPUT);
pinMode(RESET, OUTPUT);
pulseHigh(RESET);
pulseHigh(W_CLK);
pulseHigh(FQ_UD); // this pulse enables serial mode on the AD9850 - Datasheet page 12.
sendFrequency(1000000); //tes frekuensi 1MHz
///////////////AD9850
Serial.begin(9600);
lcd.begin(16,2);
}
void loop()
{
//lcd.clear();
Serial.print(freq_cek);
Serial.print(" ");
Serial.println(freq_satuan);
lcd.setCursor(0,0);
lcd.print("Freq DDS AD9850");
lcd.setCursor(0,1);
lcd.print("Freq= ");
lcd.print(freq_cek);
lcd.print(" ");
lcd.print(freq_satuan);
//delay(500);
}
//////////////untuk handle interrupt counter dan timer
ISR(TIMER0_COMPA_vect){//timer0 interrupt
timer0++;
if (timer0==1000) { //setiap 1 detik dicek jumlah pulsanya
if (mega>0){
freq_cek=((float)mega+((float)kilo/1000) + ((float)TCNT1/1000000))*1; //dikali 1 supaya 1 detik
freq_satuan = "MHz ";
}else if (kilo>0){
freq_cek=((float)kilo + ((float)TCNT1/1000))*1; //dikali 1 supaya 1 detik
freq_satuan = "KHz ";
}else {
freq_cek = ((float)TCNT1) * 1;
freq_satuan = "Hz ";
}
timer0=0;
kilo=0;
mega=0;
TCNT1=0;
TCNT0=0;
}
}
ISR(TIMER1_COMPA_vect){//counter1 interrupt
kilo++;
if (kilo==1000){
mega++;
kilo=0;
}
}
//////////////untuk handle interrupt counter dan timer
/////////////////////AD9850
// frequency calc from datasheet page 8 = <sys clock> * <frequency tuning word>/2^32
void sendFrequency(double frequency) {
int32_t freq = frequency * 4294967295/125000000; // note 125 MHz clock on 9850.
for (int b=0; b<4; b++, freq>>=8) {
tfr_byte(freq & 0xFF);
}
tfr_byte(0x000); // Final control byte, all 0 for 9850 chip
pulseHigh(FQ_UD); // Done! Should see output
}
// transfers a byte, a bit at a time, LSB first to the 9850 via serial DATA line
void tfr_byte(byte data)
{
for (int i=0; i<8; i++, data>>=1) {
digitalWrite(DATA, data & 0x01);
pulseHigh(W_CLK); //after each bit sent, CLK is pulsed high
}
}
/////////////////////AD9850
Hasil:
DDS AD9850 dapat membangkitkan gelombang sinus dan kotak. Berikut pengambilan data menggunakan ADC pada frekuensi rendah (0,5 Hz; 1 Hz; 2Hz)
- Mungkin akan dijabarkan diposting terpisah :)
- Mungkin akan dijabarkan diposting terpisah :)
Hasil keluaran DDS AD9850 gelombang sinus dan kotak |
Hasil keluaran DDS AD9850 sine 1 dan sine 2 |
Hasil pengukuran frekuensi oleh Arduino Uno menggunakan Counter dan Timer1:
Pengukuran Nilai Frekuensi keluaran DDS AD9850 (di tes pada 1 MHz) |
Pengukuran Nilai Frekuensi keluaran DDS AD9850 (di tes pada 1 Hz) |
Beberapa referensi utama:
http://www.instructables.com/id/Arduino-Timer-Interrupts/?ALLSTEPS
http://www.ad7c.com/projects/ad9850-dds-vfo/
http://www.instructables.com/id/Arduino-Timer-Interrupts/?ALLSTEPS
http://www.ad7c.com/projects/ad9850-dds-vfo/
mau tanya dong.. kalo mau mengatur keluaran pada generator frekuensi AD9850 yang harus di modifikasi apanya ya???
BalasHapussaya sedang membuat alat untuk tugas akhir saya salah satu alatnya untuk membuat pembangkit frekuensi yang dapat diatur keluarannya menggunakan interface (saya menggunakan visual basic).. saya mengotak-atik program yang anda post tapi tetap mentok... saya menggunakan arduino uno 16u2... saya ingin mengatur keluaran ad9850 dari 450 KHz sampai 2 MHz.. yang mana di interface saya 0 = 450 KHz dan 120 = 2 MHz.. jadi sekala di interface saya 0 - 120..
mohon pencerahannya apabila berkenaan...
terimakasih sebelumnya..
email saya andiagustia05@gmail.com...
mau tanya dong.. kalo mau mengatur keluaran pada generator frekuensi AD9850 yang harus di modifikasi apanya ya???
BalasHapussaya sedang membuat alat untuk tugas akhir saya salah satu alatnya adalah untuk membuat pembangkit frekuensi yang dapat diatur keluarannya menggunakan interface (saya menggunakan visual basic).. saya mengotak-atik program yang anda post tapi tetap mentok... saya menggunakan arduino uno 16u2... saya ingin mengatur keluaran ad9850 dari 450 KHz sampai 2 MHz.. yang mana di interface saya 0 = 450 KHz dan 120 = 2 MHz.. jadi sekala di interface saya 0 - 120..
mohon pencerahannya apabila berkenaan...
terimakasih sebelumnya..
email saya andiagustia05@gmail.com...
@Andi Agustian: Sebenernya tinggal masukkan aja nilai frekuensi yg anda inginkan ke SendFrequency(x).
Hapusx adalah nilai frekuensi yg anda inginkan. Kalo untuk skala 0 s/d 120 itu tinggal dibuat rumus aja x=450 + (y*2000/120). Dengan y adalah nilai skala (0 s/d 120). Rumus tsb di tempatkan pada coding visual basic dan hasil perhitungan x dikirim dari vb ke mikro.
Kalo anda menggunakan komunikasi serial, di postingan tentang vb sdh Sy pernah Sy posting tentang komunikasi serial menggunakan vb .net tinggal ditambahkan rumus diatas dan dimodifikasi tampilannya saja.
Pada postingan terbaru mengenai dds ad9850 jg sdh Sy sertakan cara handle komunikasi serial dan pengubahan tipe datanya. Dan sdh Sy coba sampai frek diatas 2MHz.
Maaf rumusnya harusnya x=450000 + (y*(2000000-450000)/120)
HapusSilahkan dicek lagi rumusnya biar gak salah :D
min,, output module ad9850 ada 4 pin (2 pin sinus dan 2 pin kotak),, bisa ga ya kalo diprogram buat 2 freq sekaligus di 2 pin-out sinus. yang 1 500 kHz dan yang 1nya lg 100kHz ?
BalasHapusSetahu Sy kalo dua frekuensi berbeda sekaligus tidak bisa
Hapuspermisi min.
BalasHapusmhn maaf, apa boleh minta skemA rangkaian pnghubung arduino uno+modul dds+lcd 16x2....?
trimksh....
Sdh ada di keterangan di atas.
HapusKonfigurasi LCD:
LiquidCrystal lcd(12,13,3,4,6,7); //Konfigurasi schematic LCD Keypad
Konfigurasi DDS AD9850:
///////////////AD9850
#define W_CLK 8 // Pin 8 - connect to AD9850 module word load clock pin (CLK)
#define FQ_UD 9 // Pin 9 - connect to freq update pin (FQ)
#define DATA 10 // Pin 10 - connect to serial data load pin (DATA)
#define RESET 11 // Pin 11 - connect to reset pin (RST)
///////////////AD9850
Konfigurasi Counter1:
Pin output gelombang kotak dari DDS AD9850 dihubungkan ke pin T1 pada Arduino Uno.
Permisi mas , PIN T1 itu PD5 berarti di PIN 5 arduino ya?
HapusPD5 berarti Pin Digital 5 (Pin 5) spt pada gambar "Konfigurasi Pin Arduino Uno" di atas
Hapusmas bisa minta kontak emailnya? saya mau tanya berapa pertanyaan
BalasHapusBisa.. Silahkan tuliskan email anda. Insya ALLAH nanti Sy bales. Terimakasih
Hapusharrykuntarto@gmail.com
HapusMas mau tanya tentang mengatur keluaran gelombangnya gimana ya mas? Minta tolong pencerahannya. Email saya nevi772@gmail.com
BalasHapusmaaf terlewat balas
HapusSaya sudah samakan persis program dan konfigurasinya , kenapa ketika diliat di serial monitor masih kebaca 0hz?. Mohon pencerahannya 🙏
BalasHapusMohon maaf baru membalas. Mungkin dicek lagi seri arduino dan ddsnya. cek rangkaiannya jg. cek codingnya mungkin ada yg salah. kalau arduinonya beda jenis maka letak interrupt, timer/counternya juga belum tentu sama.
HapusMalam pak, saya baca blog ini untuk referensi tugas akhir membuat waterflow ultrasonik dan modul yang dipakai adalah AD9850, tapi, saat mencoba modul tsb kenapa output frekuensinya hanya 50Hz ya pak? mohon pencerahannya. Terimakasih
BalasHapusmohon maaf baru balas. Mungkin bisa dicoba coding seperti di postingan ini. cek lagi commandnya dan rangkaiannya.
Hapus