18. AD9833
18.1 简介
- DDS信号发生器模块,工作电压为2.3V~5.5V
- 可编程波形发生器能够产生正弦波、三角波、方波,频率范围为:0~12.5MHz
- 主频时钟为25MHz时,精度为1Hz;主频时钟为
- 通过三个串行接口(SDATA、SCLK、FSYNC)写入数据,一个输出信号接口(VOUT)输出波形
18.2 程序逻辑
(1) 初始化对应输出IO口,总共三个IO口
//IO操作
#define AD9833_SDATA PDout(1) //SDATA
#define AD9833_SCLK PDout(3) //SCLK
#define AD9833_FSYNC PDout(5) //FSYNC
/*
*********************************************************************************************************
* 函 数 名: AD9833_Init
* 功能说明: 初始化AD9833(相关输出引脚的配置)
* 形 参: 无
* 返 回 值: 无
*********************************************************************************************************
*/
void AD9833_Init(void)
{
GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_GPIOD_CLK_ENABLE(); //使能GPIOG时钟
//PD1,3,5初始化设置
GPIO_Initure.Pin=GPIO_PIN_1|GPIO_PIN_3|GPIO_PIN_5;
GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //推挽输出
GPIO_Initure.Pull=GPIO_PULLUP; //上拉
GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH;//高速
HAL_GPIO_Init(GPIOD,&GPIO_Initure);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_1,GPIO_PIN_RESET); //PD1置0
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_3,GPIO_PIN_RESET); //PD3置0
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_5,GPIO_PIN_RESET); //PD5置0
}
(2) 向AD9833写16位数据
/*
*********************************************************************************************************
* 函 数 名: AD9833_Delay
* 功能说明: 时钟延时
* 形 参: 无
* 返 回 值: 无
*********************************************************************************************************
*/
static void AD9833_Delay(void)
{
uint16_t i;
for (i = 0; i < 1; i++);
}
/*
*********************************************************************************************************
* 函 数 名: AD9833_Write
* 功能说明: 向SPI总线发送16个bit数据
* 形 参: TxData : 数据
* 返 回 值: 无
*********************************************************************************************************
*/
void AD9833_Write(unsigned int TxData)
{
int i;
AD9833_SCLK=1;
AD9833_FSYNC=1;
AD9833_FSYNC=0;
//写16位数据
for(i=0;i<16;i++)
{
if (TxData & 0x8000)
AD9833_SDATA=1;
else
AD9833_SDATA=0;
AD9833_Delay();
AD9833_SCLK=0;
AD9833_Delay();
AD9833_SCLK=1;
TxData<<=1;
}
AD9833_FSYNC=1;
}
(3) 控制输出波形
#define TRI_WAVE 0 //输出三角波
#define SIN_WAVE 1 //输出正弦波
#define SQU_WAVE 2 //输出方波
/*
*********************************************************************************************************
* 函 数 名: AD9833_WaveSeting
* 功能说明: 向SPI总线发送16个bit数据
* 形 参: 1.Freq: 频率值, 0.1 hz - 12Mhz
2.Freq_SFR: 0 或 1
3.WaveMode: TRI_WAVE(三角波),SIN_WAVE(正弦波),SQU_WAVE(方波)
4.Phase : 波形的初相位
* 返 回 值: 无
*********************************************************************************************************
*/
void AD9833_WaveSeting(double Freq,unsigned int Freq_SFR,unsigned int WaveMode,unsigned int Phase )
{
int frequence_LSB,frequence_MSB,Phs_data;
double frequence_mid,frequence_DATA;
long int frequence_hex;
/*********************************计算频率的16进制值***********************************/
frequence_mid=268435456/25;//适合25M晶振
//如果时钟频率不为25MHZ,修改该处的频率值,单位MHz ,AD9833最大支持25MHz
frequence_DATA=Freq;
frequence_DATA=frequence_DATA/1000000;
frequence_DATA=frequence_DATA*frequence_mid;
frequence_hex=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_hex高16位送给frequence_HSB
frequence_MSB=frequence_MSB&0x3fff;//去除最高两位,16位数换去掉高位后变成了14位
Phs_data=Phase|0xC000; //相位值
AD9833_Write(0x0100); //复位AD9833,即RESET位为1
AD9833_Write(0x2100); //选择数据一次写入,B28位和RESET位为1
if(Freq_SFR==0) //把数据设置到设置频率寄存器0
{
frequence_LSB=frequence_LSB|0x4000;
frequence_MSB=frequence_MSB|0x4000;
//使用频率寄存器0输出波形
AD9833_Write(frequence_LSB); //L14,选择频率寄存器0的低14位数据输入
AD9833_Write(frequence_MSB); //H14 频率寄存器的高14位数据输入
AD9833_Write(Phs_data); //设置相位
//AD9833_Write(0x2000); /**设置FSELECT位为0,芯片进入工作状态,频率寄存器0输出波形**/
}
if(Freq_SFR==1) //把数据设置到设置频率寄存器1
{
frequence_LSB=frequence_LSB|0x8000;
frequence_MSB=frequence_MSB|0x8000;
//使用频率寄存器1输出波形
AD9833_Write(frequence_LSB); //L14,选择频率寄存器1的低14位输入
AD9833_Write(frequence_MSB); //H14 频率寄存器1为
AD9833_Write(Phs_data); //设置相位
//AD9833_Write(0x2800); /**设置FSELECT位为0,设置FSELECT位为1,即使用频率寄存器1的值,芯片进入工作状态,频率寄存器1输出波形**/
}
if(WaveMode==TRI_WAVE) //输出三角波波形
AD9833_Write(0x2002);
if(WaveMode==SQU_WAVE) //输出方波波形
AD9833_Write(0x2028);
if(WaveMode==SIN_WAVE) //输出正弦波形
AD9833_Write(0x2000);
}