上次在微博中说要设计一个基于AD9837的信号发生器,现在这个东东的PCB我已经搞定了,而且还能ZIGBEE远传,CAN总线接口,串行接口,USB接口,SPI接口,PWM接口,IIC接口的应用,而且还是7寸TFT触摸屏。我自己做的GUI图形,还能插入SD卡进行数据的读写。还可以输出标准的4到20MA电流信号,我还用到了NAND和外部SRAM 。
下面是其中的一段代码和PCB图,大家来分享下。
程序绝对原版独创,我是参考AD9837的数据手册进行的处理,用的程序构建都是先进
的软件思想。有想进一步学习的同学可以联系我。哈哈
#define AD9837
#ifdef AD9837
/********************************************************************************************/
/*16Mhz基本晶振,输出400HZ信号:(400×2^28)/(16×10^6)=6711=0x1a37
控制寄存器:14位
频率寄存器:28位
相位寄存器:12位
*/
#define PF9 AD9837_FSYNC
#define PF10 AD9837_CLOCK
#define PF11 AD9837_SDATA
/*定义位运算符*/
#define BIT15 0x8000
#define BIT14 0x4000
#define BIT13 0x2000
#define BIT12 0x1000
#define BIT11 0x0800
#define BIT10 0x0400
#define BIT09 0x0200
#define BIT08 0x0100
#define BIT07 0x0080
#define BIT06 0x0040
#define BIT05 0x0020
#define BIT04 0x0010
#define BIT03 0x0008
#define BIT02 0x0004
#define BIT01 0x0002
#define BIT00 0x0001
/*等于需要用到的各个变量的枚举,方便程序的可视化*/
enum frequency{
OneHundred=0x468d,
TwoHundred=0x4d1a,
ThreeHundred=0x53a7,
FourHundred=0x5a37,
FiveHundred=0x60c1,
SixHundred=0x674e,
SevenHundred=0x6ddb,
EightHundred=0x7468,
NineHundred=0x7af5,
TenHundred=0x8182
};/*输出频率*/
enum Control {Reset=0x2000,Stop=0x2140,Keep=0x2180};/*控制寄存器输出状态*/
enum Wave {Sine=0x2100,Triangle=0x2102,Pulse=0x2128};/*输出的波形,正弦,三角,方波*/
enum Phase {Degree0=0xc000,Degree45=0xc1ff,Degree90=0xc3ff,Degree180=0xc7ff,Degree270=0xcbff};/*相位度数*/
enum Amplitude {Percentage25=0xc1ff,Percentage50=0xc7ff,Percentage75=0xcbff,Percentage100=0xcfff};/*振幅幅度*/
typedef union AD9837_unionUse
{
struct {
unsigned int frequency_chose1Hundred :1;
unsigned int frequency_chose2Hundred :1;
unsigned int frequency_chose3Hundred :1;
unsigned int frequency_chose4Hundred :1;
unsigned int frequency_chose5Hundred :1;
unsigned int frequency_chose6Hundred :1;
unsigned int frequency_chose7Hundred :1;
unsigned int frequency_chose8Hundred :1;
unsigned int frequency_chose9Hundred :1;
unsigned int frequency_chose10Hundred :1; /*频率选择*/
unsigned int Wave_Pluse:1;
unsigned int Wave_Sine:1;
unsigned int Wave_Triangle:1;/*波形选择*/
unsinged int Phase_Degree0:1;
unsinged int Phase_Degree45:1;
unsinged int Phase_Degree90:1;
unsinged int Phase_Degree180:1;
unsinged int Phase_Degree270:1;/*相位选择*/
unsinged int Amplitude_Percentage25:1;
unsinged int Amplitude_Percentage50:1;
unsinged int Amplitude_Percentage75:1;
unsinged int Amplitude_Percentage100:1;/*振幅选择*/
unsigned int OutputWay:1;
}AD9837_Chose;
long AD9837_access;
};
/*定义一个大型结构体*/
typedef struct AD9837_format
{
enum Control AD9837_Control;
enum frequency AD9837_Fre;
enum Wave AD9837_Wave;
enum Phase AD9837_Phase;
enum Amplitude AD9837_Ampli;
long Output_Count;
union AD9837_unionUse AD9837_unionUse;
}
/************************Function*********************************/
void AD9837_Use(struct AD9837_format *);
static void SPI_Delay(unsigned int);
static void SPI_InputValue(unsigned int);
static void AD9837_InputData(unsigned int);
/*******************************************************************/
static void SPI_Delay(unsigned int Count)
{
unsigned int i;
unsigned char P;
for(i=0;i<Count;i++)
{
P=1;
}
}
/****************************************
函数名字:SPI_InputValue
功能:SPI写入
*****************************************/
static void SPI_InputValue(unsigned int Count)
{
unsigned char AD9837_FSYNC;
unsigned char AD9837_CLOCK;
unsigned char AD9837_SDATA;
AD9837_SDATA=Count;
SPI_Delay(5);
AD9837_CLOCK=0;
SPI_Delay(5);
AD9837_CLOCK=1;
}
/****************************************
函数名字:AD9837_InputData
功能:定义一个写入AD9837内部数据的函数
*****************************************/
static void AD9837_InputData(unsigned int Value)
{
unsigned char AD9837_FSYNC; /*这个地方需要根据自己的芯片进行IO的修改*/
unsigned char AD9837_CLOCK; /*都是输出的方式*/
unsigned char AD9837_SDATA;
AD9837_CLOCK=0;/*低电平*/
AD9837_FSYNC=1;/*使能*/
SPI_Delay(1);/*一个脉冲周期*/
AD9837_CLOCK=1;
SPI_Delay(5);/*5ns最小值*/
AD9837_FSYNC=0;/*开始*/
SPI_InputValue((Value&BIT15)>>15);/*装入值*/
SPI_InputValue((Value&BIT14)>>14);/*装入*/
SPI_InputValue((Value&BIT13)>>13);/*装入*/
SPI_InputValue((Value&BIT12)>>12);/*装入*/
SPI_InputValue((Value&BIT11)>>11);/*装入*/
SPI_InputValue((Value&BIT10)>>10);/*装入*/
SPI_InputValue((Value&BIT09)>>9);/*装入*/
SPI_InputValue((Value&BIT08)>>8);/*装入*/
SPI_InputValue((Value&BIT07)>>7);/*装入*/
SPI_InputValue((Value&BIT06)>>6);/*装入*/
SPI_InputValue((Value&BIT05)>>5);/*装入*/
SPI_InputValue((Value&BIT04)>>4);/*装入*/
SPI_InputValue((Value&BIT03)>>3);/*装入*/
SPI_InputValue((Value&BIT02)>>2);/*装入*/
SPI_InputValue((Value&BIT01)>>1);/*装入*/
SPI_InputValue((Value&BIT00)>>0);/*装入*/
SPI_Delay(1);
AD9837_FSYNC=1;/*停止*/
}
/***********************************************************************
函数名字:AD9837_Use
功能:定义一个400HZ 频率 输出方波的程序
最后的用户使用这个函数进行AD9837的控制,可以调整频率,波形,相位,振幅。
************************************************************************/
void AD9837_Use(struct AD9837_format* AD9837_format)
{
long i;
AD9837_InputData(AD9837_format->AD9837_Wave=Pulse);/*输出矩形波设定*/
AD9837_InputData(AD9837_format->AD9837_Fre=FourHundred);/*输出400HZ频率*/
AD9837_InputData(AD9837_format->AD9837_Ampli=Percentage100);/*输出100%振幅*/
AD9837_InputData(AD9837_format->AD9837_Control=Keep);/*输出状态恒定*/
AD9837_InputData(AD9837_format->AD9837_Control=Reset);/*7个MCLK内输出信号*/
if(AD9837_format->AD9837_unionUse.AD9837_Chose.OutputWay)/*输出恒定还是指定个数*/
{
AD9837_format->Output_Count--;
if(AD9837_format->Output_Count==0)
{
AD9837_InputData(AD9837_format->AD9837_Control=Stop);
AD9837_InputData(AD9837_format->AD9837_Control=Reset);
}
}
}
#endif
文章评论(0条评论)
登录后参与讨论