基于STM32的_AD9850_驱动程序

合集下载

ad9850 例程

ad9850 例程
//Fout=调制频率控制字*SYSCLK/2的32次方(SYSCLK=50M) 50M=2faf080 2的32次方=100 000 000 1K=3e8对应的调制频率控制字=14f8b
//
#include<reg52.h>
#define uchar unsigned char //这里用"uchar"代替"unsigned char","uchar"用来定义无符号字符型数。
#define uint unsigned int//"uint"用来定义无符号整型数。
sbit w_clk1= P1^0;//AD9850_1的将8bit的频率控制字加载进入数据锁存器上升沿有效
sbit fq_ud1=P1^1; //AD9850_1将40bit的控制字加载进入相位累加器上升沿有效
0x0e,0x6a,0xf9,0x0f,0xba,0x84,0x11,0x0a,0x0f,0x12,0x59,0x9a,0x13,0xa9,0x25,
0x14,0xf8,0xb0,0x16,0x48,0x3b,0x17,0x97,0xc6,0x18,0xe7,0x51,0x1a,0x36,0xdc};
DDSLE_1=1;
// NOP();
// NOP();
P1=0;
// w_clk2=1;
DDSLE_1=0;
}
void AD98502_scpl(uint AD9850_sc) //将32bit的频率数据加载到AD9850_2
{
uint s=0; //临时变量
w_clk2= 0;//将16bit的0的频率数据加载进入AD9850_2的数据锁存器上升沿有效

ad9850 例程

ad9850 例程
DDSLE_1=1;
P1=s;
w_clk2= 1;
DDSLE_1=0;
}
fq_ud2=0;
fq_ud2=1;
AD9850_sc=0;
}
void Main(void)
{
uint pl=0;
uint x=0;
P0=0;
P1=0;
AD9850_Rset(); //复位AD9850
AD98501_kzz(); //制AD9850控制字
sbit DDSLE_1 =P1^7; //AD9850的数据锁存器控制端上升沿有效
uchar code AD9850[61]={0,0x01,0x4f,0x8d,0x02,0x9f,0x16,0x03,0xee,0xa1,0x05,0x3e,0x2c,0x06,0x8d,0xb7,
0x07,0xdd,0x42,0x09,0x2c,0xcd,0x0a,0x7c,0x58,0x0b,0xcb,0xe3,0x0d,0x1b,0x6e,
Rset1= 0;
Rset2= 0;//AD9850_2的复位上升沿有效
Rset2= 1;
Rset2= 0;
}
void AD98501_kzz(void) //将8bit的频率控制字加载到AD9850_1
{
w_clk1= 0;//将8bit的频率控制字加载进入AD9850_1的数据锁存器上升沿有效
DDSLE_1=1;
#define uint unsigned int//"uint"用来定义无符号整型数。
sbit w_clk1= P1^0;//AD9850_1的将8bit的频率控制字加载进入数据锁存器上升沿有效
sbit fq_ud1=P1^1; //AD9850_1将40bit的控制字加载进入相位累加器上升沿有效

AD9850模块使用说明

AD9850模块使用说明

1、在您收到鑫悦电子AD9850模块后,请先大致熟悉AD9850模块:
SINA、SINB是正弦波形输出
QN、QP是方波输出
发光二极管是VCC电源指示灯(如果通电后,LED1不亮,请立即断电检查) 该模块可以用作并行和串行两种模式。

如何使用并行模式,请参考文件夹“并行”
2、按照下图连接好硬件。

然后把串行鑫悦电子ad9850模块测试程序
“ad9850.hex”烧到单片机AT89S52。

如果一切都顺利,那么您用示波器马上就能测出波形了。

3、
如果没有波形输出,请按照以下办法解决。

是不是掌柜把AD9851的资料发给你了?那样肯定没有波形。

测试程序是按照A T89S52来写的,您是不是用别的单片机了。

程序运行了吗?如果单片机没有跑起来,那肯定没波形。

基于STM32的AD9851并行源代码

基于STM32的AD9851并行源代码

基于STM32的AD9851并行源代码#include"stm32f10x.h"#define ad9851_rest_l GPIO_ResetBits(GPIOC,GPIO_Pin_0)#define ad9851_rest_h GPIO_SetBits(GPIOC,GPIO_Pin_0)#define ad9851_fq_up_l GPIO_ResetBits(GPIOC,GPIO_Pin_1) #define ad9851_fq_up_h GPIO_SetBits(GPIOC,GPIO_Pin_1)#define ad9851_w_clk_l GPIO_ResetBits(GPIOC,GPIO_Pin_2)#define ad9851_w_clk_h GPIO_SetBits(GPIOC,GPIO_Pin_2)/*void RCC_HSE_Configuration(void){RCC_DeInit();//将外设RCC寄存器重设为缺省值RCC_HSEConfig(RCC_HSE_ON);//设置外部高速晶振(HSE),HSE晶振打开(ON)if(RCC_WaitForHSEStartUp()==SUCCESS)//等待HSE起振,SUCCESS:HSE 晶振稳定且就绪{RCC_HCLKConfig(RCC_SYSCLK_Div1);//设置AHB时钟(HCLK)RCC_SYSCLK_Div1--AHB时钟=系统时钟RCC_PCLK2Config(RCC_HCLK_Div1);//设置高速AHB时钟(PCLK2)RCC_HCLK_Div1--APB2时钟=HCLKRCC_PCLK1Config(RCC_HCLK_Div2);//设置低速AHB时钟(PCLK1)RCC_HCLK_Div2--APB1时钟=HCLK/2FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);//选择FLASH预取指缓存的模,预取指缓存使能FLASH_SetLatency(FLASH_Latency_2);//设置FLASH存储器延时时钟周期数FLASH_LATENCY_2 2延时周期RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_2);//设置PLL时钟源及倍频系数RCC_PLLCmd(ENABLE);//PLL使能while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);//检查指定的RCC标志位(PLL准备好标志)设置与否RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//设置系统时钟SYSCLKwhile(RCC_GetSYSCLKSource()!= 0x08);//0x08:PLL作为系统时钟}}*/void AD9851_GPIOC_Configuration(void){GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE );GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_ Pin_2;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOC,&GPIO_InitStructure);}void AD9851_GPIOD_Configuration(void){GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE );GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_ Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOD,&GPIO_InitStructure);}void ad9851_reset_parrel(){ad9851_w_clk_l;ad9851_fq_up_l;//rest信号ad9851_rest_l;ad9851_rest_h;ad9851_rest_l;}void ad9851_wr_parrel(u8 w0,u32 frequence) {u8 w;frequence=frequence*4294967296/180000000; //写w0数据w=w0;GPIO_Write(GPIOD,w); //w0ad9851_w_clk_h;ad9851_w_clk_l;//写w1数据w=(frequence>>24);GPIO_Write(GPIOD,w); //w1ad9851_w_clk_h;ad9851_w_clk_l;//写w2数据w=(frequence>>16);GPIO_Write(GPIOD,w); //w2ad9851_w_clk_h;ad9851_w_clk_l;//写w3数据w=(frequence>>8);GPIO_Write(GPIOD,w); //w3ad9851_w_clk_h;ad9851_w_clk_l;//写w4数据w=(frequence>>=0);GPIO_Write(GPIOD,w); //w4ad9851_w_clk_h;ad9851_w_clk_l;//移入始能ad9851_fq_up_h;ad9851_fq_up_l;}int main(){// RCC_HSE_Configuration();AD9851_GPIOC_Configuration(); AD9851_GPIOD_Configuration(); GPIO_Write(GPIOC,0x0000); GPIO_Write(GPIOD,0x0000);//串行写1000Hz程序ad9851_reset_parrel();ad9851_wr_parrel(0x01,10000000); while(1);}。

基于STM32的_AD9850_驱动程序

基于STM32的_AD9850_驱动程序
AD9850_FQUD_SET ; //移入使能 AD9850_Delay(0xFFFF) ; AD9850_FQUD_CLR ; } #endif /* MODE_PARALLEL */ /*------------------------并行模式-------------------------*/ /*---------------------------------------------------------*/
#include "stm32f10x_lib.h" #include "AD9850.h"
/******************************************** 函数名称:AD9850_Delay 功 能:AD9850 延时函数 参 数:z - 延时长度 返回值 :无 *********************************************/ void AD9850_Delay(unsigned int z) {
for(;z>0;z--) {;} }
/*--------------------并行模式-----------------------*/ #ifdef MODE_PARALLEL /******************************************** 函数名称:AD9850_Reset_Parallel 功 能:在并行模式下复位 AD9850 参 数:无
#define AD9850_WCLK_SET SET) #define AD9850_WCLK_CLR _RESET) #define AD9850_FQUD_SET SET) #define AD9850_FQUD_CLR RESET)

基于单片机及AD9850的正弦信号发生器设计说明书

基于单片机及AD9850的正弦信号发生器设计说明书

陕西理工学院毕业设计[摘要]本设计使用51单片机对DDS芯片进行控制,利用DDS造波的方法产生需要的正弦信号.用户可以根据需要对芯片设定一个频率值或相位值,通过单片机传输芯片控制字对芯片输出的频率和相位进行调节,达到用户所要求的信号。

本设计采用模块化设计的方法,不同的模块为实现不同的功能而设计,总体由单片机控制协调工作。

利用51单片机控制DDS芯片造波,具有如下优越性:1.造价低廉。

51系列单片机应用广泛,价格低廉,比较容易购买,DDS芯片价格较单片机稍高,但与价格成百上千的成品信号发生器相比,本设计经济优势显著。

2.电路简单。

本设计利用单片机进行数字化控制,外围元件较少,仅需辅以少量的阻容元件用于电流电压匹配控制以及滤波电路既可。

3.频率控制准确高效。

数字化控制的最大优点即控制准确。

本设计选用的DDS芯片内置32位高速数模转换器,分辨率高,响应快。

[关键词]51单片机;DDS造波;频率;The Design of Sinusoidal Signal Generator Based on SinglechipFan Pengxing[Abstract]: The design use 51series’ singlechip to control DDS chip’s ing DDS method to produce sine signal.The user can set a frequency or phase value freely.To achieve the user request signal,the singlechip need sending a control word to DDS chip,which determines the frequency and phase values.This design uses the modular design method, different modules designed for different functions.Singlechip responsible for coordination of all work.The benefits of DDS method to produce sine signal as follows:1.low cost. The 51 series’singlechip’s application are range,so they have low price and are easy to purchase.The price of DDS chip is slightly higher than singlechip.but to compare with the commodity signal generator which values hundreds even thousands,the advantages of this design is obvious.2.Simple circuit..Benefits which digital control takes is Peripheral element is less.It’s only need a few capacitance and resistance element for crrent and voltage matching and filter.3.Frequency control is accurate and efficient.Frequency control is accurate and efficient.This design using DDS chip with 32 bit high speed D/A converter,which has a high resolution, fast response.[Key words]: 51 singlechip;DDS method to produce signal;Frequency;第 1 页共 64 页目录The Design of Sinusoidal Signal Generator Based on Singlechip (1)引言 (4)1 绪论 (5)1.1单片机在函数信号发生器中的应用 (5)1.2发展现状 (5)1.3项目可行性研究 (5)1.4设计任务和要求 (6)2.方案及工作原理 (6)2.1方案设计 (6)2.1.1方案一 (6)2.1.2 方案二 (6)2.1.3 方案三 (6)2.1.4 方案四 (6)2.2DDS工作原理 (7)2.3DDS移相原理 (7)3.电路设计 (8)3.1设计思路 (8)3.2元件选型 (8)3.3系统总体框图 (8)3.4STC89C52RC单片机 (9)3.5AD9850芯片 (10)3.5.1 AD9850芯片简介 (10)3.5.2 AD9850工作方式介绍 (11)3.5.3相位控制字的计算 (11)3.61602LCD显示屏 (12)3.6.1液晶概述 (12)3.6.2接口信号说明 (12)3.6.3 1602地址说明 (13)3.6.4 1602指令码说明 (13)3.6.5 1602LCD写操作时序图 (13)3.7低通滤波器的设计 (14)3.7.1低通滤波器 (14)3.7.2低通滤波器的选型 (14)3.7.3低通滤波器的设计 (14)3.8总电路原理图 (16)3.9硬件调试 (16)3.10参数测量及误差分析 (20)3.10.1参数测量 (20)3.10.2误差分析 (20)4.软件设计 (21)4.1主程序流程图 (21)4.2源程序 (22)总结 (23)致谢 (24)参考文献 (25)附录 (26)附录A:文献原文 (26)附录B:外文文献翻译; (34)附录C:电路原理图 (41)附录D:元器件清单表。

基于AD9850多波形发生器的设计

基于AD9850多波形发生器的设计
1.2课题的研究意义
为了给后端电路提供一个理想信号,一般用信号发生器所产生的的信号来替代前端电路的实际信号。为了可以方便的在各种不同条件下所需的不同特性信号,就需要一个特征参数可以被认为设定的信号源。这样的信号源对于产品的研发和日常学校的电路实验很有成效。我们可以通过测量出的信号进行比对,以此来确定电路的特性和功能是否达到了所需的标准和要求
DDS技术的波形发生器的特点有以下几个:输出频率稳定、准确、波形输出质量好、输出频率范围可观。以上几个特点都是波形发生器值得我们去研究的一个重要方向。DDS作为一种较为先进的频率合成技术,它相较其他波形发生器比较容易通过程序来控制,且其相位连续,输出频率稳定度高、分频率高。
1.3 DDS技术的发展历程和研究现状
自20世纪80年代以来各国都在研究DDS产品,并广泛的应用于各个领域。DDS技术具有集成度高、芯片体积小、稳定度好、分辨率高等优点,同时有着两个缺点:一个是带宽较小,二个是杂散大。杂散大的原因是因为D/A转换过程中的量化误差和非线性误差造成的以该技术为核心的生产的波形发生器不仅可以产生传统波形发生器的能产生的正弦波、方波、三角波、锯齿波等,还可以产生可变频的载频信号、部分调制信号。同时还可产生任意编辑的波形。
在日常的生产实践和科技领域中信号发生器具有着较为广泛应用。在通信中,需要高频发射,其中的射频波指的就是载波,将音频、视频信号或脉冲信号运载发送出去,需要能产生高频的振荡器。在不同的领域中例如工业的高频感应加热、熔炼、淬火,生物医学中的核磁共振成像等都需要功率不同的,频率不同的振荡器。对于计量和校准领域来说高精度的信号发生器也可以作为标准的信号源,把参考源做为标准将需要校准的仪器调校。这证明了,信号发生器的应用领域十分的广泛。
系统结构的简图如下所示,可从中看出波形发生器的大体运作流程。

基于AD9850的信号发生器的设计_毕业设计论文 精品

基于AD9850的信号发生器的设计_毕业设计论文 精品

摘要本设计使用51单片机对DDS芯片进行控制,利用DDS造波的方法产生需要的正弦信号,用户可以根据需要对芯片设定一个频率值或相位值,通过单片机传输芯片控制字对芯片输出的频率和相位进行调节,达到用户所需要的信号,本设计采用模块化设计的方法,不同的模块为实现不同的功能而设计,总体由单片机控制协调工作。

利用51单片机控制DDS芯片造波,具有如下优越性:1,造价低廉,51单片机应用广泛,价格低廉,比较容易购买,DDS芯片价格较单片机稍高,但与价格成百上千的成品信号发生器相比,本设计经济优势显著,2,电路简单,本设计利用单片机进行数字化控制,外围元件较少。

3,频率控制准确高效,数字化控制的最大优点即控制准确,分辨率高,响应快。

关键词:DDS 51单片机数字控制目录摘要 (i)目录 (ii)绪论 ............................................................................................................................................. - 1 - 第一章工作原理........................................................................................................................ - 2 -1.1 DDS工作原理............................................................................................................... - 2 - 第二章电路设计........................................................................................................................ - 3 -2.1设计思路........................................................................................................................ - 3 -2.2 元件选型....................................................................................................................... - 3 -2.3 系统总体框图............................................................................................................... - 3 - 第三章元器件介绍.................................................................................................................... - 5 -3.1 STC89C52RC单片机 ................................................................................................... - 5 -3.2 AD9850芯片.............................................................................................................. - 6 -3.3 液晶(LCD1602)介绍............................................................................................... - 7 - 第四章调试................................................................................................................................ - 8 -4.1 硬件调试....................................................................................................................... - 8 -4.2 软件调试..................................................................................................................... - 13 -绪论信号发生器使一种能产生所需要信号的一种仪器。

基于STM32+AD9850的实用信号源的设计(一)

基于STM32+AD9850的实用信号源的设计(一)

基于STM32+AD9850的实用信号源的设计(一)1.引言在通讯.电子测量.电视广播.雷达.遥控遥测.导航等领域都需要在一定频率范围内产生符合质量要求的频率信号.随着电子技术的发展,人们对信号源的频率精确度和频率稳定度以及其他方面的要求越来越高.目前,产生一定频率的信号一般是采用频率合成技术,随着技术的发展,频率合成器应运而生,这是实现频率合成技术的电路系统.而直接数字频率合成技术(Direct Digital FrequencySynthesis.简称DDS)频率转换速度快,频率分辨率精度高,被广泛使用.有王学凤等人使用DDS 芯片的信号源设计;有袁辉使用AD9854 和FPGA 基于DDS 理论设计并实现了多模式多波形雷达信号源;有刘健余等设计的基于DDS 和PLL 的Chirp 超宽带信号源[5]等.DDS 技术在各个领域的应用越来越多,越来越广.本系统设计制作一个能够产生正弦波和方波的信号源.其中要求信号频率在20Hz 到20KHz 的范围内实现程控步进,步长1Hz,幅度则要求在100mV 到3V间实现步长为100mV 的程控步进,而方波的占空比要在2%到98%间可实现步长为2%的程控调整,且要求波形性能良好.综合以上因素,可知本系统的核心是在于波形的产生(包括频率和占空比的程控)以及幅度的程控.2.DDS 芯片AD9850 简介要产生一定频率的信号源,有多种实现方法,如采用像8038 这样的函数信号发生器,或者是利用锁相环的跟踪和滤波作用将频率锁定在所需要的谐波分量或者组合频率分量中.但是这两种方法不是步长难以满足要求就是输出频率范围达不到要求,不适合产生低频信号.因此,本设计采用直接数字频率合成芯片.DDS(直接数字频率合成)是基于相位概念提出的一种直接合成所需波形的频率合成技术,特别适合于生成频率低.频带宽.频率稳定性和准确度较高及波形复杂的场合,可以很方便地生成符合要求的正弦波和方波.本系统使用美国AD 公司推出的高集成度频率合成器AD9850.其组成原理如图1 所示.AD9850 采用CMOS 工艺,供电在3.3V 左右.供电时功耗仅为155mW,采用28 脚SSOP 表面封装形式,具有125M 时钟频率.AD9850 在接上精密时钟源及写入频率相位控制字之后就可产生一个频率和相位都可编程控制的模拟正弦波输出,此正弦波可直接用作频率信号源或者经内部的高速比较器转换为方波输出.3.主要电路设计系统原理总图如图2 所示.3.1 正弦波及方波产生电路正弦波及方波产生的电路图如图3 所示.3.1.1 正弦波产生AD9850 的ROM 中已预先存入正弦函数表,其包含一个正弦波周期的数字幅度信息,每一个地址对应正弦波中0&deg;-360&deg;范围的一个相位点.查询表把输入地址的相位信息映射成正弦波幅值信号,驱动DAC 输出模拟量.工作时,用单片机送入频率码.AD9850 输入采用并行方式,8 位一个字节,分5 次输入,其中32 位是频率码,另8 位中的5 位是相位控制码,2 位是用于选择工作方式,1 位用于电源休眠.改变读取R O M 的数目,即可改变输出频率.AD9850 的频率输出频率的一般表达式为:式中,k 为频率码,是32 位的二进制数.tips:感谢大家的阅读,本文由我司收集整编。

AD9850模块使用手册

AD9850模块使用手册

一、原理图
二、模块说明
1、
注意实物与原理图的对应关系,电路板上也做了功能标识。

2、
使用非常简单,仅仅使用主接口,即能完成全部工作。

3、
主接口红色部分(即P1-1,P1-2)为外接电源。

1引脚为+5V, 2引脚为地,接反会烧毁芯片。

注意外接电源需要纯净,否则,影响正弦信号高频特性。

4、
主接口粉色部分(即P1-3,P1-4,P1-5)为单片机控制I/O。

5、 主接口青色部分(即P1-6,P1-7,P1-8)为模块输出引脚。

6脚为方波输出,7脚为正弦波滤波后输出,8脚为正弦波未滤波输出。

6、 辅助接口天蓝色部分对应原理图P4和主接口P1-7功能相同,可以用于示波器观测。

单片机控制AD9850的信号发生器C51程序可直接用

单片机控制AD9850的信号发生器C51程序可直接用

单片机控制AD9850的数字信号发生器C51程序单片机控制AD9850的数字信号发生器C51程序//-----------------------函数声明,变量定义------------------------------#include <reg51.h>#include <intrins.h>#include<ABSACC.H>//-----------------------定义管脚----------------------------------------#define data_OUT P1sbit FQ_UD=P3^0; //AD9850信号更新申请sbit W_CLK=P3^1; //写控制字时钟unsigned char CON_word[5];//Word data[7] data[6] data[5] data[4] data[3] data [2] data[1] data[0]//W0 Phase b Phase b3 Phase b2 Phase b1 Phase b0 Power Down Control Control//W1 Freq-b31 Freq-b30 Freq-b29 Freq-b28 Freq-b27 F req-b26 Freq-b25 Freq-b24//W2 Freq-b23 Freq-b22 Freq-b21 Freq-b20 Freq-b19 F req-b18 Freq-b17 Freq-b16//W3 Freq-b15 Freq-b14 Freq-b13 Freq-b12 Freq-b11 F req-b10 Freq-b9 Freq-b8//W4 Freq-b7 Freq-b6 Freq-b5 Freq-b4 F req-b3 Freq-b2//--------------------------------------------------------------------------------------------------// 函数名称: delay// 入口参数: N// 函数功能:延时子程序,实现(16*N+24)us的延时// 系统采用11.0592MHz的时钟时,延时满足要求,其它情况需要改动//--------------------------------------------------------------------------------------------------void delay(unsigned int N){int i;for(i=0;i<N;i++);}//--------------------------------------------------------------------------------------------------// 函数名称: WRITE_AD9850// 函数功能:将控制字写入AD9850//--------------------------------------------------------------------------------------------------void WRITE_AD9850(void){unsigned char i;FQ_UD=0;W_CLK=0;delay(0);CON_word[0]=CON_word[0]&0xFC; //置工作方式选择位为00for(i=0;i<5;i++){data_OUT=CON_word[i]; //送控制字W_CLK=0;delay(0);W_CLK=1; //上升延delay(0);}FQ_UD=1; //上升延要求AD9850改变输出}//--------------------------------------------------------------------------------------------------// 函数名称:main// 用户主函数// 函数功能:主函数//--------------------------------------------------------------------------------------------------void main(){FQ_UD=0;WRITE_AD9850();} <下面是总结的一些设计中应注意的问题,和单片机硬件设计原则,希望大家能看完(1)在元器件的布局方面,应该把相互有关的元件尽量放得靠近一些,例如,时钟发生器、晶振、CPU的时钟输入端都易产生噪声,在放置的时候应把它们靠近些。

基于AD9850的多功能信号源设计

基于AD9850的多功能信号源设计

基于AD9850的多功能信号源设计摘要:AD9850以芯片为多功能信号源频率合成核心,以单片机(89C52)为控制和数据处理核心,实现了正弦波、方波及AM、FM、ASK、FSK、PSK 等调制波形的产生和输出。

结合键盘和显示部分,实现了任意频率值的选择和显示,构成了一个完整实用的信号发生器。

该信号发生器可在10 Hz~40 MHz范围内实现任意频率的输出,步进值和输出幅值可调。

经过对系统的最终测试与实验数据分析表明,该系统具有稳定性好、精度高、且范围宽等优点。

直接数字合成技术(Direct Digital Synthesizer,DDS)是由一个参考频率源产生多种频率的技术,其采用数字信号控制的相位增量,具有频率转换时间短、频率分辨率高、输出相位连续、可编程、全数字化易于集成等优点。

因此,得到了广泛的应用。

本文提出了以直接频率合成芯片AD9850为核心的多功能信号源的设计方案,给出了实现多种信号生成的具体方法。

1 直接数字频率合成原理及构成AD9850是美国AD公司推出的高集成度频率合成器,内含可编程DDS系统和高速比较器,能实现全数字编程控制的频率合成。

可编程DDS系统的核心是相位累加器,其由一个加法器和一个N 位相位寄存器组成。

每来一个时钟脉冲,加法器将频率控制数据与累加寄存器输出的累加相位数据相加,将相加后的结果送至累加寄存器的数据输入端,累加寄存器将加法器在上一个时钟作用后所产生的新相位数据反馈到加法器的输入端,以使加法器在下一个时钟的作用下继续与频率控制数据相加。

这样,相位累加器在参考时钟的作用下进行线性相位累加,当相位累加器累加满量时就会产生一次溢出,完成一个周期性的动作,这个周期就是DDS合成信号的一个频率周期,累加器的溢出频率就是输出的信号频率。

相位寄存器的输出与相位控制字相加后,可输入到正弦查询表地址上。

正弦查询表包含一个正弦波周期的数字幅度信息,每个地址对应正弦波中0°~360°范围的一个相位点。

AD9854STM32驱动精编版

AD9854STM32驱动精编版

#include <stm32f10x_lib.h>#include "sys.h"#include "delay.h"#define AD9854_DATA GPIOC->ODR#define AD9854_ADDR GPIOC->ODR#define ad9854_reset PBout(12)#define ad9854_rd PBout(13)#define ad9854_wr PBout(14)#define ad9854_updata PBout(15)unsigned char ControlRegister[]={0x14,0x4f,0x00,0x60}; //AD9852 控制寄存器初始值, Mode 0unsigned char FTW[]={0x00,0x00,0x37,0xec};//Frequency Tuning Word 1 倍频 300MHz 后输出频率对应的 FTW值unsigned char PAR[]={0x00,0x00}; //Phase Adjust Register 1unsigned char OSK[]={0x0a,0xff}; //Output shaped keying multiplier, 650mvvoid single_wave(unsigned long int fre);void Init_AD9854(void);void AD9854_Set_Mode0(void);void AD9852_Send(unsigned char addr,unsigned char data);void change_frequency(unsigned long int fre_temp); void Init_Port(void);int main( void ){Stm32_Clock_Init(9); // 9 倍频delay_init(72); // 72M 晶振时延时delay_ms(200);Init_Port();Init_AD9854();single_wave(1000000);while(1);}void Init_Port(void){RCC->APB2ENR |= 1<<3 ;GPIOB->CRH &= 0x0000ffff ;GPIOB->CRH |= 0x33330000 ;GPIOB->ODR |= 0xf000 ;RCC->APB2ENR |= 1<<4 ;GPIOC->CRL &= 0x00000000 ;GPIOC->CRL |= 0x33333333 ;GPIOC->CRH &= 0x00000000 ;GPIOC->CRH |= 0x33333333 ;GPIOC->ODR |= 0xffff ;}void AD9852_Send(unsigned char addr,unsigned char data)// 按照并行输入时序{ad9854_wr = 1;// AD9854_WR_SET;AD9854_ADDR &= 0x00ff|addr<<8;AD9854_ADDR |= 0xff00&addr<<8;ad9854_wr = 1;// AD9854_WR_SET;AD9854_DATA &= 0xff00|data;AD9854_DATA |= 0x00ff&data;ad9854_wr = 0;// AD9854_WR_CLR;ad9854_wr = 1;// AD9854_WR_SET;ad9854_updata = 1;//AD9854_UPDATA_SET;ad9854_updata = 0;//AD9854_UPDATA_CLR;}void Init_AD9854(void){unsigned char addr;unsigned char i;ad9854_reset = 0 ;// AD9854_RESET_CLR;ad9854_wr = 1 ;// AD9854_WR_SET;ad9854_rd = 0 ;// AD9854_RD_CLR;ad9854_updata = 0 ;// AD9854_UPDATA_CLR;addr = 0x1d;for(i=4;i>0;i--){AD9852_Send(addr,ControlRegister[4-i]);addr++;}}void AD9854_Set_Mode0(void) //Mode 0设置{unsigned char addr;unsigned char counter;for(addr=0x00,counter=2;counter>0;counter--) // 设置 Phase Adjust Register 1{AD9852_Send(addr,PAR[2-counter]);addr++;}for(addr=0x04,counter=4;counter>0;counter--) // 设置 Frequency Tuning Word 1{AD9852_Send(addr,FTW[4-counter]);addr++;}for(addr=0x21,counter=2;counter>0;counter--) // 设置 Output shaped keying multiplier{AD9852_Send(addr,OSK[2-counter]);addr++;}}void single_wave(unsigned long int fre){unsigned char addr,i;unsigned long int ff;unsigned char *p;ff=(unsigned long int)(4294967296*fre/300000000);p=(unsigned char*)&ff;for(addr=0x04,i=0;i<4;i++)// 设置 Frequency Tuning Word 1{AD9852_Send(addr,*(p+3-i));addr++;}for(addr=0x00,i=0;i<2;i++)// 设置 Phase Adjust Register 1{AD9852_Send(addr,PAR[i]);addr++;}for(addr=0x21,i=2;i>0;i--)// 设置 Output shaped keying multiplier{AD9852_Send(addr,OSK[2-i]);addr++;}}void change_frequency(unsigned long int fre_temp) {unsigned char addr,counter;unsigned char *p;p=(unsigned char*)&fre_temp;for(addr=0x04,counter=0;counter<4;counter++) // 设置 Frequency Tuning Word 1{AD9852_Send(addr,*(p+3-counter));addr++;}}。

AD9854STM32驱动

AD9854STM32驱动

#include <stm32f10x_lib.h>#include "sys.h"#include "delay.h"#define AD9854_DATA GPIOC->ODR#define AD9854_ADDR GPIOC->ODR#define ad9854_reset PBout(12)#define ad9854_rd PBout(13)#define ad9854_wr PBout(14)#define ad9854_updata PBout(15)unsigned char ControlRegister[]={0x14,0x4f,0x00,0x60}; //AD9852控制寄存器初始值,Mode 0unsigned char FTW[]={0x00,0x00,0x37,0xec}; //Frequency Tuning Word 1 倍频300MHz后输出频率对应的FTW值unsigned char PAR[]={0x00,0x00}; //Phase Adjust Register 1unsigned char OSK[]={0x0a,0xff}; //Output shaped keying multiplier, 650mvvoid single_wave(unsigned long int fre);void Init_AD9854(void);void AD9854_Set_Mode0(void);void AD9852_Send(unsigned char addr,unsigned char data);void change_frequency(unsigned long int fre_temp); void Init_Port(void);int main( void ){Stm32_Clock_Init(9); // 9倍频delay_init(72); // 72M晶振时延时delay_ms(200);Init_Port();Init_AD9854();single_wave(1000000);while(1);}void Init_Port(void){RCC->APB2ENR |= 1<<3 ;GPIOB->CRH &= 0x0000ffff ;GPIOB->CRH |= 0x33330000 ;GPIOB->ODR |= 0xf000 ;RCC->APB2ENR |= 1<<4 ;GPIOC->CRL &= 0x00000000 ;GPIOC->CRL |= 0x33333333 ;GPIOC->CRH &= 0x00000000 ;GPIOC->CRH |= 0x33333333 ;GPIOC->ODR |= 0xffff ;}void AD9852_Send(unsigned char addr,unsigned char data) //按照并行输入时序{ad9854_wr = 1; // AD9854_WR_SET;AD9854_ADDR &= 0x00ff|addr<<8;AD9854_ADDR |= 0xff00&addr<<8;ad9854_wr = 1; // AD9854_WR_SET;AD9854_DATA &= 0xff00|data;AD9854_DATA |= 0x00ff&data;ad9854_wr = 0; // AD9854_WR_CLR;ad9854_wr = 1; // AD9854_WR_SET;ad9854_updata = 1; //AD9854_UPDATA_SET;ad9854_updata = 0; //AD9854_UPDATA_CLR;}void Init_AD9854(void){unsigned char addr;unsigned char i;ad9854_reset = 0 ; // AD9854_RESET_CLR;ad9854_wr = 1 ; // AD9854_WR_SET;ad9854_rd = 0 ; // AD9854_RD_CLR;ad9854_updata = 0 ; // AD9854_UPDATA_CLR;addr = 0x1d;for(i=4;i>0;i--){AD9852_Send(addr,ControlRegister[4-i]);addr++;}}void AD9854_Set_Mode0(void) //Mode 0 设置{unsigned char addr;unsigned char counter;for(addr=0x00,counter=2;counter>0;counter--) //设置Phase Adjust Register 1{AD9852_Send(addr,PAR[2-counter]);addr++;}for(addr=0x04,counter=4;counter>0;counter--) //设置Frequency Tuning Word 1{AD9852_Send(addr,FTW[4-counter]);addr++;}for(addr=0x21,counter=2;counter>0;counter--) //设置Output shaped keying multiplier{AD9852_Send(addr,OSK[2-counter]);addr++;}}void single_wave(unsigned long int fre){unsigned char addr,i;unsigned long int ff;unsigned char *p;ff=(unsigned long int)(4294967296*fre/300000000);p=(unsigned char*)&ff;for(addr=0x04,i=0;i<4;i++) //设置Frequency Tuning Word 1{AD9852_Send(addr,*(p+3-i));addr++;}for(addr=0x00,i=0;i<2;i++) //设置Phase Adjust Register 1{AD9852_Send(addr,PAR[i]);addr++;}for(addr=0x21,i=2;i>0;i--) //设置Output shaped keying multiplier{AD9852_Send(addr,OSK[2-i]);addr++;}}void change_frequency(unsigned long int fre_temp) {unsigned char addr,counter;unsigned char *p;p=(unsigned char*)&fre_temp;for(addr=0x04,counter=0;counter<4;counter++) //设置Frequency Tuning Word 1{AD9852_Send(addr,*(p+3-counter));addr++;}}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#define AD9850_RST_SET T) #define AD9850_RST_CLR SET)
GPIO_WriteBit(AD9850_CONTROL_PORT,AD9850_RST,Bit_SE GPIO_WriteBit(AD9850_CONTROL_PORT,AD9850_RST,Bit_RE
/*------------------------串行模式-------------------------*/ #ifdef MODE_SEIAL /******************************************** 函数名称:AD9850_Reset_Sreial 功 能:在串行模式下复位 AD9850 参 数:无 返回值 :无 *********************************************/ void AD9850_Reset_Sreial(void) {
/* AD9850 控制和数据引脚定义 */ #define AD9850_CONTROL_PORT GPIOA #define AD9850_FQUD GPIO_Pin_2 #define AD9850_WCLK GPIO_Pin_3 #define AD9850_RST GPIO_Pin_4
#ifdef MODE_PARALLEL //并行模式数据口 0~7 #define AD9850_DATA_PORT GPIOC #endif
#ifndef __AD9850_H #define __AD9850_H
/*选择数据通信方式,只能选择一个*/ //#define MODE_SEIAL //串行模式 #define MODE_PARALLEL //并行模式
#define AD9850_SYSTEM_COLCK 100000000
#define AD9850_WCLK_SET SET) #define AD9850_WCLK_CLR _RESET) #define AD9850_FQUD_SET SET) #define AD9850_FQUD_CLR RESET)
GPIO_WriteBit(AD9850_CONTROL_PORT,AD9850_WCLK,Bit_ GPIO_WriteBit(AD9850_CONTROL_PORT,AD9850_WCLK,Bit GPIO_WriteBit(AD9850_CONTROL_PORT,AD9850_FQUD,Bit_ GPIO_WriteBit(AD9850_CONTROL_PORT,AD9850_FQUD,Bit_
/******************************************** 函数名称:AD9850_Write_Serial 功 能:在串行模式下写 AD9850 寄存器
参 数:W0 - W0 寄存器的值 freq - 频率值
返回值 :无 *********************************************/ void AD9850_Write_Serial(unsigned char W0,unsigned long freq) {
/* 串行模式操作函数 */ #ifdef MODE_SEIAL extern void AD9850_Reset_Sreial(void) ; extern void AD9850_Write_Serial(unsigned char W0,unsigned long freq) ; #endif
#ifdef MODE_SEIAL //串行模式数据口 #define AD9850_DATA GPIO_Pin_5 #define AD9850_DATA_Write_1 GPIO_WriteBit(AD9850_CONTROL_PORT,AD9850_DATA, Bit_SET) #define AD9850_DATA_Write_0 GPIO_WriteBit(AD9850_CONTROL_PORT,AD9850_DATA, Bit_RESET) #endif
extern void Init_AD9850(void) ;
#endif /* AD8950_H */

//==================================================================/ /
//=========================AD9850.c=================================//
else AD9850_DATA_Write_0 ;
AD9850_WCLK_SET ; wdata >>= 1 ; AD9850_WCLK_CLR ; } wdata = W0 ; //写 w0 for(i=0 ;i<8 ;i++) { if(wdata & 0x01)
AD9850_DATA_Write_1 ; else
//========================AD9850.h=============================//
/*--------------------------------------------
AD9850 驱动程序
----------------------------------------------*/
else AD9850_DATA_Write_0 ;
AD9850_WCLK_SET ; wdata >>= 1 ; AD9850_WCLK_CLR ; } wdata = y>>8 ; //写 w3 for(i=0 ;i<8 ;i++) { if(wdata & 0x01)
AD9850_DATA_Write_1 ; else
unsigned char i,wdata ; unsigned long y ; y = (unsigned long )268435456.0/AD9850_SYSTEM_COLCK*freq ;
wdata = y>>0 ; //写 w4 for(i=0 ;i<8 ;i++) {
if(wdata & 0x01) AD9850_DATA_Write_1 ;
for(;z>0;z--) {;} }
/*--------------------并行模式-----------------------*/ #ifdef MODE_PARALLEL /******************************************** 函数名称:AD9850_Reset_Parallel 功 能:在并行模式下复位 AD9850 参 数:无
AD9850_DATA_Write_0 ; AD9850_WCLK_SET ; wdata >>= 1 ; AD9850_WCLK_CLR ; } wdata = y>>24 ; //写 w1
for(i=0 ;i<8 ;i++) {
if(wdata & 0x01) AD9850_DATA_Write_1 ;
#include "stm32f10x_lib.h" #include "AD9850.h"
/******************************************** 函数名称:AD9850_Delay 功 能:AD9850 延时函数 参 数:z - 延时长度 返回值 :无 *********************************************/ void AD9850_Delay(unsigned int z) {
返回值 :无 *********************************************/ void AD9850_Reset_Parallel(void) {
AD9850_WCLK_CLR ; AD9850_FQUD_CLR ; //RST 信号 AD9850_RST_CLR ; AD9850_RST_SET ; AD9850_Delay(0xFFFF) ; AD9850_RST_CLR ; }
unsigned char wdata ; unsigned long y=(unsigned long)(4294967295/AD9850_SYSTEM_COLCK) ; y *= freq ; wdata=W0 ; //写 w0 GPIO_Write(AD9850_DATA_PORT ,wdata) ; AD9850_WCLK_SET ; AD9850_WCLK_CLR ;
AD9850_DATA_Write_0 ; AD9850_WCLK_SET ; wdata >>= 1 ; AD9850_WCLK_CLR ; } wdata = y>>16 ; //写 w2 for(i=0 ;i<8 ;i++) { if(wdata & 0x01)
AD9850_DATA_Write_1 ; else
wdata=y>>24 ; //写 w1 GPIO_Write(AD9850_DATA_PORT ,wdata) ; AD9850_WCLK_SET ; AD9850_WCLK_CLR ;
wdata=y>>16 ; //写 w2 GPIO_Write(AD9850_DATA_PORT ,wdata) ; AD9850_WCLK_SET ; AD9850_WCLK_CLR ;
/******************************************** 函数名称:AD9850_Write_Parallel 功 能:在并行模式下写 AD9850 寄存器 参 数:W0 - W0 寄存器的值
相关文档
最新文档