前言
如果是玫瑰,它总会开花的。——歌德
一、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.模块移植
时序图如下:
文章来源:https://www.toymoban.com/news/detail-686040.html
文章来源地址https://www.toymoban.com/news/detail-686040.html
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、效果展示
到了这里,关于2.电赛进行时......(AD9833(DDS)模块的学习使用)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!