251371235 发表于 2010-9-10 10:54:17

AD9851怎么样控制波形输出个数和任意波形?请高手指点

AD9851怎么样输出任意波形?

我目前学习到AD9851芯片可以控制频率和相位,直接输出正弦波,但是我想输出半正弦波,只要半个周期的波形,我想通过软件来控制,利用定时器定时半个周期 后再使波形相位转为180°,我想这样输出的波形就应该是两个半正弦了,但是用示波器显示好像不是,另外延时函数好像也很难控制。附程序如下:
单片机用的是STC12C5A60S2,并行传输方式,此程序在示波器上显示的是0.5V的电压,有微小的均匀的波动。
#include<stc12c5a.h>
#include <intrins.h>
sbit FQ_UD_AD9851=P1^0;
sbit CLK_AD9851=P1^1;
sbit RST_AD9851= P1^2;
unsigned long int freq = 0;
unsigned int i=0;
//unsigned char Control_AD9851 = 0x09; //Phase0 ,power down mode and 6 REFCLK Multiplier enable
//unsigned char Control_AD9851 = 0x00; //Phase0 ,power on   mode and 6 REFCLK Multiplier disable
unsigned char Control_AD9851 = 0x01; //Phase0 ,power on   mode and 6 REFCLK Multiplier enable
unsigned char W1=0X0e;
unsigned char W2=0X38;
unsigned char W3=0Xe3;
unsigned char W4=0X8e;
void Parallel2Serial_AD9851(void)
{    FQ_UD_AD9851=0;      
   CLK_AD9851=0;         //发送控制字W0
   P0=Control_AD9851;
   CLK_AD9851=1;
   CLK_AD9851=0;

   P0=W1;                  //发送控制字W1
   CLK_AD9851=1;
   CLK_AD9851=0;

   P0=W2;            //发送控制字W2
   CLK_AD9851=1;
   CLK_AD9851=0;

   P0=W3;            //发送控制字W3
   CLK_AD9851=1;
   CLK_AD9851=0;

   P0=W4;          //发送控制字W4
   CLK_AD9851=1;
   CLK_AD9851=0;
   
   FQ_UD_AD9851=1;            //更新控制字
   FQ_UD_AD9851=0;
}

void Set_Freq(float Freqency)
{   

   freq= (unsigned long int)(23.861*Freqency);        // SYSCLK = 180 MHz
   W4=(unsigned char)freq&0xff;
   freq=freq>>8;

   W3=(unsigned char)freq&0xff;
   freq=freq>>8;

   W2=(unsigned char)freq&0xff;
   freq=freq>>8;

   W1=(unsigned char)freq&0xff;
       
   Parallel2Serial_AD9851();
}


void main(void)
{
   
   RST_AD9851=1;
   RST_AD9851=1;
   RST_AD9851=0;



    TMOD=0x08;   //   设置中断模式   
   
    TH0=(65536-5420)/256; //装载定时器0的高8为
    TL0=(65536-5420)%256;//装载定时器0的低8位
    EA=1;    //开启总中断
    ET0=1;   //使能定时器0
    TR0=1;   //开启定时器0
   while(1)
    {       
       i=i/10;             延时10
          if(i%2==0)
           {
                Control_AD9851 = 0x01; //相位延时0度
             Set_Freq(100);
           }
          else
       
           {
               Control_AD9851 = 0x81; //相位延时180度
          Set_Freq(100);
           }
           if(i==100)
           {
           i=0;
           }
               }          

}

void T0_time() interrupt 1
{
TH0=0x1c;
TL0=0x66;
i++;

   // Set_Freq(100);

}

cuikai12345 发表于 2010-9-11 00:09:34

mark

251371235 发表于 2010-9-13 15:45:58

回复【1楼】cuikai12345
-----------------------------------------------------------------------

这个程序有问题,你看一眼就是了,千万不敢让我误导了你啊
页: [1]
查看完整版本: AD9851怎么样控制波形输出个数和任意波形?请高手指点