AD9850 DDS 模块使用说明
By Violet
AD9850 串行输入时序
前 32 位为 DDS 生成的频率数字,对于模块中的 125M 晶振,每单位间隔为
d=
125 10
32
×
2
6
z
H
,每单位对应的频率
那么,对应32000H ,前32位就是32000/d取整后的二进制数字
z
相位信息在这里不做要求,所以后8位全部设置为0
Codes:
unsigned char i;
long int y;
double x;
u8 wdata;
x=4294967295U/125;//适合 125M 晶振
//如果时钟频率不为 180MHZ,修改该处的频率值,单位 MHz !!!
frequence=frequence/1000000;
frequence=frequence*x;
y=frequence;
//写 w4 数据
串行写入时序
wdata=(y>>=0);
for(i=0;i<8;i++)
{
if(wdata&0x01)
AD9850_DATA_H;
else
AD9850_DATA_L;
AD9850_WCLK_H;
wdata=wdata>>1;
AD9850_WCLK_L;
}
wdata=(y>>8);
for(i=0;i<8;i++)
{
if(wdata&0x01)
AD9850_DATA_H;
else
AD9850_DATA_L;
AD9850_WCLK_H;
wdata=wdata>>1;
AD9850_WCLK_L;
}
wdata=y>>16;
for(i=0;i<8;i++)
{
if(wdata&0x01)
AD9850_DATA_H;
else
AD9850_DATA_L;
AD9850_WCLK_H;
wdata=wdata>>1;
AD9850_WCLK_L;
}
wdata=y>>24;
for(i=0;i<8;i++)
{
if(wdata&0x01)
AD9850_DATA_H;
else
AD9850_DATA_L;
AD9850_WCLK_H;
wdata=wdata>>1;
AD9850_WCLK_L;
}
wdata=w0;//写入相位信息 等
for(i=0;i<8;i++)
{
if(wdata&0x01)
AD9850_DATA_H;
else
AD9850_DATA_L;
AD9850_WCLK_H;
wdata=wdata>>1;
AD9850_WCLK_L;
}
AD9850_FQUD_H;
AD9850_FQUD_L;
硬件设置串行输入初始化,pin2=0 pin3=pin4=1
芯片引脚说明
芯片手册来自于 ALLDATASHEET 网站
RF-out 为正弦波输出口
VOUTP 和 VOUTN 为方波输出口
VIN_P 和 VIN_N 的作用是将 RF-OUT 输出的正弦波送到一个施密特触发器(I guess)进行
波形变换(sin——square)
仔细观察布线可以发现短接跳线后即为 pin2=0 pin3=pin4=1
硬件串行的初始化。
关于代码中的是 stm32 GPIO 配置,我这里使用的是野火 MINI 的 GPIO B ,按照模块次
序排列。见下图 stm32 MINI 资源图
#ifndef _AD9850_H
#define _AD9850_H
#include "stm32f10x.h"
#define AD9850_CONTROL_PORT GPIOB
#define AD9850_DATA GPIO_Pin_11
#define AD9850_WCLK GPIO_Pin_9
#define AD9850_FQUD GPIO_Pin_7
#define AD9850_RST GPIO_Pin_5
#define AD9850_WCLK_H GPIO_SetBits(AD9850_CONTROL_PORT,AD9850_WCLK)
#define AD9850_WCLK_L
GPIO_ResetBits(AD9850_CONTROL_PORT,AD9850_WCLK)
#define AD9850_FQUD_H GPIO_SetBits(AD9850_CONTROL_PORT,AD9850_FQUD)
#define AD9850_FQUD_L
GPIO_ResetBits(AD9850_CONTROL_PORT,AD9850_FQUD)
#define AD9850_DATA_H GPIO_SetBits(AD9850_CONTROL_PORT,AD9850_DATA)
#define AD9850_DATA_L
GPIO_ResetBits(AD9850_CONTROL_PORT,AD9850_DATA)
#define AD9850_RESET_H GPIO_SetBits(AD9850_CONTROL_PORT,AD9850_RST)
#define AD9850_RESET_L
GPIO_ResetBits(AD9850_CONTROL_PORT,AD9850_RST)
void AD9850_Delay(unsigned int z);
void AD9850_Write(u8 w0,double frequence);
void AD9850_Init(void);
#endif
主函数
#include "stm32f10x.h"
#include "AD9850.h"
int main(void)
{
AD9850_Init();//初始化,主要为时序
AD9850_Write(0x00,320000);//写入频率
while(1);
}
另外注意的是:
不知道为什么,GPIO B3 总有一个较高电平输出,所以弃用 B3 口
使用 stlink 时,因为 MINI 没有对应的专用接口;可以使用 SWD/JTAG
同时 AD9850 模块供电 5V,可以直接接到 ST-link 供电端口。
ST-link 下载器
波形输出
320K 正弦
20K 正弦