CSDN话题挑战赛第2期
参赛话题:学习笔记
使用Arduino 控制 AD9850 做一个智能音箱
来自 Analog Devices 9850的数据手册 :(http://www.analog.com/media/en/technical-documentation/data-sheets/AD9850.pdf)
AD9850是一款高度集成的设备,它使用先进的DDS技术,结合内部高速、高性能D/a转换器和比较器,形成完整的数字可编程频率合成器和时钟发生器功能。当参考精确的时钟源时,AD9850生成光谱纯、频率/相位可编程的模拟输出正弦波。这个正弦波可以直接用作频率源,也可以转换为方波,用于灵活的时钟发生器应用。AD9850的创新型高速DDS核心提供32位频率调谐字,对于125 MHz基准时钟,输出调谐分辨率为0.0291 Hz。输入AD9850的电路结构允许产生高达参考时钟频率一半的输出频率(或62.5 MHz),并且输出频率可以每秒高达2300万个新频率的速率进行数字更改(异步)。该设备还提供五位数字控制相位调制,可使其输出以180°、90°、45°、22.5°、11.25°及任意组合的增量进行相移。
AD9850还包含一个高速比较器,可配置为接受DAC的(外部)滤波输出,以生成低抖动方波输出。这有助于将设备用作灵活的时钟发生器功能。频率调谐、控制和相位调制字通过并行字节或串行加载格式加载到AD9850中。并行加载格式由五个迭代加载组成8位控制字(字节)。第一字节控制相位调制、掉电启用和加载格式;字节2至5包含32位频率调谐字。串行加载通过单个管脚上的40位串行数据流完成。AD9850 Complete DDS使用先进的CMOS技术提供了这一突破性的功能和性能水平功耗仅为155 mW(3.3 V电源)。AD9850采用节省空间的28导SSOP表面安装封装。规定在-40°C至+85°C的扩展工业温度范围内运行。
AD9850 库关键字
重置 KEYWORD2
ApplySignal KEYWORD2
设置频率 KEYWORD2
SetPhase KEYWORD2
递增频率 KEYWORD2
增量阶段 KEYWORD2
断电 KEYWORD2
GetFreqResolution KEYWORD2
GetPhaseResolution KEYWORD2
“AD9850 是一款高度集成的器件,采用先进的 DDS 技术与内部高速、高性能 D/A 转换器和比较器相结合,形成完整的数字可编程频率合成器和时钟发生器功能。当参考准确的时钟源时, “
“AD9850 的创新高速 DDS 内核提供 32 位频率调谐字,在 125 MHz 参考时钟输入下,输出调谐分辨率为 0.0291 Hz。AD9850 的电路架构允许生成高达 1-参考时钟频率的一半(或 62.5 MHz),输出频率可以以每秒高达 2300 万个新频率的速度进行数字更改(异步)。该器件还提供 5 位数控相位调制,可实现相位以 180°、90°、45°、22.5°、11.25° 及其任意组合的增量移动其输出。AD9850 还包含一个高速比较器,可配置为接受 DAC 的(外部)滤波输出产生一个低抖动的方波输出。这有助于该设备用作灵活的时钟发生器功能。”
20MHz 的正弦波输出
方波输出。占空比调整为 50%
API库函数文件
//The API is in work.
// Define AD9850 using Serial mode loading.
AD9850 ( uint8_t freqUpdate, uint8_t wordClk, uint8_t reset,
uint8_t powerDownPin, uint8_t dataPin );
// Define AD9850 using predefined pins.
// Uses Direct Port writes for maximum speed.
// See AD9850.h files for pin definitions
AD9850 ( bool useSerialLoad, uint8_t reset );
// Define AD9850 using Parallel mode loading.
// This will require 8 separate digitalWrites for each pin.
AD9850 ( uint8_t freqUpdate, uint8_t wordClk, uint8_t reset,
uint8_t data7, uint8_t data6, uint8_t data5, uint8_t data4,
uint8_t data3, uint8_t data2, uint8_t data1, uint8_t data0 );
void ApplySignal ( float frequencyInHz, float phaseInDeg );
void SetFrequency ( float frequencyInHz );
void IncrementFrequency ( float frequencyInHz );
void SetPhase ( float phaseInDeg );
void IncrementPhase ( float phaseInDeg );
void Reset ( void );
void PowerDown ( bool enable );
float GetFreqResolution ( void ) { return RESOLUTION_HZ; }
float GetPhaseResolution ( void ) { return RESOLUTION_DEG; }