文章目录
- 前言
- 一、DDS是什么(信号发生器)?
- 二、AD9833模块介绍
- 1.概述
- 2.模块移植
- 3、效果展示
前言
如果是玫瑰,它总会开花的。——歌德
一、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)); // 发送频率控制字