PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : سيگنال ژنراتور قابل برنامه ريزي با ميكرو ad9833



hadiabdi
10-09-2011, 14:30
سلام دوستان براي هر جووني مثل ماها يك سيگنال ژنراتور تو محيط كارگاه لازمه منم به اين فكر افتادم كه اين ايسي رو درايو كنم وقعا اين ايسي فوق العاده است باورتون نميشه چقدر عالي كار ميده تو هر رنج فركاسي از 1. هرتز تا 12.5 مگا هرتز جواب ميده مدل هاي بلاترش تا 40 مگه اميدوارم لذتش رو ببريد نوع شكل موج هايي رو كه با ايسي خودم گرفتم براتون ميزارم تا خيالتون از اين اي سي راحت بشه موفق مويد باشيد التماس دعا
#include "main.h"
#include <stdio.h>
#include <math.h>
#include <LCD.h>
#ZERO_RAM
#use spi(DI=PIN_C0, DO=PIN_D0, CLK=PIN_D1, BITS=16,CLOCK_LOW=150,IDLE=1)
#define FSYNC PIN_C3
#define RESEt_AD9833 0x0100 //0000 0001 0000 0000
#define Sinusoid_0 0x0000 //0000 0000 0000 0000
#define Sinusoid_1 0x0800 //0000 1000 0000 0000
#define Triangle_0 0x0002 //0000 0000 0000 0010
#define Triangle_1 0x0802 //0000 1000 0000 0010
#define square_0_MSB_d_2 0x0020 //0000 0000 0010 0000
#define square_1_MSB_d_2 0x0820 //0000 1000 0010 0000
#define square_0 0x0028 //0000 0000 0010 1000
#define square_1 0x0828 //0000 1000 0010 1000
#define frequency_0 0
#define frequency_1 1
//************************************************** **********
void init_FREQ0_AD9833();
void init_FREQ1_AD9833();
void write_command_AD9833(int16 c_o_m);
void load_FREQ_AD9833(float fe,int1 cs);
//************************************************** **********
void main()
{

port_b_pullups(TRUE);
setup_timer_0(RTCC_INTERNAL);
setup_oscillator(OSC_NORMAL);
cls();
delay_ms(100);

init_FREQ0_AD9833();
delay_ms(5000);
write_command_AD9833(Triangle_0);
delay_ms(5000);
write_command_AD9833(square_0);
delay_ms(5000);
write_command_AD9833(Sinusoid_0);
delay_ms(5000);
load_FREQ_AD9833(200.0,frequency_0);
while(TRUE);
}
//************************************************** **************
void init_FREQ0_AD9833(){
output_low (FSYNC);
spi_xfer(0x2100);// 0010 0001 0000 0000
output_high(FSYNC);
output_low (FSYNC);
spi_xfer(0x4230);// 01 00 0010 0011 0000
output_high(FSYNC);
output_low (FSYNC);
spi_xfer(0x4000);// 01 00 0000 0000 0000
output_high(FSYNC);
output_low (FSYNC);
spi_xfer(0xC000);// 1100 0000 0000 0000
output_high(FSYNC);
output_low (FSYNC);
spi_xfer(0x0000);// 0000 0000 0000 0000
output_high(FSYNC);
}
//************************************************** *
void init_FREQ1_AD9833(){
output_low (FSYNC);
spi_xfer(0x2900);// 0010 1001 0000 0000
output_high(FSYNC);
output_low (FSYNC);
spi_xfer(0x8230);// 10 00 0010 0011 0000
output_high(FSYNC);
output_low (FSYNC);
spi_xfer(0x8000);// 10 00 0000 0000 0000
output_high(FSYNC);
output_low (FSYNC);
spi_xfer(0xC000);// 1100 0000 0000 0000
output_high(FSYNC);
output_low (FSYNC);
spi_xfer(0x0800);// 0000 1000 0000 0000
output_high(FSYNC);
}

//************************************************** ******
void write_command_AD9833(int16 c_o_m){

output_low (FSYNC);
spi_xfer(c_o_m);
output_high(FSYNC);
}
//************************************************** ******
void load_FREQ_AD9833(float fe,int1 cs){

float32 res;
int32 res_f;
int16 l_b=0,m_b=0,LSB=0,MSB=0;
int8 i=0;
int1 te_0[28];

res=((fe*pow (2,28.0))/24E+6);
res = floor (res);
res_f=res;
while(i<14){
te_0[i]=bit_test(res_f,i);
i++;
}
while(i<28){
te_0[i]=bit_test(res_f,i);
i++;
}
i=0;
while(i<14){
if(te_0[i]==1) bit_set(l_b,i);
i++;
}
while(i<28){
if(te_0[i]==1) bit_set(m_b,i-14);
i++;
}

if(cs==0){
LSB=0x4000;
MSB=0x4000;
LSB|=l_b;
MSB|=m_b;
write_command_AD9833(0x2100);
write_command_AD9833(LSB);
write_command_AD9833(MSB);
write_command_AD9833(0xC000);
write_command_AD9833(0x0000);
}
if(cs==1){
LSB=0x8000;
MSB=0x8000;
LSB|=l_b;
MSB|=m_b;
write_command_AD9833(0x2900);
write_command_AD9833(LSB);
write_command_AD9833(MSB);
write_command_AD9833(0x0800);
}

}

hadiabdi
10-09-2011, 14:32
You can see links before reply (You can see links before reply)
You can see links before reply (You can see links before reply)
You can see links before reply (You can see links before reply)

kavir
10-09-2011, 14:57
سلام
این ایسی جالبی بود اگر شماتیک و .. دارین بفرستین بذاریم صفحه اول سایت مطلب خوبی هست

hadiabdi
11-09-2011, 09:34
You can see links before reply (You can see links before reply)

hashemi911t
27-02-2012, 14:43
سلام :نوع کریستال اسیلاتور برای AD9833 چی باید باشد
یک کریستال اسلاتور 25 مگ تهیه کردم که خروجیش سینوسی هست .
خروجی کریستال اسیلاتور سینوسی باید باشد یا مربعی؟

\/\hashemi911t/\/

sadmonew
27-02-2012, 20:54
خروجی کریستال اسیلاتور سینوسی باید باشد یا مربعی؟

\/\/\/
سلام مهندس
خروجي اسيلاتور يه موج سينوسي هستش. با اوسيلوسكوپ موج خروجيشو ديدم.

hakimzadeh
27-02-2012, 22:05
مدل ad9835 دارای قابلیت 50 مگاهرتز است.

hashemi911t
28-02-2012, 22:52
سلام :شک داشتم چون من هم روی اسکوب دیدم سینوسی بود ولی دیتا شیت میگه ظریب نویز و کیفیت شکل موج های خروجی به کلاک ورودی mclk بستگی داره
جون گفت کلاک فکر کردم خوب حتما خروجی کریستال اسیلاتور مربعی هست!
شما با این اسیلاتور جواب گرفتید؟

sadmonew
28-02-2012, 22:57
شما با این اسیلاتور جواب گرفتید؟
سلام مهندس:hi:
بله جواب گرفتم.:wink::0013:
مثلا با اين اسيلاتور ميكروي AVR كه فيوزبيتاش مشكل دار شده رو دوباره زنده كردم.
يا اينكه با همين اسيلاتور يه برد واسه XC9572 ساختم و بازم جواب گرفتم.
يه اسلوسكوپ هم با اون ساختم و موج خروجي رو با همين اوسكوپ ديدم.

naatamam
29-02-2012, 00:41
سلام مهندس:hi:
بله جواب گرفتم.:wink::0013:
مثلا با اين اسيلاتور ميكروي avr كه فيوزبيتاش مشكل دار شده رو دوباره زنده كردم.
يا اينكه با همين اسيلاتور يه برد واسه xc9572 ساختم و بازم جواب گرفتم.
يه اسلوسكوپ هم با اون ساختم و موج خروجي رو با همين اوسكوپ ديدم.

سلام
با کدام اسیلانور ؟ چند مگ ؟ یا چه شماره ای ؟؟

sadmonew
29-02-2012, 01:04
سلام
با کدام اسیلانور ؟ چند مگ ؟ یا چه شماره ای ؟؟
سلام مهندس
براي اولي از اوسيلاتور با فركانس 11.0592 يا 16 مگاهرتز
براي دومي از اوسيلاتور با فركانس 50 مگاهرتز
و براي سومي از اوسيلاتور با فركانس 40 مگاهرتز استفاده كردم.
ضمنا اوسيلاتورا 4 تا پايه بيشتر ندارن.

alishekarriz
29-02-2012, 16:48
سلام مهندس:hi:
بله جواب گرفتم.:wink::0013:
مثلا با اين اسيلاتور ميكروي avr كه فيوزبيتاش مشكل دار شده رو دوباره زنده كردم.
يا اينكه با همين اسيلاتور يه برد واسه xc9572 ساختم و بازم جواب گرفتم.
يه اسلوسكوپ هم با اون ساختم و موج خروجي رو با همين اوسكوپ ديدم.

سلام
اسيلاتور به زنده كردن ميكرو چطوري ربط پيدا ميكنه ؟

hashemi911t
18-03-2012, 14:44
سلام من کد زیل را برای درایو ad9833 به زبان c و کامپایلرmikroe با atmega16 نوشتم ولی جواب نمیگیرم و در خروجی هیچ ندارم لطفا راهنمایی کنید اگه کد اماده برای تست دارید لطفا برام ارسال نمایید یا لینک اش را قرار دهید
توضیح کد: ابتدا ماژل spi راه اندازی و بعد پیکر بندی کی پد انجام شده و اماده خواندن میگرردد وبعد
توسط تابع void initAD9833 چیپ اماده سازی اولیه میشود

وبعد منتطر دریافت کد از کیپد میشود اگر کلید فشاری 4،8،12،16 بود شکل موج خروجی راتغییر میدهد اگر هم کلید 1 فشرده شد موج خروجی شینوسی با فرکانس 100k در خروجی باید ایجاد شود


* this code write wait MikroC avr by aliasghar hashemi for Deriver AD9833 wait
keypad input
hashemi911t@gamil.com,
09119109304*/
// Keypad module connections
char keypadPort at PORTD;
char keypadPort_Direction at DDRD;
// End Keypad module connections

//**********************initialization AD9833 funtion********************
void initAD9833 (void)
{
//CONT REG Reset=1&HLB=0 0b0010 0001 0000 0000
PORTB.B4=0;
SPI1_Write(0x21);
SPI1_Write(0x00);
PORTB.B4=1;
// write LSB freq reg0 0b 01 101001 11100011 out 1k
PORTB.B4=0;
SPI1_Write(0x69);// D13 - D8 represents 14 LSBs
SPI1_Write(0xE3); //D7 - D0
PORTB.B4=1;
// write MSB freq reg0 0b01 000000 00000000
PORTB.B4=0;
SPI1_Write(0x64);// D13 - D8 represents 14 LSBs
SPI1_Write(0x00); //D7 - D0
PORTB.B4=1;
// phase reg 0b11000000 00000000
PORTB.B4=0;
SPI1_Write(0xC0); // D13 - D8 represents 14 MSBs
SPI1_Write(0x00); // D7 - D0
PORTB.B4=1;
// CONT REG reset=0, select felect&Pselect 0b0010 0000 0000 0000
PORTB.B4=0;
SPI1_Write(0x20); // D15 - D8, Writing to Control Regsiter
SPI1_Write(0x00); // Setting for Sine Wave Output
PORTB.B4=1;
}

// *****************selective out put wave*********************
void out(int kp)
{
if (kp==4)
{
PORTB.B4=0;
SPI1_Write(0x20); // 0b0010 0000 0000 0000 sin
SPI1_Write(0x00);
PORTB.B4=1;
Delay_us(100);
}

else if (kp==8)
{
PORTB.B4=0;
SPI1_Write(0x20); // 0b0010 0000 0000 0010 Tri
SPI1_Write(0x02);
PORTB.B4=1;
Delay_us(100);
}
else if (kp==12)
{
PORTB.B4=0;
SPI1_Write(0x20); // 0b0010 0000 0010 1000 DAC DATA MSB
SPI1_Write(0x28);
PORTB.B4=1;
Delay_us(100);
}
else if (kp==16)
{
PORTB.B4=0;
SPI1_Write(0x20); // 0b0010 0000 0010 0000 DAC DATA MSB/2
SPI1_Write(0x20);
PORTB.B4=1;
Delay_us(100);
}
}
//*******************write frq AD9833******************************
void write_freq(int kp )
{
if(kp==1)
{
PORTB.B4=0; // write to cort reg 0010 0000 0000 0000
SPI_Write(0x02);
SPI_Write(0x00);
PORTB.B4=1;
PORTB.B4=0;// write to FREQ REG fout=0.00931*freg
SPI_Write(0x43); // 01000011 11101000
SPI_Write(0xE8);
PORTB.B4=1;
PORTB.B4=0;
SPI_Write(0x40);
SPI_Write(0x00);
PORTB.B4=1;
PORTB.B4=0; // write to phasr reg
SPI_Write(0xc0);
SPI_Write(0x00);
PORTB.B4=1;

}
Delay_us(100);
}

void main() {
//char keybuf[5];
int kp=0;
DDRB.B4=1; //SS pin defide to outpot
DDRB.B5=1; //MOSI pin defide to outpot
DDRB.B7=1; //SCK pin defide to outpot
PORTB.B4=1; //SS high
SPI1_Init();
Keypad_Init();
initAD9833();
Delay_us(100);
while (1)
{
do
{
kp=Keypad_Key_Click();
}while(!kp);
write_freq(kp);
out(kp);
}

}}

sadmonew
18-03-2012, 15:20
سلام مهندس:hi:
شماتيك+سورس كد براي راه اندازي آس.سي AD9833 با ميكروي M8.

hashemi911t
20-03-2012, 01:06
سلام این کد تست شده است
با کد خودم که در بالا هست تو پروتئوس جواب میده( باspi debugger)
اما تو عمل هیچ
خروجی این کریستال اسیلاتور سینوسی هست و با دامنه 50 میلی ولت پیک تا پیک

sadmonew
20-03-2012, 01:23
سلام این کد تست شده است
با کد خودم که در بالا هست تو پروتئوس جواب میده( باspi debugger)
اما تو عمل هیچ
خروجی این کریستال اسیلاتور سینوسی هست و با دامنه 50 میلی ولت پیک تا پیک
سلام مهندس جان
خودم اين برنامه رو تست نكردم.
بله خروجي كريستال اوسيلاتور سينوسي هستش.

f-alimoradi
14-07-2016, 12:03
سلام دوستان این ای سی تو پروتئوس نیست
از کجا می تونم پیدا کنم؟

jonbakhsh
14-07-2016, 12:10
امکان تغییر pwm هم داره ؟؟؟ مثلا pwm از 0 تا 100 تغییر بدیم