⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ad9854sin.h

📁 2013全国电子设计大赛AD9854全部资料,51单片机编程,fpga编程的各种波形发生器
💻 H
字号:
#define uchar unsigned char
#define ulong unsigned long
#define uint unsigned int
#define data_out P6OUT
#define data_in P6IN
#define data_dir P6DIR
#define add_out P8OUT
#define add_dir P8DIR
#define ctrl_out P1OUT
#define ctrl_dir P1DIR
#define UDCLK BIT6
#define WR BIT5
#define RD BIT4
#define FBH BIT3
#define SK BIT2
#define SP BIT1
#define RST BIT0
void send_byte(uchar add,uchar data);
uchar read_byte(uchar add);
uchar table9854[8];
//**********初始化AD9854*********//
void init_9854()
{                           
  data_dir=0xFF;
  add_dir=0xff;
  ctrl_dir=0xff;
  ctrl_out=0x32;     //CP,UDCLK,F/B/H,SK,RST=0;WR,RD,S/P=1 0011 0010
  ctrl_out|=RST;  //一个一毫秒的高电平脉冲
  _NOP();
  ctrl_out&=~RST;          //1F为默认值,即Triangle=0,QDAC为内部输入,模式0,内部刷新时钟
  send_byte(REFCLK,0x04);     //PLL小于200MHz,不旁路PLL,4倍频  dc,pllrange,bypasspll,ref4  ref3,ref2,ref1,ref0             
  _NOP();_NOP();_NOP();_NOP();   //延时4us,以保证数据写入
  send_byte(UDCLK_1,0x20);     //将刷新周期改为(32+1)*(1/160M)*2=412.5ns,保证发送1字节数据的周期大于刷新周期 
  _NOP();_NOP();  //延时2us,以保证数据写入
  send_byte(PD,0x17);     //power down所有模块
  send_byte(OSK_S,0x20);     //不旁路Inv Sinc,使能OSK EN
  send_byte(PD,0x04);         //turn on I DAC and DIG,but still off Q DAC,PD: CR,DC,DC,COMP,  0,QDAC,DAC,DIG
}                               //DAC开了IDAC就开了,给1就关
//**********发送1字节数据************//
void send_byte(uchar add,uchar data)
{
  data_dir=0xff;  //设置数据IO口为输出
  ctrl_out|=WR;    //拉高wr
  add_out=add;        //给并口地址A
  _NOP();   //延时7ns以上
  ctrl_out&=~WR;      //拉低WR
  data_out=data;      //送数据
  _NOP();  //延时2.5ns以上
  ctrl_out|=WR;       //拉高WR
  _NOP();  //延时一下
}
//**********读取一个字节的数据**********//
uchar read_byte(uchar add)
{
  uchar dat;
  data_dir=0x00;  //设置数据IO口为输入
  ctrl_out|=RD;  //拉高RD
  add_out=add;  //给并口地址
  _NOP();  //延时20ns以上
  ctrl_out&=~RD; //拉低RD
  _NOP(); //延时15ns以上
  dat=data_in; //读并口数据;
  return dat;
}
void ad9854f(double f) 
{
  table9854[0]=(uchar)((f*256)/160000000);//高位
  table9854[1]=(uchar)(((f*256)/160000000-table9854[0])*256);//去掉整数部分,用原来的数减整数再乘256
  table9854[2]=(uchar)((((f*256)/160000000-table9854[0])*256-table9854[1])*256);
  table9854[3]=(uchar)(((((f*256)/160000000-table9854[0])*256-table9854[1])*256-table9854[2])*256);
  table9854[4]=(uchar)((((((f*256)/160000000-table9854[0])*256-table9854[1])*256-table9854[2])*256-table9854[3])*256);
  table9854[5]=(uchar)(((((((f*256)/160000000-table9854[0])*256-table9854[1])*256-table9854[2])*256-table9854[3])*256-table9854[4])*256);
  send_byte(FTW1_6,table9854[0]);     //M=f*2^48/160 算出来的M转为2进制
  send_byte(FTW1_5,table9854[1]);   
  send_byte(FTW1_4,table9854[2]);
  send_byte(FTW1_3,table9854[3]);
  send_byte(FTW1_2,table9854[4]);
  send_byte(FTW1_1,table9854[5]);
}
void ad9854v(float v) 
{
  if(v>=1)
  {
    table9854[6]=0xff;
    table9854[7]=0xff; 
  }
  else
  {
    table9854[6]=((uint)(v*4096))/256;//高位
    table9854[7]=((uint)(v*4096))%256;//用原来的数取余256
  }
  send_byte(OSKI_2,table9854[6]);    //0~11位  2^12  1V  (x/4096)*1=K   x=4096k
  send_byte(OSKI_1,table9854[7]);   
  send_byte(OSKQ_2,table9854[6]);   
  send_byte(OSKQ_1,table9854[7]);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -