adf4001.c

来自「基于ADF4001的锁相环程序」· C语言 代码 · 共 72 行

C
72
字号
#include<avr/io.h>
#define uchar unsigned char
#define ulong  unsigned long
#define nop() __asm__ __volatile__ ("nop");
#define ADF4110_CONTROL PORTB
#define ADF4110_DDR     DDRB
#define ADF4110_LE_H     ADF4110_CONTROL|=_BV(PB0)
#define ADF4110_LE_L     ADF4110_CONTROL&=~_BV(PB0)
#define ADF4110_DATA_H   ADF4110_CONTROL|=_BV(PB1)
#define ADF4110_DATA_L   ADF4110_CONTROL&=~_BV(PB1)
#define ADF4110_CLK_H    ADF4110_CONTROL|=_BV(PB2)
#define ADF4110_CLK_L    ADF4110_CONTROL&=~_BV(PB2)
#define ADF4110_CE_H     ADF4110_CONTROL|=_BV(PB3)
#define ADF4110_CE_L     ADF4110_CONTROL&=~_BV(PB3)
volatile unsigned long test_data;///////////////////////test/////////////////////
void delayN(unsigned int N)
{  unsigned int i;
   for(i=0;i<N;i++)
      nop();
}
void ADF4110_data_input(unsigned long data)
{  uchar i=0;
   uchar N=24; 
   do
     {  test_data=0x800000>>i;////////////////test///////////
        test_data=test_data&data; /////test///////////
       if(test_data!=0 )
        { ADF4110_DATA_H;
	    }
       else
	    { ADF4110_DATA_L; 
	    }
		ADF4110_CLK_H;
	    i++;
		ADF4110_CLK_L;
	  }while(--N);
      ADF4110_LE_H;
	  ADF4110_LE_L;
}
void ADF4110_INT()
{  ADF4110_DDR|=_BV(0)|_BV(1)|_BV(2)|_BV(3); //把ADF4110_DDR设置成输出,但不影响剩下的IO口
   //ADF4110_CONTROL&=(~_BV(0))&(~_BV(1))&(~_BV(2));//把ADF4110的用到的四个断口输出置为0
   ADF4110_LE_L;
   ADF4110_CLK_L;
   ADF4110_DATA_L;
   ADF4110_CE_H;
}
/********************************************************************************************
函数adf4110_control 的入口参数: lock_frequency 为需要锁定的频率(adf4110要大于80M) 
step_frequency 为频率的步进(也就是参考分频器的输出频率)   FREFin_frequency 为晶振频率
以上参数的单位都是HZ
********************************************************************************************/
void adf4110_control(ulong lock_frequency,ulong step_frequency,ulong FREFin_frequency)
{  ulong adf4110_data;
   ulong N;
   adf4110_data=0x1ff893;//极性:正
   //adf4110_data=0x1ff813;//极性:负
   ADF4110_data_input(adf4110_data);//set initialization latch,P=8  fastlock mode disabled, Icp=5ma
   delayN(40);//延时60us
   adf4110_data=0x020000|( (FREFin_frequency/step_frequency)<<2 );
   ADF4110_data_input(adf4110_data);//set R latch
   delayN(40);//延时60us
   N=lock_frequency/step_frequency;
   adf4110_data=0x000001|(N<<8);
   ADF4110_data_input(adf4110_data);//set AB latch
}
void main()
{  ADF4110_INT();
   adf4110_control(34000000,100000,5000000);
   while(1);
}

⌨️ 快捷键说明

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