DDS信号发生器(stm32+ad9850)

2 篇文章 0 订阅
1 篇文章 0 订阅

硬件

正点原子精英板、ad9850、杜邦线
请添加图片描述

软件

/********************************************
函数名称:AD9850_Delay
功    能:AD9850延时函数
参    数:z - 延时长度
返回值  :无
*********************************************/
void AD9850_Delay(unsigned int z)
{
    for(;z>0;z--)
    {;}
}

/*--------------------并行模式-----------------------*/
#ifdef MODE_PARALLEL   
/********************************************
函数名称:AD9850_Reset_Parallel
功    能:在并行模式下复位AD9850
参    数:无
返回值  :无
*********************************************/
void AD9850_Reset_Parallel(void)
{
    AD9850_WCLK_CLR ;
    AD9850_FQUD_CLR ;
    //RST信号
    AD9850_RST_CLR ;
    AD9850_RST_SET ;
    AD9850_Delay(0xFFFF) ;
    AD9850_RST_CLR ;
}

/********************************************
函数名称:AD9850_Write_Parallel
功    能:在并行模式下写AD9850寄存器
参    数:W0 - W0寄存器的值
          freq - 频率值
返回值  :无
*********************************************/
void AD9850_Write_Parallel(unsigned char W0,unsigned long freq)//W0是用来设置相位的
{
    unsigned char wdata ;//写入数据(一次8位)
        unsigned long  y ;
			y=4294967296.0/125;//4294967296是2的32次方
			y*=(((float)freq)/1000000); //y(频率控制字)的计算公式:y = (freq * 4294967296)/125M
	
    wdata=W0 ;  //写w0
    GPIO_Write(AD9850_DATA_PORT ,wdata) ;   
		AD9850_WCLK_SET ;  
		AD9850_WCLK_CLR ;
		delay_ms(1);
    
    wdata=y>>24 ;  //写w1(从高位开始写入)
    GPIO_Write(AD9850_DATA_PORT ,wdata) ; 
		AD9850_WCLK_SET ;  
		AD9850_WCLK_CLR ;
	 
    	delay_ms(1);
    wdata=y>>16 ;  //写w2
    GPIO_Write(AD9850_DATA_PORT ,wdata) ;
		AD9850_WCLK_SET;
    AD9850_WCLK_CLR ;
		
    	delay_ms(1);
    wdata=y>>8 ;  //写w3
    GPIO_Write(AD9850_DATA_PORT ,wdata) ;
		AD9850_WCLK_SET;
		AD9850_WCLK_CLR ;
		
    	delay_ms(1);
    wdata=y>>0 ;  //写w4
		GPIO_Write(AD9850_DATA_PORT ,wdata) ;  
		AD9850_WCLK_SET;		
    AD9850_WCLK_CLR ;
	
    	delay_ms(1);
		 AD9850_FQUD_SET ;   //移入使能
    AD9850_Delay(0xFFFF) ;
		AD9850_FQUD_CLR ;  
   
}
#endif /* MODE_PARALLEL */
/*------------------------并行模式-------------------------*/
/*---------------------------------------------------------*/

/*------------------------串行模式-------------------------*/
#ifdef MODE_SEIAL
/********************************************
函数名称:AD9850_Reset_Sreial
功    能:在串行模式下复位AD9850
参    数:无
返回值  :无
*********************************************/
/********************************************
函数名称:AD9850_Write_Serial
功    能:在串行模式下写AD9850寄存器
参    数:W0 - W0寄存器的值
          freq - 频率值
返回值  :无
*********************************************/
void AD9850_Write_Serial(unsigned char W0,unsigned long freq)
{
    unsigned char i,wdata ;
     unsigned long  y ;
	y=4294967296.0/125;
	y*=(((float)freq)/1000000);
	    
    wdata = y>>0 ;   //写w4
	    AD9850_WCLK_CLR ;
    AD9850_FQUD_CLR ;
    //RST信号
    AD9850_RST_CLR ;
    AD9850_RST_SET ;
//    AD9850_Delay(0xFFFF) ;
	delay_ms(3);
    AD9850_RST_CLR ;
    //WCLK信号
    AD9850_WCLK_CLR ;
    AD9850_WCLK_SET ;
//    AD9850_Delay(0xFFFF) ;
	delay_ms(3);
    AD9850_WCLK_CLR ;
    //FQUD信号
    AD9850_FQUD_CLR ;
    AD9850_FQUD_SET ;
//    AD9850_Delay(0xFFFF) ;
	delay_ms(3);
    AD9850_FQUD_CLR ;
    for(i=0 ;i<8 ;i++)
    {
        if(wdata & 0x01)
          AD9850_DATA_Write_1 ;
        else
          AD9850_DATA_Write_0 ;
        AD9850_WCLK_SET ;
        wdata >>= 1 ;
        AD9850_WCLK_CLR ;
    }
    wdata = y>>8 ;  //写w3
     for(i=0 ;i<8 ;i++)
    {
        if(wdata & 0x01)
          AD9850_DATA_Write_1 ;
        else
          AD9850_DATA_Write_0 ;
        AD9850_WCLK_SET ;
        wdata >>= 1 ;
        AD9850_WCLK_CLR ;
    }
    wdata = y>>16 ;  //写w2
     for(i=0 ;i<8 ;i++)
    {
        if(wdata & 0x01)
          AD9850_DATA_Write_1 ;
        else
          AD9850_DATA_Write_0 ;
        AD9850_WCLK_SET ;
        wdata >>= 1 ;
        AD9850_WCLK_CLR ;
    }
    wdata = y>>24 ;  //写w1
     for(i=0 ;i<8 ;i++)
    {
        if(wdata & 0x01)
          AD9850_DATA_Write_1 ;
        else
          AD9850_DATA_Write_0 ;
        AD9850_WCLK_SET ;
        wdata >>= 1 ;
        AD9850_WCLK_CLR ;
    }
    wdata = W0 ;  //写w0
     for(i=0 ;i<8 ;i++)
    {
        if(wdata & 0x01)
          AD9850_DATA_Write_1 ;
        else
          AD9850_DATA_Write_0 ;
        AD9850_WCLK_SET ;
        wdata >>= 1 ;
        AD9850_WCLK_CLR ;
    }
    
    AD9850_FQUD_SET ;  //移入使能
//    AD9850_Delay(0xFFFF) ;
    AD9850_FQUD_CLR ;
}
#endif /* MODE_SERIAL */

/*------------------------串行模式-------------------------*/
/*---------------------------------------------------------*/

/********************************************
函数名称:Init_AD9834(主要是初始化GPIO)
功    能:初始化AD9834
参    数:无
返回值  :无
*********************************************/
void Init_AD9850(void)
{
#ifdef MODE_SEIAL   //串行模式
    GPIO_InitTypeDef GPIO_InitStructure ;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
    GPIO_InitStructure.GPIO_Pin = AD9850_WCLK | AD9850_FQUD | AD9850_RST | AD9850_DATA ;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz ;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(AD9850_CONTROL_PORT ,&GPIO_InitStructure) ;
    
#endif
    
#ifdef MODE_PARALLEL //并行模式
	
    GPIO_InitTypeDef GPIO_InitStructure ;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO , ENABLE);
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE);//?
    GPIO_InitStructure.GPIO_Pin = AD9850_WCLK | AD9850_FQUD | AD9850_RST ;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz ;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
    GPIO_Init(AD9850_CONTROL_PORT ,&GPIO_InitStructure) ;
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All ;//可以
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz ;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(AD9850_DATA_PORT ,&GPIO_InitStructure);
    
    AD9850_Reset_Parallel() ;//并行模式下复位AD9850
#endif
    
}

效果

在这里插入图片描述
在这里插入图片描述

程序链接

https://download.csdn.net/download/qq_45974939/87672298

  • 2
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
### 回答1: STM32 DDS信号发生器AD985是一种基于STM32芯片和AD985芯片的信号发生器,可以用于产生各种波形信号,如正弦波、方波、三角波等。它具有高精度、高稳定性、低噪声等特点,广泛应用于科研、教学、工业控制等领域。通过编程控制,可以实现频率、相位、幅度等参数的调节,具有很高的灵活性和可扩展性。 ### 回答2: STM32 DDS信号发生器AD9850是一种数字信号处理设备,可用于产生各种高精度、高稳定性、高频分辨率的信号。它是由STM32控制器和AD9850数模转换器组成的,可通过STM32主控板控制信号的频率、相位、振幅等参数,从而实现多种信号的生成和输出。 作为一种高性能的DDS设备,STM32 DDS信号发生器AD9850具有多种优点。首先,它的频率分辨率很高,可达到0.0291 Hz/Hz(40 MHz系统时钟)。其次,它的频率可调范围广泛,可在0至40 MHz的范围内任意设置。此外,它还可以产生多种波形信号,如正弦波、方波、锯齿波等。最重要的是,它的精度和稳定性都非常高,能够满足各种精密测量和控制的需求。 除了以上的优点外,STM32 DDS信号发生器AD9850还具有一定的应用范围,在科研、教育、工业等领域得到了广泛的应用。例如,它可用于信号源、刺激源、频率计、测试仪器等领域,用于产生不同频率、相位和振幅的信号,从而实现信号处理、信号传输和信号检测等功能。此外,它还可以作为音乐发生器,产生不同音高和音色的声音,为音乐制作和演奏提供便利。 总之,STM32 DDS信号发生器AD9850是一种功能强大、性能优良的数字信号处理设备,具有多种优点和应用价值,可为科研、教育、工业等领域提供大量实用的功能和服务。 ### 回答3: STM32 DDS信号发生器AD9850是一种广泛应用于通讯、广播、电子测量、医疗电子等领域的数字信号发生器。它可以产生高精度的正弦波、方波、锯齿波等不同形式的信号,并可通过外部模拟信号或数字信号来实现频率与相位调制等功能。 STM32 DDS信号发生器AD9850的核心芯片是ADI公司的AD9850,它是一种单片、直接数字合成器(DDS)芯片,其工作频率范围为0至40MHz,分辨率为32Bits,噪声低于-40dBc/Hz,输出功率可达到+13dBm。该芯片有16位相位累加器和40位频率累加器,可实现极高的频率、相位精度。同时,该芯片还内置了RAM存储器,可以存储8个用户自定义的频率与相位控制字,便于系统集成与调试。 STM32 DDS信号发生器AD9850主要由STM32F103C8T6单片机AD9850芯片、LC低通滤波器等组成。STM32F103C8T6单片机负责控制AD9850芯片,包括数据传输、频率相位控制、输出信号波形选择等,同时还负责与外部设备通信,以实现更多功能。LC低通滤波器则用于将数字信号转换为模拟信号,以产生高纯度的信号。 STM32 DDS信号发生器AD9850具有体积小、稳定性高、调节方便、频率稳定性好等优点。它可以广泛用于各种测试仪器、医疗设备、音乐设备等的信号源,是一款优秀的信号发生器

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

月牙 ,呐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值