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