硬件
正点原子精英板、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://www.toymoban.com/news/detail-590910.html
程序链接
https://download.csdn.net/download/qq_45974939/87672298文章来源地址https://www.toymoban.com/news/detail-590910.html
到了这里,关于DDS信号发生器(stm32+ad9850)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!