2.电赛进行时......(AD9833(DDS)模块的学习使用)

本文介绍了DDS(直接数字合成)技术以及AD9833模块在信号发生器中的应用。详细讲解了AD9833的工作原理,包括相位累加器、相位幅度转换和数模转换器的作用。此外,还提供了AD9833模块的移植方法,包括SPI通信的时序图和相关函数代码,以及如何设置频率和相位。
摘要由CSDN通过智能技术生成


前言

如果是玫瑰,它总会开花的。——歌德


一、DDS是什么(信号发生器)?

直接数字合成是生成模拟信号的一种常用方法,简单意义上的DDS,主要由相位累加器、相位幅度转换、数模转换器组成。

相位累加器:
	相位累加器就是一个不断累加产生相位值的计数器,周期性地累加、清零。相位累加器的位数决定了把一个周期分为多少等分,位数越高,则分得越细,一个周期内的点数也越多,输出波形在时间尺度上就会越精细。

相位幅度转换:
	相位幅度转换其实就是已经存储的波形表,比如我们想输出正弦波的波形时,相位累加器输出的相位是30°,则通过查表,输出sin(30°)的值,就完成了相位幅度转换。

DAC输出:
	有了幅度值,再通过DAC输出,就得到了当前时刻的波形值。这个就不多解释了,和通用的DAC一个意思。这里的DAC也是有位数的,位数越高,产生的波形幅度就越精细。

二、AD9833模块介绍

在这里插入图片描述

1.概述

AD9833是一款低功耗、可编程波形发生器,能够产生正弦波、三角波和方波输出。各种类型的检测、信号激励和时域反射(TDR)应用都需要波形发生器。
输出频率和相位可通过软件进行编程,调整简单。无需外部元件。频率寄存器为28位:
时钟速率为25 MHz时,可以实现0.1 Hz的分辨率;而时钟速率为1 MHz时,则可以实现0.004 Hz的分辨率。
AD9833通过一个三线式串行接口写入数据。该串行接口能够以最高40 MHz的时钟速率工作,并且与DSP和微控制器标准兼容。该器件采用2.3 V至5.5 V电源供电。
AD9833具有省电功能。此功能允许关断器件中不用的部分,从而将功耗降至最低。例如,在产生时钟输出时,可以关断DAC。

在这里插入图片描述
因为AD9833的输入时钟频率最高是25MHz,由于奈奎斯特采样定律的限制,输出波形的每个周期内至少要2个点才能还原出信号,所以,25MHz/2 = 12.5MHz

2.模块移植

时序图如下:

在这里插入图片描述

在这里插入图片描述

AD9833.c
void GPIO_AD9833_Configuration(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;

	// 使能时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);  
	// 									     	        	SDATA	   		SCLK			FSUNC			 		    		 
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_12 | GPIO_Pin_14;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_Init(GPIOC, &GPIO_InitStructure);
}

//-----------------------------------------------------------------
// void SPI_Init (void)
//-----------------------------------------------------------------
//
// 函数功能: SPI通讯线初始化设置
// 入口参数: 无
// 返回参数: 无
// 全局变量: 无
// 调用模块: 无
// 注意事项: 
//			
//-----------------------------------------------------------------
void SPI_Init (void)
{
	ADI_CS_HIGH;
	ADI_SCL_HIGH;
	ADI_SD_LOW;
}


//-----------------------------------------------------------------
// SPI_Write (unsigned short ddara)
//-----------------------------------------------------------------
//
// 函数功能: 通过SPI方式写数据
// 入口参数: ddara:要写入的16位的参数
// 返回参数: 无
// 全局变量: 无
// 调用模块: 无   
// 注意事项: 无
//					 
//-----------------------------------------------------------------
void SPI_Write (unsigned short ddara)
{
	unsigned char i;
	for (i = 0; i < 16; i ++)
	{
		if ((ddara & 0x8000) == 0x8000)
		{
			ADI_SD_HIGH;
		}
		else 
		{
			ADI_SD_LOW;
		}
		ADI_SCL_LOW;
		ddara <<= 1;
		ADI_SCL_HIGH;
	}
}

//-----------------------------------------------------------------
// unsigned char AD9833_Init(void)
//-----------------------------------------------------------------
//
// 函数功能: AD9833初始化函数
// 入口参数: 无
// 返回参数: 无
// 全局变量: 无
// 调用模块: SPI_Init(); AD9833_SetRegisterValue(), 	
// 注意事项: 无
//
//-----------------------------------------------------------------
unsigned char AD9833_Init(void)
{
    SPI_Init();
    AD9833_SetRegisterValue(AD9833_REG_CMD | AD9833_RESET);
	
    return (1);
}

//-----------------------------------------------------------------
// void AD9833_Reset(void)
//-----------------------------------------------------------------
//
// 函数功能: AD9833复位函数
// 入口参数: 无
// 返回参数: 无
// 全局变量: 无
// 调用模块: AD9833_SetRegisterValue(), 			
// 注意事项: 无
// 		
//-----------------------------------------------------------------
void AD9833_Reset(void)
{
    AD9833_SetRegisterValue(AD9833_REG_CMD | AD9833_RESET);
}

//-----------------------------------------------------------------
// void AD9833_ClearReset(void)
//-----------------------------------------------------------------
//
// 函数功能: AD9833清除复位函数
// 入口参数: 无
// 返回参数: 无
// 全局变量: 无
// 调用模块: AD9833_SetRegisterValue(), 
// 					
// 注意事项: 无
//-----------------------------------------------------------------
void AD9833_ClearReset(void)
{
	AD9833_SetRegisterValue(AD9833_REG_CMD);
}

//-----------------------------------------------------------------
// void AD9833_SetRegisterValue(unsigned short regValue)
//-----------------------------------------------------------------
//
// 函数功能: 设置AD9833寄存器的值
// 入口参数: regValue:要设置寄存器的值
// 返回参数: 无
// 全局变量: 无
// 调用模块: SPI_Write(), 
// 					
// 注意事项: 无
//-----------------------------------------------------------------
void AD9833_SetRegisterValue(unsigned short regValue)
{
	ADI_CS_LOW;	    
	SPI_Write(regValue);
	ADI_CS_HIGH;
}

//-----------------------------------------------------------------
// AD9833_SetFrequency  ()
//-----------------------------------------------------------------
//
// 函数功能: AD9833 设置频率寄存器
// 入口参数: reg:频率寄存器写入 wave_type:波形类型 val:值
// 返回参数: 无
// 全局变量: 无
// 调用模块: AD9833_SetRegisterValue(), 
// 					
// 注意事项: 无
//-----------------------------------------------------------------
void AD9833_SetFrequency(unsigned short reg,  unsigned short wave_type,  unsigned long val)
{
	unsigned short  freqHi = reg;
	unsigned short  freqLo = reg;
	
	freqHi |= (val & 0xFFFC000) >> 14 ;
	freqLo |= (val & 0x3FFF);

	AD9833_SetRegisterValue(AD9833_B28);
	AD9833_SetRegisterValue(freqLo);
	AD9833_SetRegisterValue(freqHi);
	AD9833_SetRegisterValue(AD9833_REG_CMD | AD9833_B28 | wave_type);
}

/* ***********************************************************************
 * @brief Writes to the frequency registers.
 *
 * @param -  reg - Frequence register to be written to.
 * @param -  val - The value to be written.
 *
 * @return  None.    
*************************************************************************/
/*
void AD9833_SetFrequency(unsigned short reg, unsigned short wave_type, unsigned long val)
{
	unsigned short freqHi = reg;
	unsigned short freqLo = reg;
	
	freqHi |= (val & 0xFFFC000) >> 14 ;
	freqLo |= (val & 0x3FFF);
	if (wave_type == 0x55)
	{
		AD9833_SetRegisterValue(AD9833_B28 | AD9833_OUT_SINUS);
	}
	else if (wave_type == 0xAA)
	{
		AD9833_SetRegisterValue(AD9833_B28 | AD9833_OUT_TRIANGLE);
	}
	else 
	{
		AD9833_SetRegisterValue(AD9833_B28);
	}
	AD9833_SetRegisterValue(freqLo);
	AD9833_SetRegisterValue(freqHi);
}
*/

//-----------------------------------------------------------------
// void AD9833_SetPhase(unsigned short reg, unsigned short val)
//-----------------------------------------------------------------
//
// 函数功能: 设置AD9833的相位寄存器的值
// 入口参数: reg:相位寄存器 val:值
// 返回参数: 无
// 全局变量: 无
// 调用模块: AD9833_SetRegisterValue(),
// 注意事项: 无
//-----------------------------------------------------------------
void AD9833_SetPhase(unsigned short reg, unsigned short val)
{
	unsigned short phase = reg;
	phase |= val;
	AD9833_SetRegisterValue(phase);
}

//-----------------------------------------------------------------
// void AD9833_Setup(unsigned short freq,
//				  unsigned short phase,
//			 	  unsigned short type)
//-----------------------------------------------------------------
//
// 函数功能: 设置AD9833的频率,相位,波形类型 的值
// 入口参数: freq:频率 phase:相位 type:波形类型
// 返回参数: 无
// 全局变量: 无
// 调用模块: AD9833_SetRegisterValue(),
// 注意事项: 无
//-----------------------------------------------------------------
void AD9833_Setup(unsigned short freq,
				  unsigned short phase,
			 	  unsigned short type)
{
	unsigned short val = 0;
	
	val = freq | phase | type;
	AD9833_SetRegisterValue(val);
}

//-----------------------------------------------------------------
// void AD9833_SetWave(unsigned short type)
//-----------------------------------------------------------------
//
// 函数功能: 设置AD9833的波形类型
// 入口参数: type:波形类型
// 返回参数: 无
// 全局变量: 无
// 调用模块: AD9833_SetRegisterValue(),
// 注意事项: 无
//-----------------------------------------------------------------
void AD9833_SetWave(unsigned short type)
{
	AD9833_SetRegisterValue(type);
}


//-----------------------------------------------------------------
// End Of File
//-----------------------------------------------------------------

AD9833.h

//-----------------------------------------------------------------
// I/O口定义
//-----------------------------------------------------------------

#define  ADI_SD_LOW    (GPIO_ResetBits(GPIOC,GPIO_Pin_10))
#define  ADI_SD_HIGH   (GPIO_SetBits(GPIOC,GPIO_Pin_10))
#define  ADI_SCL_LOW   (GPIO_ResetBits(GPIOC,GPIO_Pin_12))
#define  ADI_SCL_HIGH  (GPIO_SetBits(GPIOC,GPIO_Pin_12))
#define  ADI_CS_LOW    (GPIO_ResetBits(GPIOC,GPIO_Pin_14))
#define  ADI_CS_HIGH   (GPIO_SetBits(GPIOC,GPIO_Pin_14))


//-----------------------------------------------------------------
// AD9833宏定义
//-----------------------------------------------------------------
/* Registers 寄存器 */
#define AD9833_REG_CMD		(0 << 14)
#define AD9833_REG_FREQ0	(1 << 14)
#define AD9833_REG_FREQ1	(2 << 14)
#define AD9833_REG_PHASE0	(6 << 13)
#define AD9833_REG_PHASE1	(7 << 13)

/* Command Control Bits 命令控制位 */
#define AD9833_B28			(1 << 13)
#define AD9833_HLB			(1 << 12)
#define AD9833_FSEL0		(0 << 11)
#define AD9833_FSEL1		(1 << 11)
#define AD9833_PSEL0		(0 << 10)
#define AD9833_PSEL1		(1 << 10)
#define AD9833_PIN_SW		(1 << 9)
#define AD9833_RESET		(1 << 8)
#define AD9833_SLEEP1		(1 << 7)
#define AD9833_SLEEP12		(1 << 6)
#define AD9833_OPBITEN		(1 << 5)
#define AD9833_SIGN_PIB		(1 << 4)
#define AD9833_DIV2			(1 << 3)
#define AD9833_MODE			(1 << 1)

#define AD9833_OUT_SINUS	((0 << 5) | (0 << 1) | (0 << 3))
#define AD9833_OUT_TRIANGLE	((0 << 5) | (1 << 1) | (0 << 3))
#define AD9833_OUT_MSB		((1 << 5) | (0 << 1) | (1 << 3))
#define AD9833_OUT_MSB2		((1 << 5) | (0 << 1) | (0 << 3))

//-----------------------------------------------------------------
// 函数声明
//-----------------------------------------------------------------
void GPIO_AD9833_Configuration(void);
void SPI_Init (void);				// SPI 初始化
void SPI_Write (unsigned short ddara);
/* Initializes the SPI communication peripheral and resets the part. */
unsigned char AD9833_Init(void);
/* Sets the Reset bit of the AD9833. */
void AD9833_Reset(void);
/* Clears the Reset bit of the AD9833. */
void AD9833_ClearReset(void);
/* Writes the value to a register. */
void AD9833_SetRegisterValue(unsigned short regValue);
/* Writes to the frequency registers. */
//void AD9833_SetFrequency(unsigned short reg, unsigned long val);
void AD9833_SetFrequency(unsigned short reg, unsigned short wave_type, unsigned long val);
/* Writes to the phase registers. */
void AD9833_SetPhase(unsigned short reg, unsigned short val);
/* Selects the Frequency,Phase and Waveform type. */
void AD9833_Setup(unsigned short freq,
				  unsigned short phase,
			 	  unsigned short type);

#endif

//-----------------------------------------------------------------
// End Of File
//-----------------------------------------------------------------


main.c
	AD9833_Reset();
	HAL_Delay(20);
	AD9833_Init();
	HAL_Delay(20);
	AD9833_SetFrequency(AD9833_REG_FREQ0, AD9833_OUT_SINUS, freq_trl_word(2000));		// 发送频率控制字

3、效果展示在这里插入图片描述


评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值