电赛总结(四)——波形发生芯片总结之AD9851
一、特性参数
1、180 MHz时钟速率参考时钟具有6倍倍乘器。芯片具有高性能10位DAC和高速滞后比较器
2、+2.7 V至+5.25 V单电源工作
3、正常输出工作频率范围为 0~72MHz ;
4、具有6倍频,所以只要30MHz的时钟供给即可。
二、功能管脚图
三、管脚说明
管脚名称 | 功能 |
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原理图
五、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); }