赞
踩
如果是玫瑰,它总会开花的。——歌德
直接数字合成是生成模拟信号的一种常用方法,简单意义上的DDS,主要由相位累加器、相位幅度转换、数模转换器组成。
相位累加器:
相位累加器就是一个不断累加产生相位值的计数器,周期性地累加、清零。相位累加器的位数决定了把一个周期分为多少等分,位数越高,则分得越细,一个周期内的点数也越多,输出波形在时间尺度上就会越精细。
相位幅度转换:
相位幅度转换其实就是已经存储的波形表,比如我们想输出正弦波的波形时,相位累加器输出的相位是30°,则通过查表,输出sin(30°)的值,就完成了相位幅度转换。
DAC输出:
有了幅度值,再通过DAC输出,就得到了当前时刻的波形值。这个就不多解释了,和通用的DAC一个意思。这里的DAC也是有位数的,位数越高,产生的波形幅度就越精细。
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
时序图如下:
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)); // 发送频率控制字
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。