历史上的今天
今天是:2025年07月14日(星期一)
2021年07月14日 | DDS正弦信号发生器
2021-07-14 来源:eefocus
虽然临近考试,还是偷着时间把DDS的初级操作给搞定了,O(∩_∩)O哈哈哈。从搞清理论原理,到下载调试出波形,还真费了点功夫。
这也算从VHDL转战verilog的第一仗吧,把模块化设计小过了把瘾,嘿嘿……
不管这能不能算个项目,但我还是在短时间内弄出来了,至于细节问题还有功能加强,考试之后再说喽!
首先还是要理清DDS中的理论计算关系,好的设计总是靠些理论的,呵呵。以输出信号为正弦信号为例好啦,主要关系和公式如下。
我们都知道,输出的正弦信号的相位是:
,三角函数而已啦!
为把t数字化(量化),选取基准时钟(系统时钟)
和基准相位(把2
分成2N等份)
,从而使得每个相位都有一个量化值,基准相位就是相位量化的精度。
在基准时钟的一个周期内,输出信号相位增量为:
![]()
这样就可以把相位增量量化为:
,由于是整数,会产生量化误差。
所以,就可以变换得到输出频率:
,可知,
和
是线性关系,
所起到的作用就是对基准时钟
进行分频得到输出时钟,且有:
DDS的频率分辨率为:
,即此时
=1,输出时钟频率最小。
DDS的基本工作流程就是通过相位的累加,得到当前的相位值,然后用当前的相位值(转换为ROM地址)进行查表,得到相应的幅值,然后输出。
相位累加器的输入,也称频率字,就是相位增量的量化值
。
其实最终有用的公式就是求频率字的这一个: ![]()
DDS主要由相位累加器、相位调制器、ROM查找表和DAC。其中,相位调制器用于信号的相位调制,设计波形发生器时可以不用。
由于没有示波器,所以DAC部分也不设计,采用SignalTap II 观察。(示波器?YY下吧!)
DDS的基本原理框图如下;

ROM中的数据量由DAC位数决定,假设精度为10位,则ROM中需要存放一个周期
的1024个点的数据,而每个点的数据大小由此点的幅度值
确定。
对ROM的读取时钟频率就是
。当然ROM的数据要由C或MATLAB得到啦,手动输入的话早就吐血了。
这次实验,采用的基准时钟是50MHZ,所取输出时钟是1KHZ。SignalTapII所得波形如下,这波形还算过得去啊:

程序部分倒是没有遇到什么问题,可是一开始居然挂在mif文件上,幸好在群里头遇到高人,用MATLAB重新弄了个,终于得到正确结果!
离场悲剧对DDS工作原理的解释可谓一针见血:


上一篇:Uart接口TTL电平详解
史海拾趣
|
我正在学习bootloader, 想自己改写个eboot试试。 可是生成的eboot.nb0大小为256k,实验箱原来的是88k。 256k的可以烧进去但是启动后没有反应, 谁知道为什么写进去了,却没反应么? … 查看全部问答> |
|
以下是自己写的一段小程序,运行的时候总是不能进入到switch语句的分支内,即不会有Refreshing11!的提示。数据库内已经存入数据,只是想在一个ClistCtrl控件中显示其数据。 请问问题出在什么地方? void CTCPClientDlg::RefreshDB() { & ...… 查看全部问答> |
|
为什么我开的捕获中断老是进不去,这是用来测频率的一段程序,请问是哪里出问题了,急 #include unsigned int cap_TAR=0; unsigned int puls_num; unsigned int Freq; void main() { WDTCTL = WDTPW + WDTHOLD; P2DIR&=~BIT2; P2SEL|=BIT2; P1DIR|=BIT0; TA0CT ...… 查看全部问答> |
|
通过板上丰富的传感器,再配合光敏元件,可以很好的测量室内各种环境参数,可以通过接受器接受传感器的数据,然后驱动执行机构调整室内的环境参数,比如可以控制LED光源阵列,调整室内光照和控制窗帘开启或关闭,另外可以驱动加热系统,补水系统, ...… 查看全部问答> |
|
楼主也是在精确延迟程序是钻研了很久,经常弄不出结果!下面是代码解析!大家有什么问题,可以继续交流!以后再钻研低功耗的问题! #include \"msp430g2553.h\" typedef unsigned int uint; typedef unsigned char uchar; //没想到在CCS下面下 ...… 查看全部问答> |




