导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→ad9832技术问题

* 21493: ad9832技术问题

   zjzj2008 
zjzj2008发表的帖子 

 ad9832技术问题
/* load SFR definitions and macros */

#include "p30fxxxx.h"
#define uint  unsigned int 
#define uchar unsigned char
#define ulong unsigned long
#define some_nop Nop();Nop();Nop();Nop();Nop();Nop();Nop();Nop();Nop();Nop();Nop();Nop();Nop();Nop();Nop();Nop();Nop();Nop();Nop()

//LATDbits.LATD0 ^= 1;
//#define DDS_CS2     PORTFbits.RF5
//#define DDS_CS1     PORTFbits.RF4
//#define DDS_CLK     PORTFbits.RF8
//#define DDS_SDATA   PORTFbits.RF7

#define DDS_CS2     LATFbits.LATF5
#define DDS_CS1     LATFbits.LATF4
#define DDS_CLK     LATFbits.LATF8
#define DDS_SDATA   LATFbits.LATF7


////////按键常量及变量//////////
#define keytim   1     //10ms
#define kftim    17    //300ms
#define KT       7     //200ms 按键连续有效的速度


 uchar keydata=0,keyold=0,cun=0;
 uint  key_tim=0,kf_tim=0,keyov_tim=0;
 uchar keyov_flag=0,keyfirst=0,first=0,keyover=0;
////////////////////////////

uchar inc_flag=0,dec_flag=0;
uint inc_dat=0,dec_dat=0 ;

uchar send_buf[10]={0x1b,12,0,0xff};
uchar aaa=0,bbb=0,flag1=0;

void delay(void)                                           
{ uint d=60000;
  while(--d);
}

void delay1(uchar d)                                           
{ //uint d=60000;
  while(--d);
}

// 发送指令及数据
void ddssend(uchar cs,uint svcom)
{
  uchar i;
  uint  dat;
  DDS_CS1=1;some_nop;
  DDS_CS2=1;some_nop;
  DDS_CLK=1;some_nop;
   
  if(cs==0){DDS_CS1=0;some_nop;DDS_CS2=1;} 
  else if(cs==1){DDS_CS2=0;some_nop;DDS_CS1=1;}
  some_nop;                  //传输时CS低电平有效
  for(i=0;i  <16;i++)
     {
      dat=svcom&0x8000;
      if(dat!=0)DDS_SDATA=1;
      else DDS_SDATA=0;
      svcom=svcom  <  <1;   //数据左移一位
      DDS_CLK=0;   //SCLK时钟下降沿将书写入
      some_nop;
      DDS_CLK=1;   //SCLK=1为下次数据移入时钟准备
      some_nop;
     }
  DDS_CS1=1;
  some_nop;
  DDS_CS2=1;
  some_nop;
  some_nop;   
}


void dds_9832(uchar cs,ulong FREG1,uint PREG1)
{ uint dat=0;
  ddssend(cs,0xD800);//复位
  
 //0x30DD 0x2124 0x3206 0x2301 // Freq0
 //0x34DD 0x2524 0x3606 0x2701 // Freq1
  dat=(uint)(FREG1 & 0x000000FF);
  dat=0x3000|dat;
  ddssend(cs,dat);//频率0
  some_nop;

  dat=(uint)((FREG1 &0x0000FF00 )>  >   8);
  dat=0x2100|dat;
  ddssend(cs,dat);
  some_nop;
  
  dat=(uint)((FREG1 & 0x00FF0000 )>  >   16);
  dat=0x3200|dat;
  ddssend(cs,dat);
  some_nop;

  dat=(uint)((FREG1 & 0xFF000000 )>  >   24);
  dat=0x2300|dat;
  ddssend(cs,dat);
  some_nop;

//0x1800 0x900 // Phase0
//0x1A00 0xB04 // Phase1
//0x1C00 0xD00 // Phase2
//0x1E00 0xF00 // Phase3
//0xB000 // Sync/Selsrc
//0xE000 // Out of reset

  
  
  dat=PREG1 & 0x00FF;
  dat=0x1E00|dat;
  ddssend(cs,dat);//相位 0 
  some_nop;

  dat=(PREG1 & 0xF00)>  >  8;
  dat=0xF00|dat;
  ddssend(cs,dat);
  some_nop;

  ddssend(cs,0xB000);//配置
  some_nop;

  ddssend(cs,0x6600);  //选频相
  some_nop;
  ddssend(cs,0xC000);//复位
}

void inti_PORT(void)
{
  TRISD=0;PORTD=0x0006;
  TRISF=0;PORTF=0; 
  TRISC=0;PORTC=0;
  TRISG=0;PORTG=0;
  TRISA=0;PORTA=0;
  TRISAbits.TRISA13=1;
 
}

int main(void)
{   uint i,j;
    uint bb=0;             
    ulong aa=0x010624DD;   //344 2HZ STEP INC
    inti_PORT();

      dds_9832(0,0x010624DD,0);
      some_nop;
      dds_9832(1,0x010624DD,0);
      //程序执行到此,观察两组波形相位差并不是0,但频率是正确的100KHZ
    
 while(1)
     { for(i=0;i  <40;i++)delay() ;
   
       some_nop;
       dds_9832(1,0x010624DD,bb);
       some_nop;
       bb=bb+11;  //想让第二个波形以一度的步进量步进,但并不是,也步进了但很明显不对,现在我的产品要求的是每个波形的相位要连续可调的
                  //用同样的方法对频率测试时,是很正确的,
       
      }
}



发表时间:2007年8月14日13:24:23

  
回复该帖

本主题共有 1 帖,分页:>>>>>该主题的所有内容[1]条

 *树形目录 只列出部分跟帖的标题以及简单的摘要信息 该主题的部分跟帖如下:

[上一篇帖子]:【求助】关于在同步时钟下数据发送和接收的问题(初学)[求助]我在编写一个关于调制解调的程序,其中要求
[下一篇帖子]:我下载cpld的程序的时候出现了programming hardware is&