DDS信号发生器(stm32+ad9850)

硬件

正点原子精英板、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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

月牙 ,呐

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

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

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

打赏作者

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

抵扣说明:

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

余额充值