原创 基于AD9837的STM32控制触摸屏方式信号发生器

2013-12-30 16:11 4196 17 17 分类: MCU/ 嵌入式

上次在微博中说要设计一个基于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

 

arm
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
17
关闭 站长推荐上一条 /3 下一条