这里有没有人用过AD9835啊?本人用ARM控制8片AD9835,相位操作碰到了麻烦;
void Write9835(Uint16 Dat)
{
SPI3->DR=Dat;
Delayus(2);
while(SPI3->SR & SPI_BUSY);
}
void Write_9835(Uint16 Dat)
{
SPI2->DR=Dat;
Delayus(2);
while(SPI2->SR & SPI_BUSY);
}
void Setup9835(Uint08 Ch,Uint16 OutFre,Uint16 Phase) //输入相位精确到0.1度
{
Uint32 var1;
float var2;
var2=OutFre; //Fvar=(Fout/REFCLK)*(2^32-1)
var2=var2/1000;
var2=var2/REFCLK; var1=FREQ_CONST; var1=var2*var1;
Phase=Phase % 3600; Phase=4095*Phase/3600; Phase=Phase & 0x0FFF;
switch(Ch)
{
case Ua1:
U4CS=0;Write9835(0xD000);U4CS=1; //B13=0使9835工作,B12=1使9835输出相位为0,B11=0不清除
//9850的SYNC和SELSRC位,如果使用0xF8则输出初始相位不确定
U4CS=0;Write9835(0xA000);U4CS=1;
U4CS=0;
Write9835(0x3000 + ((var1>>0) & 0x000000FF)); //写频率寄存器0的0~7位
U4CS=1;
U4CS=0;
Write9835(0x2100 + ((var1>>8) & 0x000000FF)); //写频率寄存器0的8~15位
U4CS=1;
U4CS=0;
Write9835(0x3200 + ((var1>>16) & 0x000000FF)); //写频率寄存器0的16~23位
U4CS=1;
U4CS=0;
Write9835(0x2300 + ((var1>>24) & 0x000000FF)); //写频率寄存器0的24~31位
U4CS=1;
U4CS=0;Write_9835(0x1800+(Phase&0xFF));U4CS=1; //写相位寄存器0低字节
U4CS=0;Write_9835(0x0900+(Phase >> 8));U4CS=1; //写相位寄存器0高字节
U4CS=0;Write_9835(0xC000);U4CS=1; //使设置生效
break;
case Ub1:
U5CS=0;Write9835(0xD000);U5CS=1; //B13=0使9835工作,B12=1使9835输出相位为0,B11=0不清除
//9850的SYNC和SELSRC位,如果使用0xF8则输出初始相位不确定
U5CS=0;Write9835(0xA000);U5CS=1;
U5CS=0;
Write9835(0x3000 + ((var1>>0) & 0x000000FF)); //写频率寄存器0的0~7位
U5CS=1;
U5CS=0;
Write9835(0x2100 + ((var1>>8) & 0x000000FF)); //写频率寄存器0的8~15位
U5CS=1;
U5CS=0;
Write9835(0x3200 + ((var1>>16) & 0x000000FF)); //写频率寄存器0的16~23位
U5CS=1;
U5CS=0;
Write9835(0x2300 + ((var1>>24) & 0x000000FF)); //写频率寄存器0的24~31位
U5CS=1;
U5CS=0;Write_9835(0x1800+(Phase&0xFF));U5CS=1; //写相位寄存器0低字节
U5CS=0;Write_9835(0x0900+(Phase >> 8));U5CS=1; //写相位寄存器0高字节
U5CS=0;Write_9835(0xC000);U5CS=1; //使设置生效
break;
}
执行语句:
Setup9835(Ua1,50000,0*10);
Setup9835(Ub1,50000,240*10);
后A、B相的相位完全正确,A相是0度、B相是240度;此后如果单独执行语句“Setup9835(Ua1,50000,0*10);”
或者“Setup9835(Ub1,50000,240*10);”后,A、B相位关系就不对了,这是什么原因?请熟悉AD9835的朋友指点,谢谢! |