电赛总结(四)——波形发生芯片总结之AD9851

时间:2023-12-23 12:33:32

一、特性参数

1、180 MHz时钟速率参考时钟具有6倍倍乘器。芯片具有高性能10位DAC和高速滞后比较器

2、+2.7 V至+5.25 V单电源工作

3、正常输出工作频率范围为 0~72MHz ;

4、具有6倍频,所以只要30MHz的时钟供给即可。

二、功能管脚图

电赛总结(四)——波形发生芯片总结之AD9851

三、管脚说明

管脚名称 功能
D0–D7 8位数据输入. 数据端口,用于装载32位的频率控制字和8位相位控制字。 D7为最高位,D0=最低位
D7, 25引脚, 也作为40位控制字串行输入引脚
PGND

6倍参考时钟倍乘器地

PVcc

6倍参考时钟倍乘器电源

W-CLK 字装入信号,上升沿有效

FQ-UD

频率更新控制信号,时钟上升沿确认输入数据有效
FREFCLOCK 外部参考时钟输入,脉冲序列可直接或间接地加到6倍参考时钟倍乘器上。在直接方式中,输入频率即是系统时钟;在6倍参考时钟倍乘器方式,系统时钟为倍乘器输出
AGND 模拟地

AVDD

模拟电源(+5V)

DGND

数字地
DVDD

数字电源(+5V)

RSET

DAC外部参考电阻连接端

VOUTN 内部比较器负向输出端
VOUTP 内部比较器正向输出端
VINN 内部比较器的负向输入端

VINP

内部比较器的正向输入端
DACBP

DAC旁路连接端

IOUTB

“互补”DAC输出

IOUT

内部DAC输出端

RESET

复位端。低电平清除DDS累加器和相位延迟器为0Hz和0 相位,同时置数据输入为串行模式以及禁止6倍参考时钟倍乘器工作

四、外围电路PCB原理图

电赛总结(四)——波形发生芯片总结之AD9851

五、STM32F103驱动程序

#ifndef __AD9851_H
#define __AD9851_H #include "stm32f10x.h"
#include "gpio.h" #define ad9851_Clk Pin10
#define ad9851_FQ_UD Pin11
#define ad9851_Rst Pin12
#define ad9851_D0 Pin2
#define ad9851_D1 Pin3
#define ad9851_D2 Pin4
#define ad9851_D3 Pin5
#define ad9851_D4 Pin6
#define ad9851_D5 Pin7
#define ad9851_D6 Pin8
#define ad9851_D7 Pin9 void ad9851_write_dds(unsigned long dds); void ad9851_init(void); void ad9851_writefrq(unsigned long freq); #endif /* __DAC_H */
#include "ad9851.h"
#include "pbdata.h"
#include "math.h" unsigned char phase_word = 0x00; //相位控制字,使用低五位
unsigned char power_down = 0x00; //低功耗模式
unsigned char mult = 0x01; //六倍频开关
unsigned char ww[5] = {0x09,0x0E,0x38,0xE3,0xBE};
unsigned long freq,set_value; void ad9851_init(void)
{
set_out(GPIOG,ad9851_Clk | ad9851_FQ_UD | ad9851_Rst | ad9851_D0 | ad9851_D1 | ad9851_D2 | ad9851_D3 | ad9851_D4 | ad9851_D5 |ad9851_D6 | ad9851_D7 );
set_outH(GPIOG,ad9851_Rst);
delay_ms(10);
set_outL(GPIOG,ad9851_Rst);
delay_ms(10);
} void ad9851_write_dds(unsigned long dds)
{
unsigned char i;
ww[0] = (phase_word << 3) | power_down << 2 | mult;
ww[1] = (dds >> 24) & 0xff;
ww[2] = (dds >> 16) & 0xff;
ww[3] = (dds >> 8) & 0xff;
ww[4] = dds & 0xff; set_outL(GPIOG,ad9851_FQ_UD); for(i=0;i<5;i++)
{
set_outL(GPIOG,ad9851_Clk); set_outH(GPIOG,ww[i] << 2);
set_outL(GPIOG,((~ww[i]) << 2) & 0x3fc);
delay_us(10);
set_outH(GPIOG,ad9851_Clk);
delay_us(10);
} set_outH(GPIOG,ad9851_FQ_UD);
delay_us(10);
set_outL(GPIOG,ad9851_FQ_UD);
} void ad9851_writefrq(unsigned long freq)
{
unsigned long dds;
dds = freq;
ad9851_write_dds(dds);
}