gg_sun321 发表于 2009-10-22 16:16:12

AD9852求救。。。刚做会DDS PCB 按照AD公司AD9854编写的程序。。输出不出来。。那位

波形一直出不来。。高手给看看。。

gg_sun321 发表于 2009-10-22 16:18:56

程序如下:
#define PIC18F6527
#include <pic18.h>
#include "typedefine.h"
#include "DDS.h"
/**********************************************************
//DDS AD9852 control register 0X1D~0X20
//ADDR 0X1D
bit7   6   5   4   3   2      1    0
      NC NCNCCOMPPD LOW CONTROL DACPD DIGPD//00010000 0X10
                           DACPD
//ADDR 0X1E
bit7      6       5      4   3   2   1   0   
      NC PLLRANGE   BYPASSmult4 mult3 mult2 mult1 mult0 //01000100 0X44
                  PLL
//ADDR 0X1F
bit7    6      5   4   3   2   1         0
   ACC1 ACC2 TRIANGE NC MODE2 MODE1 MODE0 INT/EXTUpclock //00000000 0X00
//ADDR 0X20
bit7    6       5   4    3   2   1         0
   NCBYPASSOSKEN OSKINT NC NC LSBfirst SDOenable //01000000 0X40
         invsinc            
***********************************************************/
void init_dds(void)
{   
    DDS_UD = 0;
    LATC1=0;
    DDS_OSK = 1;
   // LATC3=1;
   // DDS_FSK = 1;            //No using
   // LATC2=1;
    DDS_RD = 1;
    LATC4=1;
    DDS_WR = 1;
    LATC0=1;                        //Forbit Write and Read
    //初始化相关控制I/O口
    MASTER = 1;               //DDS RESET for More than 10 SYS CLOCK
    LATC5=1;
    delay(15);
    MASTER = 0;
    LATC5=0;
    // 系统复位
    ;
    //写更新时序Update clock
    Command_data(0X2E,0X00);    //0X1D   COMP PD disabled 0X08
    Command_data(0X1E,0X22);    //0X1E   PLL Range=1;4*MULTIPLER FOR 160M
    Command_data(0X3E,0X00);    //0XIF   MODE0 for EXT Updata clock//0X80
    Command_data(0X01,0X0C);    //0X20   OSKEN=0;OSKINT=0;BYPASSINVSINC=1   
    //写控制寄存器地址0X1D~0X20   
    //Command_data(0X1A,0X00);    //0X16   
    //Command_data(0X3A,0X00);    //0X17   
    //Command_data(0X06,0XC0);    //0X180XE0
    //Command_data(0X26,0XF8);    //0X19
    //delay(1000);
    //RC1 = 1;LATC1 = 1;
    //delay(15);
    //RC1 = 0;LATC1 = 0;          //Updata DDS Control Register for Constinue 8 SYS CLOCK
    //delay(1000);   
}

void Command_data(u08 DataAddress,u08 CommandData)
{
   
    PORTB = DataAddress;
    LATB = DataAddress;         //RB0~RB5 for A5~A0
    PORTE = CommandData;
    LATE = CommandData;         //RE0~RE7 for D7~D0
    RC0 = 0; LATC0 = 0;                        
    RC0 = 1; LATC0 = 1;      //上升沿写地址和数据                        
}
   
void UpDate_FWord(void)
{
    Command_data(0X24,0X66);//0X09 00 LSB 1/2FWT 80 00 00 00 00 00
    Command_data(0X04,0X66);//0X08 00    160M 20 00 00 00 00 00
    Command_data(0X38,0X66);//0X07 00200M 19 99 99 99 99 99
    Command_data(0X18,0X66);//0X06 00 //400000000000
    Command_data(0X28,0X66);//0X05 00   6 66 66 66 66 66
    Command_data(0X08,0X60);//0X04 40 MSB6 66 66 66 66 66
   //写DDS FWORD 地址:MSB 0X04~0X09 LSB//48Bits
    DDS_UD = 1;LATC1 = 1;
    delay(15);
    DDS_UD = 0;LATC1 = 0;
}

void delay(u16 Tdata)
{
    while(Tdata--) {;};
}

void PSet_mv_AD9852Chan(void)
{
    Command_data( 0X19, 0XF0);   
    //0.5v--1111111111110.0v---0000000000004096 for 492mv
    Command_data( 0X39, 0X0FF);   //AMP Address 0X26,0X27
}

void PWriteAD9852Amp(void)
{
    Command_data( 0x21, 0XF0);   
    //0.5v--1111111111110.0v---0000000000004096 for 492mv
    Command_data( 0x11, 0X0FF);   //AMP Address 0X21,0X22
}

void UpDate_PWord(void)
{
    Command_data( 0x00,0X28);   //MSB0x00
    Command_data( 0x20,0XAA);   //LSB0x01 Phase1
   // DDS_UD = 1;LATC1=1;
    //asm("nop");
    //DDS_UD = 0;LATC1=0;
}

void PReadAD9854(u08 ucAdd)
{
    u08 tmp;
    DDS_RD = 0;
    PORTB = ucAdd;
    DDS_RD = 1;
    tmp = PORTE;
    if((tmp&&0X40)==1){RG2=0;LATG2=0;};
}

gg_sun321 发表于 2009-10-22 16:19:27

dds.h
#ifndef _DDS_h_
#define        _DDS_h_

#define PIC18F6527
#include <pic18.h>
#include "typedefine.h"

//函数定义
extern void init_dds(void);             //DDS初始化函数
extern void delay(u16 Tdata);         //延时程序
extern void UpDate_FWord(void);         //设置频率控制字
extern void UpDate_PWord(void);   //设置相位控制字
extern void UpDate_AWord(u08 *AWord);   //输出幅度控制
extern void Command_data(u08 DataAddress,u08 CommandData);//并行模式下写DDS寄存器地址和数据
extern void PWriteAD9852Amp(void);// 输出幅度控制
extern void PSet_mv_AD9852Chan(void);
extern void PReadAD9854(u08 ucAdd);

//常量定义
#defineDDS_WRRC0
#defineDDS_UDRC1
#defineDDS_FSK RC2
#defineDDS_OSK RC3
#defineDDS_RDRC4
#defineMASTERRC5

//变量定义
//const u08 FWord = {0X40,0X00,0X00,0X00,0X00,0X00};//40M
//const u08 PWord={0X50,0X55};//30
u08 AWord;
u08 PWord1,PWord2;
u08 AWord1,AWord2;
#endif

gg_sun321 发表于 2009-10-22 16:19:46

#define PIC18F6527
#include <pic18.h>
#include "typedefine.h"
#include "main.h"
extern void init_device(void);
extern void UpDate_FWord(void);
extern void init_dds(void);
extern void PWriteAD9852Amp(void);
extern void UpDate_PWord(void);
extern void delay(u16 Tdata);
extern void PReadAD9854(u08 ucAdd);
extern void PSet_mv_AD9852Chan(void);
void main(void)
{
   OSCTUNE = 0X40;
   OSCCON = 0X70;
   init_device();
   init_dds();
   delay((u16)2000);
   UpDate_PWord();
   UpDate_FWord();
   PWriteAD9852Amp();
   PSet_mv_AD9852Chan();
   RC1 = 1;LATC1=1;
   delay(12);
   RC1 = 0;LATC1=0;
   while(1);
}

gg_sun321 发表于 2009-10-22 16:20:23

单片机I/O口初始化
#include <pic18.h>
#include "typedefine.h"
#include "init.h"

void init_device(void)
{   
    ADCON1 = 0X0F;   //ANOLOG bits forbit
    INTCON =0X00;
    INTCON2=0X00;
    INTCON3=0X00;
    //I/O A/B/C/D/E/F/G
    PORTA = 0X00;
    LATA= 0X00;
    TRISA = 0B00000000;   
    PORTB = 0X00;
    LATB= 0X00;
    TRISB = 0X00;   //RB0~RB5 for DDS ADDR Bits(A5~A0)
    PORTC = 0X00;
    LATC= 0X00;
    TRISC = 0B10000000;
    PORTD = 0X00;
    LATD= 0X00;
    TRISD = 0B00100000;
    PORTE = 0X00;
    LATE= 0X00;
    TRISE = 0X00;    //RE0~RE7 for DDS DATA Bits(D7~0)
    PORTF = 0X00;
    LATF= 0X00;
    TRISF = 0B00000000;
    PORTG = 0X00;
    LATG= 0X00;
    TRISG = 0B00100000;
}

gg_sun321 发表于 2009-10-22 16:20:44

希望高手指点指点

gg_sun321 发表于 2009-10-22 16:22:33

程序基本上结合AD公司AD9854的汇编程序和网上流传的DDS测试程序写的。。现在大脑一片空白。。望高手指正

gg_sun321 发表于 2009-10-22 16:30:03

外部用单端40M晶振,4倍频。。想输出4MHZ的频率

shichen717 发表于 2009-10-22 17:40:33

mark

teltium 发表于 2009-10-22 20:03:01

DDS关注

gg_sun321 发表于 2009-10-23 08:06:07

呵呵。。。DDS可以跑了。。软件没问题。大家可以把它做测试软件吧。。不过做DDS方面。。硬件一定要注意哟。。发热量很大。

MIT_dreamer 发表于 2011-8-1 23:37:10

回复【10楼】gg_sun321
-----------------------------------------------------------------------

我用你的程序没有结果的   能够知道一下么?
我的QQ:465248129谢谢啦

QQ240923760 发表于 2012-4-23 13:30:02

你有ISIS 7 Professional仿真图没?发给我,我试试,邮箱:240923760@qq.com   谢谢...

navalguy2 发表于 2014-4-7 19:10:25

最新9854 DDS模块增加美观实用的散热片,新增2013年全国大学生电子竞赛E题正交扫频源完整例程(可实现题目1~40M扫频功能,并可以通过按键和液晶屏设置和显示扫频参数)。
详情请见:http://item.taobao.com/item.htm?id=8643082098
页: [1]
查看完整版本: AD9852求救。。。刚做会DDS PCB 按照AD公司AD9854编写的程序。。输出不出来。。那位