打印

STM32F103VE控制AD9835

[复制链接]
1652|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yzzly|  楼主 | 2010-10-21 21:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这里有没有人用过AD9835啊?本人用STM32F103VE控制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的朋友指点,谢谢!
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

428

主题

1183

帖子

3

粉丝