基于AD9850的多功能信号发生器

基于AD9850的多功能信号发生器设计与实现

课程名称:    多功能信号发生器设计             

    业:       电子信息工程                   

    级:                                                   

    名:                            

    号:                                               

指导老师:                            

    绩:                                       

2022年春

 

摘要

波形发生器有很宽的频率范围,使用范围很广,它是一种不可缺少的通用信号源。可以用于生产测试、仪器维修和实验室,还广泛使用在其它科技领域,如医学、教育、化学、通讯、地球物理学、工业控制、军事和宇航等。本次设计的主要技术及性能指标:1实现正弦波,方波,三角波信号输出。2正弦波,方波,三角波频率可调,方波占空比可调。

本系统主要由硬件和软件两部分组成,以STC89C52单片机和可编程逻辑器件AD9850为核心,在运行时通过1602直观的显示当前输出的波形信号的频率,通过矩阵键盘输入所需的波形信号频率。本设计由 STC89C52将频率控制字传输AD9850,使其产生正弦波与方波,在经过滤波得到波形的输出。本来计划将方波经过积分电路LF412CN 运算放大器后输出三角波。这样使得电路更为的简便。

经过实际测试,正弦波的频率理论可达1HZ-125MHZ,方波频率1HZ-125MHZ。

关键词: 51 单片机;AD9850LCD1602LF412CN 运算放大器

 

 

1 绪论

1.1 研究背景意义

为了给后端电路提供一个理想信号,一般用信号发生器所产生的的信号来替代前端电路的实际信号。为了可以方便的在各种不同条件下所需的不同特性信号,就需要一个特征参数可以被认为设定的信号源。这样的信号源对于产品的研发和日常学校的电路实验很有成效。我们可以通过测量出的信号进行比对,以此来确定电路的特性和功能是否达到了所需的标准和要求在日常的生产实践和科技领域中信号发生器具有着较为广泛应用。在通信中,需要高频发射,其中的射频波指的就是载波,将音频、视频信号或脉冲信号运载发送出去,需要能产生高频的振荡器。在不同的领域中例如工业的高频感应加热、熔炼、淬火,生物医学中的核磁共振成像等都需要功率不同的,频率不同的振荡器的对于计量和校准领域来说高精度的信号发生器也可以作为标准的信号源,把参考源做为标准将需要校准的仪器调校。这证明了,信号发生器的应用领域十分的广泛。和校准领域来说高精度的信号发生器也可以作为标准的信号源,把参考源做为标准将需要校准的仪器调校。这证明了,信号发生器的应用领域十分的广泛。

 DDS 技术的波形发生器的特点有以下几个:输出频率稳定、准确、波形输出质量好、输出频率范围可观。以上几个特点都是波形发生器值得我们去研究的一个重要方向。 DDS 作为一种较为先进的频率合成技术,它相较其他波形发生器比较容易通过程序来控制,且其相位连续,输出频率稳定度高、分频率高。

1.2 国内外研究现状

信号发生器是一种最悠久的仪器,早在 20 年代电子设备刚出现时它就产生了。在  70 年代以前, 信号发生器主要有两类: 正弦波和脉冲波信号发生器。这个时期的信号发  生器大多采用模拟电子技术, 仅能产生几种简单波形。 70 年代后, 微处理器的出现使信  号发生器进入了另一个时代硬件和软件使波形发生器的功能扩大, 产生更加复杂的波形。 这时期的波形发生器多以软件为主,实质是采用微处理器对 DAC 的程序控制,就可以  得到各种简单的波形。 到了 21 世纪,随着集成电路技术的高速发展,出现了很多高频  率的 DDS 芯片,推动了函数信号发生器的发展。

信号波形发生器发展很快近几年来, 国际上波形发生器技术发展主要体现在以下几 个方面:

(1)波形发生器软件的开发正使波形数据的输入变得更加方便和容易。波形发生 器通常允许用一系列的点、直线和固定的信号段把波形数据存入存储器。同时可以利用 一种强有力的数学方程输入方式, 复杂的波形可以由几个比较简单的公式复合成数学表 达式产生。从而促进了信号波形发生器向任意波形发生器的发展, 各种计算机语言的飞 速发展也对任意波形发生器软件技术起到了推动作用。

(2)与 VXI 资源结合。目前,波形发生器由独立的台式仪器和适用于个人计算机 的插卡以及新近开发的 VXI 模块。由于 VXI 总线的逐渐成熟和对测量仪器的高要求, 在很多领域需要使用 VXI 系统测量产生复杂的波形, VXI  的系统资源提供了明显的优 越性,但由于开发 VXI 模块的周期长,而且需要专门的 VXI 机箱的配套使用,使得波 形发生器 VXI 模块仅限于航空、军事及国防等大型领域。

(3)随着信息技术蓬勃发展, 台式仪器在走了一段下坡路之后, 又重新繁荣起来。 不过现在新的台式仪器的形态, 和几年前的己有很大的不同。这些新一代台式仪器具有 多种特性,可以执行多种功能,外形尺寸与价格,都比过去的类似产品减少了一半。

 

2 系统整体设计

2.1 设计方案的论证

方案一:

采用 MSP430 系列单片机。该单片机是 TI 公司 1996 年开始推向市场的一种 16  超低功耗、具有精简指令集的混合信号处理器。其内部集成了多个不同功能的模拟电数字电路模块和微处理器,功能强大。

方案二:

采用 51 系列的单片机。该单片机是一个高可靠性、超低价、高性能的 8 位单片机, 32  IO 口,且 STC 系列的 51 单片机单片机可以在线编程、调试,方便地实现程序的 下载与整机的调试。

方案

采用 STM32系列32位微控制器基于Arm® Cortex®-M处理器系列的单片机。该单片机是一个高可靠性、超低价、高性能的 32 位单片机, 144 IO 口,它包括一系列产品,集高性能、实时功能、数字信号处理、低功耗/低电压操作、连接性等特性于一身,同时还保持了集成度高和易于开发的特点。优势尽显且品种齐全的STM32微控制器基于行业标准内核,提供了大量工具和软件选项以支持项目开发,使该系列产品成为小型项目或端到端平台的理想选择

从性能上分析,STM32系列单片机和 MSP430 系列单片机相较于 51 系列单片机功能更加强大, 处理速度 更快,芯片都可以满足该系统的要求;从价格上分析,STM32系列单片机和 MSP430 系列芯片价格 昂贵,不适合一般的设计开发STM32系列单片机使用起来难度较大。综合分析, 51 系列单片机性价比更高,因此我选择较为 常见的 STC89C51 作为系统的主控模块,它是一款低功耗、高性能的 8 位微处理器。

2.2 设计方案

方案一:

选用 LM324 作为运放模块。LM324 属于四运放集成电路,它采用 14 脚双列直插塑 料封装。它的内部包含四组形式完全相同的运算放大器, 除电源共用外, 四组运放相互 独立, 它既可以接单电源使用, 也可以接双电源使用, 驱动功耗低, 可与 TTL 逻辑电路相容调节频率低

方案

选用 LF412CN 作为运放模块。它要求低的电源电流,但保持一个大的增益带宽乘积和快速旋转速率。此外,匹配的高压 JFET 输入提供非常低的输入偏置和偏移电流.LF412C可用于高速积分器、数模转换器、采样和保持电路等多种电路中。LF412C的特点是在0C到70C之间工作。它采用 8 脚双列直插塑 料封装。它的内部包含组形式完全相同的运算放大器, 除电源共用外, 组运放相互 独立,双电源供电能够调节的频率高,驱动功耗低并且稳定。可与 TTL 逻辑电路相容。

 

3 系统硬件设计

3.1 处理器电路设计

本系统以 51 单片机为控制核心,对系统进行初始化,主要完成对开关的响应、发 送指令和对AD9850的控制,起到总控和协调各模块之间工作的作用。波形的具体产生是通过DDS模块产生。系统主要包括主控器STC89C52AD9850模块晶振电路以及外加复位电路三角波积分电路组成。本设计的特点是数字信号波形的产生通过程序控 制,因而波形输出非常稳定,同时波形的频率可利用外接开关进行改变。

 1  系统结构框图

3.2 DDS 电路设计

它主要由标准参考频率源、相位累加器、波形存储器、数/模转换器、低通平滑滤波器等构成。其中,参考频率源一般是一个高稳定度的晶体振荡器,其输出信号用于 DDS 中各部件同步工作。 DDS 的实质是对相位进行可控等间隔的采样。为实现全数字化的频率可调的频率合成器,本系统基于 STC89C52 采用 C语言 设计而成直接数字频率合成器( DDS )。系统由加法器、累加寄存器、波形存储器、 D / A 转换器、低通滤波器构成。DDS 系统的核心是相位累加器,它由一个 N 位累加器与 N 位相位寄存器构成。时钟脉冲每触发一次,累加器便将频率控制数据与相位寄存器输出的累加相位数据相加,然后把相加后的结果送至相位寄存器的数据输入端。相位寄存器将累加器在上一个时钟作用后所产生的新相位数据反馈到累加器的输入端,以使加法器在下一个时钟的作用下继续与频率控制数据相加。这样,相位累加器在参考时钟的作用下将进行线性相位累加,当相位累加器累加满时,就会产生一次溢出,以完成一个周期性的动作,这个周期就是 DDS 合成信号的一个频率周期,相位累加器的溢出频率就是 DDS 输出的信号频率。

 2  电路原理图

 3 PCB正反面

积分电路是使输出信号与输入信号的时间积分值成比例的电路积分电路主要用于波形变换、放大电路失调电压的消除及反馈控制中的积分补偿等场合。积分电路是一种应用比较广泛的模拟信号运算电路。它是组成模拟计算机的基本单元,用以实现对微分方程的模拟。同时,积分电路也是控制和测量系统中常用的重要单元,利用其充放电过程可以实现延时、定时以及各种波形的产生。电容两端的电压 uc 与流过电容的电流 ic 之间存在着积分关系,即

                              

图中,输入电压通过电阻 R 加在集成运放的反相输入端,并在输出端和反相输入端之间通过电容 C 引回一个深度负反馈,即可组成基本积分电路。为使集成运放两个输入端对地的电阻平衡,通常使同相输入端的电阻相等。

 4 积分电路 

3.3 辅助电路设计

由于主控器STC89C52、显示器LCD1602、D D S 信 号 源 、积 分 器 的 运 放 为+5V 电可利用 L7805  L7905 便可得到±5V 的电压。由于 LF412CN 运算放大器需要双电源  供电, 根据仿真实验得出, 如果采用±5V 供电, 会导致波形失真, 因此我选择利用三端 稳压器 L7812  L7912 设计±12V 整流电路专门为该运放提供±12 的直流电压,保证 波形的正常输出。结合以上分析, 需要设计一个可以同时产生 5V 和±12V 的直流电源, 保证整个系统的供电。

可产生±5V 和±12V  的直流稳压电源电路主要由电源变压器,整流桥堆,三端稳 压器以及滤波电路构成。首先变压器对 220V 或者更高的交流电压进行第一次降压,接 着通过整流桥可以把交流电压整流为直流电压, 由于从整流桥直接流过的电压还不够稳 定, 还需要滤波电路对整流过的电压进行过滤以达到稳定的电压, 接下来通过 L7812  L7912 两个稳压器, 进行二次滤波后即可把电压分别转换为±12V 输出, 后面则继续通  L7805  L7905,将±12V 电压转换为±5V。

 5  直流稳

 

4 系统软件设计

4.1 软件整体架构设计

该系统软件程序主要实现的就是通过开关来控制DDS产生不同频率的正弦波再DDS内部电路产生方波输出经过积分器产生三角波, 通过控制个开关, 用按键检测即可实现对不同频率正弦波的选择。

 6  程序流程图

4.2 DDS 芯片控制程序设计

AD9850有40位控制字,32位用于频率控制,5位用于相位控制,1位用于电源休眠( Powerdown )控制,2位用于选择工作方式。这40位控制字可通过并行方式或串行方式输入到AD9850在并行装入方式中,通过8位总线D0…D7将可数据输入到寄存器,在重复5次之后再在FQUD 上升沿把40位数据从输入寄存器装入到频率相位数据寄存器(更新 DDS 输出频率和相位),同时把地址指针复位到第一个输入寄存器。接着在 WCLK 的上升沿装入8位数据,并把指针指向下一个输入寄存器,连续5个 WCLK 上升沿后, WCLK 的边沿就不再起作用,直到复位信号或 FQUD 上升沿把地址指针复位到第一个寄存器。在串行输入方式, WCLK 上升沿把25引脚的一位数据串行移入,当移动40位后,用一个 FQUD 脉冲即可更新输出频率和相位。AD9850的复位( RESET )信号为高电平有效,且脉冲宽度不小于5个参考时钟周期。AD9850的参考时钟频率一般远高于单片机的时钟频率

至于按键检测部分的程序就是在函数中,通过对高低电平的判断,来检测按键是否闭合以此来改变送给AD9850的控制字

4.3其它程序模块设计

1602型 LCD 可以显示2行16个字符,有8位数据总线D0~D7和 RS , RW , EN 三个控制端口,工作电压为5V,并且具有字符对比度调节和背光功能。

基本操作程序

读状态(指令):输入: RS = L , RW = H , EN= H 输出:D0~D7=状态字

读数据:输入: RS = H , RW = H , EN= H 输出:无

写指令:输入: RS = L , RW = L ,D0~D7=指令码, EN=高脉冲输出:D0~D7=数据

写数据:输入: RS = H , RW = L ,D0~D7=数据, EN=高脉冲输出:无

  1. 测试与分析

5.1实物测试

 7 实物方波波形图

表1  实物方波频率表

KHZ

设置

1

20

100

200

500

600

800

1000

实际

1.03

20.04

100.03

199.98

500.03

600.02

799.98

1000.02

 8 实物正弦波波形图

表2 实物正弦波波频率表

KHZ

设置

1

20

100

200

500

600

800

1000

实际

1.02

19.96

99.98

199.99

500.1

600.04

800.10

1000.03

5.2实验结果分析

利用 STC8952 和 AD9850 以及其他基本模块完成了总体电路的设计,并用开关来控制波形的频率的改变且使频率在0~125MHz的范围内能以1Hz为步长进行调整,最终可以通过示波器观察到较为理想的正弦波和方波,单是积分电路不能满足要求,原因是用洞洞板搭建的积分电路干扰因素较多无法正常产生三角波,仿真结果表明是能够正常输出三角波。通过实物测试结果表明,该波形发生器能够很好满足实际要求,具有重要的应用价值。

6.结束与展望

6.1总结

回过头来看整个专项训练过程,主要工作是完成单片机控制AD9850产生正弦信号,方波信号并能显示出相对应的频率,通过搜集目前 DDS 技术的相关资料,了解国内外 DDS 信号发生器的相关制作方法,并通过设计方案的比较,针对设计任务提出了可行方案。在设计方案中,结合单片机的功能特点及其控制特性,利用简便的单片机 C51语言和其内部时钟,以单片机作为控制的核心。根据设计方案,详细地阐述了单片机的控制原理、AD9850的使用方法、 PCB 板的制作,设计了相应的硬件电路和系统软件,制作了电路原理样机并进行调试。结果表明,所设计的电路和软件能完成基本的测试功能

从这里,我学会了下面几点:

  一、继续学习,不断提升理论涵养。

  在信息时代,学习是不断地汲取新信息,获得事业进步的动力。作为一名青年学子更就应把学习作为持续工作用心性的重要途径。走上工作岗位后,我会用心响应单位号召,结合工作实际,不断学习理论、业务知识和社会知识,用先进的理论武装头脑,用精良的业务知识提升潜力,以广博的社会知识拓展视野。

  二、努力实践,自觉进行主角转化。

  只有将理论付诸于实践才能实现理论自身的价值,也只有将理论付诸于实践才能使理论得以检验。同样,一个人的价值也是透过实践活动来实现的,也只有透过实践才能锻炼人的品质,彰显人的意志。务必在实际的工作和生活中潜心体会,并自觉的进行这种主角的转换。

  三、提高工作用心性和主动性

实习,是开端也是结束。展此刻自己面前的是一片任自己驰骋的沃土,也分明感受到了沉甸甸的职责。在今后的工作和生活中,我将继续学习,深入实践,不断提升自我,努力创造业绩,继续创造更多的价值。

6.2展望

通过这次毕业设计使我明白了自己原来知识还比较欠缺.自己要学习的东西还很多,学习是一个长期积累的过程,在以后的工作、生活中都应该不断的学习,努力提高自己的知识和综合素质.但从中我也学到了很多知识,更培养了我独立工作与思考的能力,激发了我的创新意识.使我充分体会到了在创造过程中的探索的艰难和成功的喜悦.虽然这个项目还不是很完善,但是在设计过程中所学到的东西是这次毕业设计的最大收获和财富,使我终身受益。

经过实际情况证明,这套系统设计采用接收模块和发射模块的方法很好,从而降低了硬件成本,简化了硬件结构.此系统还需要进一步研究和改进,这就需要我们不断的学习专业知识和提高实践操作能力,为在以后的工作中打下坚实的基础。

参考文献:

  1. 林万荣.基于AD9850的DDS信号发生器系统设计与实现[J].中国有线电视,2015,(11):1286-1290.
  2. 任艳玲.基于AD9850的多功能信号源设计[J].电子科技,2015,28(06):179-183+186.
  3. 赵燕徐,郑茹琼,蔡顺燕.基于AD9850的可编程信号源的设计[J].信息技术,2010,34(07):116-118.
  4. 石桂名,冀勇钢,彭海龙.基于AD9850的信号发生器的设计与实现[J].现代电子技术,2010,33(01):117-119.
  5. 刘伟,胡仁杰,王峥.基于AD9850芯片的信号发生器的研究[J].电工电气,2009,(11):19-21.
  6. 潘宇倩.DDS频率合成器AD9850原理及应用[J].航天器工程,2007,(05):85-88.
  7. 成志婕,王建青,祝锡晶,刘昱辰,王耀宇.基于AD9850的多波形发生器仿真与设计[J].电子世界,2020,(08):142-145.
  8. 郭荣祥,郭吉祥.AD9850 125MHz DDS频率合成器的原理及应用[J].电子技术应用,1997,(12):64-66.
  9. 温慧星,屠华.RC积分电路获取三角波信号的研究[J].科技视界,2012,(29):286+289.
  10. 吉皓月,夏何银,宋琳.应用Multisim进行简单的波形转换仿真[J].中国新技术新产品,2020,(23):5-7.
  11. 黄婧.正弦波-方波-三角波产生电路的设计与仿真[J].电子世界,2017,(21):191+193.
  12. 田清华.方波三角波发生器的设计与仿真[J].电子制作,2013,(05):7.
  13. 贺阿仁.一种简单而实用的方波——三角波发生器[J].电子技术应用,1991,(06):33+48.
  14. 徐美娟.积分运算电路的应用[J].集成电路应用,2021,38(11):13-15.
  15. 方淼.一种基于STC89C52的函数信号发生器实验设计[J].洛阳师范学院学报,2022,41(02):42-45.

7.致谢

在此,本人衷心地感谢在此过程中帮助过我的老师和同学。在工程实施的过程中,

我遇到了无数的困难和障碍,都是在同学和老师的帮助下度过了。 其次,很感谢这篇论文所涉及到的各位学者。本文参考了数位学者的研究文献,如 果没有各位学者的研究成果的帮助和启发,我也很难完成本论文的写作。 由于我的学术水平有限,所写论文难免有不足之处,恳请各位老师和学友批评和指正!

基于AD9850的多功能信号发生器_第1张图片

 

基于AD9850的多功能信号发生器_第2张图片

基于AD9850的多功能信号发生器_第3张图片 

 

基于AD9850的多功能信号发生器_第4张图片

基于AD9850的多功能信号发生器_第5张图片 

 51程序

//函数1:  ad9850_reset()
//        复位ad9850,之后为并口写入模式        
//函数2:  ad9850_reset_serial()
//        复位ad9850,之后为串口写入模式
//函数3:  ad9850_wr_parrel(unsigned char w0,double frequence)
//        并口写ad9850数据,w0为ad9850中w0的数据,frequence
//        为写入的频率	
//函数4:  ad9850_wr_serial(unsigned char w0,double frequence)
//        串口写ad9850数据,w0为ad9850中w0的数据,frequence
//        为写入的频率	
//需定义的位:
         //ad9850_w_clk    ;
         //ad9850_fq_up    ;
         //ad9850_rest     ;
         //ad9850_bit_data ;
//例:
         //sbit ad9850_w_clk    =P2^2;
         //sbit ad9850_fq_up    =P2^1;
         //sbit ad9850_rest     =P2^0;
         //sbit ad9850_bit_data =P1^7;
//***************************************************//
//                 写数据说明                        //
//***************************************************//
//写数据例:
//       ad9850_reset()
//       wr_lcd02_data(unsigned char x)
//       ad9850_wr_parrel(0x01,1000)
//       ad9850_wr_serial(0x01,1000)
//***************************************************//
//---------------------------------------------------//
//                   程序                            //
//---------------------------------------------------//
# include 
# include 
# include 
sbit ad9850_w_clk    =P2^2;  //P2.2口接ad9850的w_clk脚/PIN7
sbit ad9850_fq_up    =P2^1;  //P2.1口接ad9850的fq_up脚/PIN8
sbit ad9850_rest     =P2^0;  //P2.0口接ad9850的rest脚/PIN12
sbit ad9850_bit_data =P1^7;  //P1.7口接ad9850的D7脚/PIN25
//P1为8位数据口
//***************************************************//
//              ad9850复位(并口模式)                 //
//---------------------------------------------------//
void ad9850_reset()
{
ad9850_w_clk=0;
ad9850_fq_up=0;
//rest信号
ad9850_rest=0;
ad9850_rest=1;
ad9850_rest=0;
}
//***************************************************//
//              ad9850复位(并口模式)                 //
//---------------------------------------------------//
void ad9850_reset_serial()
{
ad9850_w_clk=0;
ad9850_fq_up=0;
//rest信号
ad9850_rest=0;
ad9850_rest=1;
ad9850_rest=0;
//w_clk信号
ad9850_w_clk=0;
ad9850_w_clk=1;
ad9850_w_clk=0;
//fq_up信号
ad9850_fq_up=0;
ad9850_fq_up=1;
ad9850_fq_up=0;
}
//***************************************************//
//          向ad9850中写命令与数据(并口)             //
//---------------------------------------------------//
void ad9850_wr_parrel(unsigned char w0,double frequence)
{
unsigned char w;
long int y;
double x;
//计算频率的HEX值
x=4294967295/125;//适合125M晶振
//如果时钟频率不为180MHZ,修改该处的频率值,单位MHz !!!
frequence=frequence/1000000;
frequence=frequence*x;
y=frequence;
//写w0数据
w=w0;   
P1=w;      //w0
ad9850_w_clk=1;
ad9850_w_clk=0;
//写w1数据
w=(y>>24);
P1=w;      //w1
ad9850_w_clk=1;
ad9850_w_clk=0;
//写w2数据
w=(y>>16);
P1=w;      //w2
ad9850_w_clk=1;
ad9850_w_clk=0;
//写w3数据
w=(y>>8);
P1=w;      //w3
ad9850_w_clk=1;
ad9850_w_clk=0;
//写w4数据
w=(y>>=0);
P1=w;      //w4
ad9850_w_clk=1;
ad9850_w_clk=0;
//移入始能
ad9850_fq_up=1;
ad9850_fq_up=0;
}
//***************************************************//
//          向ad9850中写命令与数据(串口)             //
//---------------------------------------------------//
void ad9850_wr_serial(unsigned char w0,double frequence)
{
unsigned char i,w;
long int y;
double x;
//计算频率的HEX值
x=4294967295/125;//适合125M晶振
//如果时钟频率不为180MHZ,修改该处的频率值,单位MHz  !!!
frequence=frequence/1000000;
frequence=frequence*x;
y=frequence;
//写w4数据
w=(y>>=0);
for(i=0;i<8;i++)
{
ad9850_bit_data=(w>>i)&0x01;
ad9850_w_clk=1;
ad9850_w_clk=0;
}
//写w3数据
w=(y>>8);
for(i=0;i<8;i++)
{
ad9850_bit_data=(w>>i)&0x01;
ad9850_w_clk=1;
ad9850_w_clk=0;
}
//写w2数据
w=(y>>16);
for(i=0;i<8;i++)
{
ad9850_bit_data=(w>>i)&0x01;
ad9850_w_clk=1;
ad9850_w_clk=0;
}
//写w1数据
w=(y>>24);
for(i=0;i<8;i++)
{
ad9850_bit_data=(w>>i)&0x01;
ad9850_w_clk=1;
ad9850_w_clk=0;
}
//写w0数据
w=w0;   
for(i=0;i<8;i++)
{
ad9850_bit_data=(w>>i)&0x01;
ad9850_w_clk=1;
ad9850_w_clk=0;
}
//移入始能
ad9850_fq_up=1;
ad9850_fq_up=0;
}
//***************************************************//
//                   测试程序1000Hz                  //
//---------------------------------------------------//
main()
{
P0=0xff;
P1=0xff;
P2=0xff;
P3=0xff;
//---------------------------------------------------//
//---------------------------------------------------//
//串行写1000Hz程序
ad9850_reset_serial();
ad9850_wr_serial(0x00,10000);
//---------------------------------------------------//
while(1)
{
}
}

stm32程序

#include "stm32f10x.h"
#include "AD9850.h"
#include "delay.h"

/********************************************
函数名称:AD9850_Delay
功    能:AD9850延时函数
参    数:z - 延时长度
返回值  :无
*********************************************/
void AD9850_Delay(unsigned int z)
{
    for(;z>0;z--)
    {;}
}

/*--------------------并行模式-----------------------*/
#ifdef MODE_PARALLEL   
/********************************************
函数名称:AD9850_Reset_Parallel
功    能:在并行模式下复位AD9850
参    数:无
返回值  :无
*********************************************/
void AD9850_Reset_Parallel(void)
{
    AD9850_WCLK_CLR ;
    AD9850_FQUD_CLR ;
    //RST信号
    AD9850_RST_CLR ;
    AD9850_RST_SET ;
    AD9850_Delay(0xFFFF) ;
    AD9850_RST_CLR ;
}

/********************************************
函数名称:AD9850_Write_Parallel
功    能:在并行模式下写AD9850寄存器
参    数:W0 - W0寄存器的值
          freq - 频率值
返回值  :无
*********************************************/
void AD9850_Write_Parallel(unsigned char W0,unsigned long freq)//W0是用来设置相位的
{
    unsigned char wdata ;//写入数据(一次8位)
        unsigned long  y ;
			y=4294967296.0/125;//4294967296是2的32次方
			y*=(((float)freq)/1000000); //y(频率控制字)的计算公式:y = (freq * 4294967296)/125M
	
    wdata=W0 ;  //写w0
    GPIO_Write(AD9850_DATA_PORT ,wdata) ;   
		AD9850_WCLK_SET ;  
		AD9850_WCLK_CLR ;
		delay_ms(1);
    
    wdata=y>>24 ;  //写w1(从高位开始写入)
    GPIO_Write(AD9850_DATA_PORT ,wdata) ; 
		AD9850_WCLK_SET ;  
		AD9850_WCLK_CLR ;
	 
    	delay_ms(1);
    wdata=y>>16 ;  //写w2
    GPIO_Write(AD9850_DATA_PORT ,wdata) ;
		AD9850_WCLK_SET;
    AD9850_WCLK_CLR ;
		
    	delay_ms(1);
    wdata=y>>8 ;  //写w3
    GPIO_Write(AD9850_DATA_PORT ,wdata) ;
		AD9850_WCLK_SET;
		AD9850_WCLK_CLR ;
		
    	delay_ms(1);
    wdata=y>>0 ;  //写w4
		GPIO_Write(AD9850_DATA_PORT ,wdata) ;  
		AD9850_WCLK_SET;		
    AD9850_WCLK_CLR ;
	
    	delay_ms(1);
		 AD9850_FQUD_SET ;   //移入使能
    AD9850_Delay(0xFFFF) ;
		AD9850_FQUD_CLR ;  
   
}
#endif /* MODE_PARALLEL */
/*------------------------并行模式-------------------------*/
/*---------------------------------------------------------*/

/*------------------------串行模式-------------------------*/
#ifdef MODE_SEIAL
/********************************************
函数名称:AD9850_Reset_Sreial
功    能:在串行模式下复位AD9850
参    数:无
返回值  :无
*********************************************/
void AD9850_Reset_Sreial(void)
{
    AD9850_WCLK_CLR ;
    AD9850_FQUD_CLR ;
    //RST信号
    AD9850_RST_CLR ;
    AD9850_RST_SET ;
//    AD9850_Delay(0xFFFF) ;
	delay_ms(3);
    AD9850_RST_CLR ;
    //WCLK信号
    AD9850_WCLK_CLR ;
    AD9850_WCLK_SET ;
//    AD9850_Delay(0xFFFF) ;
	delay_ms(3);
    AD9850_WCLK_CLR ;
    //FQUD信号
    AD9850_FQUD_CLR ;
    AD9850_FQUD_SET ;
//    AD9850_Delay(0xFFFF) ;
	delay_ms(3);
    AD9850_FQUD_CLR ;
}

/********************************************
函数名称:AD9850_Write_Serial
功    能:在串行模式下写AD9850寄存器
参    数:W0 - W0寄存器的值
          freq - 频率值
返回值  :无
*********************************************/
void AD9850_Write_Serial(unsigned char W0,unsigned long freq)
{
    unsigned char i,wdata ;
     unsigned long  y ;
	y=4294967296.0/125;
	y*=(((float)freq)/1000000);
	    
    wdata = y>>0 ;   //写w4
    for(i=0 ;i<8 ;i++)
    {
        if(wdata & 0x01)
          AD9850_DATA_Write_1 ;
        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
          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
          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 ;
        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_DATA_Write_0 ;
        AD9850_WCLK_SET ;
        wdata >>= 1 ;
        AD9850_WCLK_CLR ;
    }
    
    AD9850_FQUD_SET ;  //移入使能
//    AD9850_Delay(0xFFFF) ;
    AD9850_FQUD_CLR ;
}
#endif /* MODE_SERIAL */

/*------------------------串行模式-------------------------*/
/*---------------------------------------------------------*/

/********************************************
函数名称:Init_AD9834(主要是初始化GPIO)
功    能:初始化AD9834
参    数:无
返回值  :无
*********************************************/
void Init_AD9850(void)
{
#ifdef MODE_SEIAL   //串行模式
    GPIO_InitTypeDef GPIO_InitStructure ;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
    GPIO_InitStructure.GPIO_Pin = AD9850_WCLK | AD9850_FQUD | AD9850_RST | AD9850_DATA ;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz ;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(AD9850_CONTROL_PORT ,&GPIO_InitStructure) ;
    
    AD9850_Reset_Sreial() ;
#endif
    
#ifdef MODE_PARALLEL //并行模式
	
    GPIO_InitTypeDef GPIO_InitStructure ;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO , ENABLE);
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE);//?
    GPIO_InitStructure.GPIO_Pin = AD9850_WCLK | AD9850_FQUD | AD9850_RST ;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz ;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
    GPIO_Init(AD9850_CONTROL_PORT ,&GPIO_InitStructure) ;
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All ;//可以
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz ;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(AD9850_DATA_PORT ,&GPIO_InitStructure);
    
    AD9850_Reset_Parallel() ;//并行模式下复位AD9850
#endif
    
}

你可能感兴趣的:(单片机,stm32,嵌入式硬件,c语言)