电赛进行时:深入学习和使用AD9833(DDS)模块

文章目录

  • 前言
  • 一、DDS是什么(信号发生器)?
  • 二、AD9833模块介绍
  • 1.概述
  • 2.模块移植
  • 3、效果展示![在这里插入图片描述](https://i3.wp.com/img-blog.csdnimg.cn/2b0d29939275403f9248339c894965a0.png#pic_center)

  • 前言

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


    一、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、效果展示


    物联沃分享整理
    物联沃-IOTWORD物联网 » 电赛进行时:深入学习和使用AD9833(DDS)模块

    发表回复