yzzly 发表于 2010-10-21 21:26

ARM控制AD9835

这里有没有人用过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的朋友指点,谢谢!

dw772 发表于 2017-8-28 20:53

太专业,没有人回答
页: [1]
查看完整版本: ARM控制AD9835