有关AD9833的初始化配置程序

更新时间:2023-12-06 13:02:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

有关AD9833配置程序

//AD9833初始化 void AD9833_INIT() {

GPIO_Init(FSYNC1_GPIO_PORT, GPIO_MODE_OUT_PP_HIGH_FAST);

GPIO_Init(SCLK_GPIO_PORT, GPIO_MODE_OUT_PP_HIGH_FAST); GPIO_Init(SDATA_GPIO_PORT, GPIO_MODE_OUT_PP_HIGH_FAST);

GPIO_Init(FSYNC2_GPIO_PORT, GPIO_MODE_OUT_PP_HIGH_FAST);

GPIO_Init(SCLK_GPIO_PORT, GPIO_MODE_OUT_PP_HIGH_FAST); GPIO_Init(SDATA_GPIO_PORT, GPIO_MODE_OUT_PP_HIGH_FAST); }

//此函数是向AD9833中写入16位数据 void write_ad9833_0(unsigned int DDSdata) {

unsigned char i ;

unsigned int DDSdata_temp; DDSdata_temp=DDSdata;

//初始化端口

//GPIO_Init(FSYNC1_GPIO_PORT,

(GPIO_Pin_TypeDef)FSYNC1_GPIO_PINS, (GPIO_Pin_TypeDef)SDATA_GPIO_PINS, (GPIO_Pin_TypeDef)SCLK_GPIO_PINS, (GPIO_Pin_TypeDef)FSYNC2_GPIO_PINS, (GPIO_Pin_TypeDef)SDATA_GPIO_PINS, (GPIO_Pin_TypeDef)SCLK_GPIO_PINS, (GPIO_Pin_TypeDef)FSYNC1_GPIO_PINS,

GPIO_MODE_OUT_PP_HIGH_FAST);

//GPIO_Init(SCLK1_GPIO_PORT, GPIO_MODE_OUT_PP_HIGH_FAST); //GPIO_Init(SDATA1_GPIO_PORT, GPIO_MODE_OUT_PP_HIGH_FAST); GPIO_WriteHigh(FSYNC2_GPIO_PORT, FSYNC2_GPIO_PINS);

GPIO_WriteHigh(SCLK_GPIO_PORT, (GPIO_Pin_TypeDef) SCLK_GPIO_PINS); nop(); nop();

GPIO_WriteHigh(FSYNC1_GPIO_PORT, FSYNC1_GPIO_PINS); nop(); nop();

GPIO_WriteLow(FSYNC1_GPIO_PORT, (GPIO_Pin_TypeDef) FSYNC1_GPIO_PINS); nop(); nop();

for(i=0;i<16;i++) {

//GPIO_WriteHigh(SDATA9833_GPIO_PORT, SDATA9833_GPIO_PINS); if (DDSdata_temp&0x8000) {

GPIO_WriteHigh(SDATA_GPIO_PORT, SDATA_GPIO_PINS); } else {

GPIO_WriteLow(SDATA_GPIO_PORT, SDATA_GPIO_PINS);

(GPIO_Pin_TypeDef) (GPIO_Pin_TypeDef) (GPIO_Pin_TypeDef) (GPIO_Pin_TypeDef) (GPIO_Pin_TypeDef)

(GPIO_Pin_TypeDef)SDATA1_GPIO_PINS, (GPIO_Pin_TypeDef)SCLK1_GPIO_PINS,

}

//GPIO_Write(SDATA9833_GPIO_PORT,(DDSdata_temp&0x8000)); nop(); nop();

GPIO_WriteLow (SCLK_GPIO_PORT, (GPIO_Pin_TypeDef) SCLK_GPIO_PINS); nop(); nop();

GPIO_WriteHigh(SCLK_GPIO_PORT, (GPIO_Pin_TypeDef) SCLK_GPIO_PINS); nop(); nop();

DDSdata_temp=DDSdata_temp<<1; //16位数据从高位到低位送入 }

GPIO_WriteHigh(FSYNC1_GPIO_PORT, FSYNC1_GPIO_PINS); nop(); nop();

GPIO_WriteLow(SCLK_GPIO_PORT, (GPIO_Pin_TypeDef) SCLK_GPIO_PINS); nop(); nop(); }

/*************计算AD9833的28位数据值***************/

/**变量frequence就是频率值,单位Hz,比如输入100Hz,则 frequence为100,需要特别注意的是不能超过12MHz;*******/

/*****变量frequence_SFR是设置频率寄存器选择0为频率寄存器0,1为频率寄存器1;*******/

/*****变量WAVE_MODE是设置输出波形选择0为三角波,1为方波,2为正弦波;*******/

/*****变量Phase是设置波形相位值*******/

(GPIO_Pin_TypeDef)

/*****变量FSYNC为片选,0为第一片,1为第二片*******/ void

ad9833_data(double

frequence,unsigned

int

FSYNC,unsigned

int

WAVE_MODE,unsigned int Phase ) {

int frequence_LSB,frequence_MSB,Phs_data; double frequence_mid,frequence_DATA; long int frequence_hex;

/*********************************计算频率的***********************************/ frequence_mid=268435456/25;//适合25M晶振

//如果时钟频率不为25MHZ,修改该处的频率值,单位MHz

//AD9833最大支持25MHz frequence_DATA=frequence;

frequence_DATA=frequence_DATA/1000000; frequence_DATA=frequence_DATA*frequence_mid;

frequence_hex=(long int)frequence_DATA; //这个frequence_hex的值是32位的一个很大的数字,需要拆分成两个14位进行处

frequence_LSB=frequence_hex; //frequence_hex低16位送给frequence_LSB frequence_LSB=frequence_LSB&0x3fff;//去除最高两位,16位数换去掉高位后变成了14位

frequence_MSB=frequence_hex>>14; //frequence_hexfrequence_HSB

frequence_MSB=frequence_MSB&0x3fff;//去除最高两位,16位数换去掉高位后变成了14位

/****************************************************************************/

/*******************************************************************/

16

位送给16

进制值

Phs_data=Phase|0xC000;

/*****************************************************************************/

if(FSYNC==0) //把数据设置到设置频率寄存器0 {

frequence_LSB=frequence_LSB|0x4000; frequence_MSB=frequence_MSB|0x4000;

/**************使用频率寄存器0输出波形******************/ /*************************************************/ write_ad9833_0(0x0100); //复位AD9833,即RESET位为1

write_ad9833_0(0x2000); //选择数据一次写入,B28位和RESET位为1 write_ad9833_0(frequence_LSB); //L14,选择频率寄存器0的低14位数据输入 write_ad9833_0(frequence_MSB); //H14 频率寄存器的高14位数据输入 write_ad9833_0(Phs_data); //设置相位

//write_ad9833_d16(0x2000); /**设置FSELECT位为0,芯片进入工作状态,频率寄存器0输出波形**/ }

/************************************************************************************/

if(FSYNC==1) //把数据设置到设置频率寄存器1 {

frequence_LSB=frequence_LSB|0x8000; frequence_MSB=frequence_MSB|0x8000;

//使用频率寄存器1输出波形

/*************************************************/ write_ad9833_1(0x0100); //复位AD9833,即RESET位为1

write_ad9833_1(0x2000); //选择数据一次写入,B28位和RESET位为1

write_ad9833_1(frequence_LSB); //L14,选择频率寄存器1的低14位输入 write_ad9833_1(frequence_MSB); //H14 频率寄存器1为 write_ad9833_1(Phs_data); //设置相位

//write_ad9833_d16(0x2800); /**设置FSELECT位为0,设置FSELECT位为1,即使用频率寄存器1的值,芯片进入工作状 //态,频率寄存器1输出波形**/ }

/****************************************************************************************/ if(WAVE_MODE==0) {

//频率寄存器输出三角波波形

/***************************************************/ delay(0xFFFF); if(FSYNC==0)

write_ad9833_0(0x2002); //设置MODE位为1,输出三角波模式 else

write_ad9833_1(0x2002); //设置MODE位为1,输出三角波模式 }

/***************************************************/ if(WAVE_MODE==1) {

//频率寄存器输出方波波形

/***************************************************/ delay(0xFFFF); if(FSYNC==0)

write_ad9833_0(0x2028); //设置OPBITEN位为1,方波输出模式 else

write_ad9833_1(0x2028); //设置OPBITEN位为1,方波输出模式 }

/***************************************************/ if(WAVE_MODE==2) {

//频率寄存器输出正弦波波形

/***************************************************/ delay(0xFFFF); if(FSYNC==0)

write_ad9833_0(0x2000); //设置MODE位为0,输出正弦波模式 else

write_ad9833_1(0x2000); //设置MODE位为0,输出正弦波模式 }

/***************************************************/ }

本文来源:https://www.bwwdw.com/article/h1pt.html

Top