这时中频为零,镜频和信
号自身重叠一起,此时要采用I/Q正交结构来抑制镜频。
图2.1零中频解调的基本原理
零中频解调的主要优点是:
·临频道抑制不须要高Q的滤波器,低通滤波器可以用模拟集成电路实现;
零中频解调器与非中频解调器的比较3
·低噪声放大器后不须要50Ω的负载;
·I/Q支路可以直接A/D,用DSP实现解调器;
·硬件消耗少,集成度高。
3电路与程序设计
3.1电路的设计
3.1.1系统总体框图
本系统采用单片机驱动AD8954DDS芯片,产生两路信号、一路正弦一路余弦。
配合后边的乘法电路,调制解调电路、低通滤波电路、ADC模数转换电路最后运用程序驱动配合外围电路和示波器进行幅频特性的分析。
系统总体框图如图6所示
图3.1系统总体框图
3.1.2扫频信号子系统框图与电路原理图
图3.2扫频信号子系统框图与电路原理图
3.2程序的设计
3.2.1程序功能描述与设计思路
通过51单片机控制AD9854,对51单片机编写程序,从而使AD9854在单片机的控制下分别产生一路频率、振幅、相位相同的正弦波和余弦波。
3.2.2程序流程图
图3.3程序流程图
4测试方案与测试结果
图4.1频率为3MHz的正弦波
通过一段时间的努力,我们终于能够运用51单片机控制AD9854产生我们想要得到的正弦波形,紧接着我们进行正交扫频信号的产生实验。
但是却始终不能够产生稳定、精确的正交扫频信号波形。
剩下的大多数时间都在为产生非常稳定的正交扫频信号波形而努力。
软件编程工作基本完成<完整的源程序附于附录中),但是产生的正交扫频信号在稳定相位差、等振幅和等频率的问题上总是不能很好的解决。
开始时对程序进行优化,可产生的信号总是受到很大的干扰,后来查阅一些资料了解到我们的外部所布线路完全是由自己用焊锡手工焊接,裸露在外部的焊锡电路没有绝缘层的保护在上电时很容易受到干扰,这可能是波形不稳定的原因。
本想从做一个AD9854的外围电路,可是时间以及来不及,这就是我没目前的实验进度情况。
附录1:
电路原理图
整体电路图
附录2:
源程序
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
#defineulongunsignedlong
ucharFreqWord[6]。
//6个字节频率控制字
#defineCLK_Set6
constulongFreq_mult_ulong=2345625。
constdoubleFreq_mult_doulle=2345624.80592213。
#defineAD9854_DataBusP0
#defineAD9854_AdrBusP2
sbitAD9854_RST=P3^7。
//AD9854复位端口
sbitAD9854_UDCLK=P3^6。
//AD9854更新时钟
sbitAD9854_WR=P3^5。
//AD9854写使能,低有效
sbitAD9854_RD=P3^4。
//AD9854读使能,低有效
sbitAD9854_FDATA=P3^3。
//AD9854FSK,PSK控制
sbitAD9854_OSK=P3^2。
//AD9854OSK控制端
//====================================================================================
//函数名称:
voidAD9854_WR_Byte(ucharaddr,uchardat>
//函数功能:
AD9854并行口写入数据
//入口参数:
addr6位地址
//dat写入的数据
//出口参数:
无
//====================================================================================
voidAD9854_WR_Byte(ucharaddr,uchardat>
{
AD9854_AdrBus=(addr&0x3f>|(P2&0xc0>。
AD9854_DataBus=dat。
AD9854_WR=0。
AD9854_WR=1。
}
//====================================================================================
//函数名称:
voidAD9854_Init(void>
//函数功能:
AD9854初始化
//入口参数:
无
//出口参数:
无
//====================================================================================
voidAD9854_Init(void>
{
AD9854_WR=1。
//将读、写控制端口设为无效
AD9854_RD=1。
AD9854_UDCLK=0。
AD9854_RST=1。
//复位AD9854
AD9854_RST=0。
AD9854_WR_Byte(0x1d,0x10>。
//关闭比较器
AD9854_WR_Byte(0x1e,CLK_Set>。
//设置系统时钟倍频
AD9854_WR_Byte(0x1f,0x00>。
//设置系统为模式0,由外部更新
AD9854_WR_Byte(0x20,0x60>。
//设置为可调节幅度,取消插值补偿
AD9854_UDCLK=1。
//更新AD9854输出
AD9854_UDCLK=0。
}
//====================================================================================
//函数名称:
voidFreq_convert(longFreq>
//函数功能:
正弦信号频率数据转换
//入口参数:
Freq需要转换的频率,取值从0~SYSCLK/2
//出口参数:
无但是影响全局变量FreqWord[6]的值
//说明:
该算法位多字节相乘算法,有公式FTW=(DesiredOutputFrequency×2N>/SYSCLK
//得到该算法,其中N=48,DesiredOutputFrequency为所需要的频率,即Freq,SYSCLK
//为可编程的系统时钟,FTW为48Bit的频率控制字,即FreqWord[6]
//====================================================================================
voidFreq_convert(longFreq>
{
ulongFreqBuf。
ulongTemp=Freq_mult_ulong。
ucharArray_Freq[4]。
//将输入频率因子分为四个字节
Array_Freq[0]=(uchar>Freq。
Array_Freq[1]=(uchar>(Freq>>8>。
Array_Freq[2]=(uchar>(Freq>>16>。
Array_Freq[3]=(uchar>(Freq>>24>。
FreqBuf=Temp*Array_Freq[0]。
FreqWord[0]=FreqBuf。
FreqBuf>>=8。
FreqBuf+=(Temp*Array_Freq[1]>。
FreqWord[1]=FreqBuf。
FreqBuf>>=8。
FreqBuf+=(Temp*Array_Freq[2]>。
FreqWord[2]=FreqBuf。
FreqBuf>>=8。
FreqBuf+=(Temp*Array_Freq[3]>。
FreqWord[3]=FreqBuf。
FreqBuf>>=8。
FreqWord[4]=FreqBuf。
FreqWord[5]=FreqBuf>>8。
}
//====================================================================================
//函数名称:
voidAD9854_SetSine(ulongFreq,uintShape>
//函数功能:
AD9854正弦波产生程序
//入口参数:
Freq频率设置,取值范围为0~(1/2>*SYSCLK
//Shape幅度设置.为12Bit,取值范围为(0~4095>,取值越大,幅度越大
//出口参数:
无
//====================================================================================
voidAD9854_SetSine(ulongFreq,uintShape>
{
ucharcount。
ucharAdress。
Adress=0x04。
//选择频率控制字地址的初值
Freq_convert(Freq>。
//频率转换
for(count=6。
count>0。
>//写入6字节的频率控制字
{
AD9854_WR_Byte(Adress++,FreqWord[--count]>。
}
AD9854_WR_Byte(0x21,Shape>>8>。
//设置I通道幅度
AD9854_WR_Byte(0x22,(uchar>(Shape&0xff>>。
AD9854_WR_Byte(0x23,Shape>>8>。
//设置Q通道幅度
AD9854_WR_Byte(0x24,(uchar>(Shape&0xff>>。
AD9854_UDCLK=1。
//更新AD9854输出
AD9854_UDCLK=0。
}
//=================================================================
//函数名称:
voiddelay(uintus>
//函数功能:
us级延时,大概2~4us
//入口参数:
us延时时间的长短
//出口参数:
无
//=================================================================
voiddelay(uintus>
{
uinti。
for(i=0。
ii++>
_nop_(>。
}
//测试正弦波,采用120MHZSYSCLK时,出来10MHZ波形,波形很好,测试成功
//当采用300MHZSYSCLK时,测试50MHZ波形时,DDS发热厉害,且波形衰减严重,幅度在35mV左右
intmain(>
{
uinti。
AD9854_Init(>。
for(i=0。
i<400。
i++>
{
AD9854_SetSine(1000000+i*100000,4000>。
}
delay(1>。
while(1>。
}
参考文献
[1]林立.单片机原理及应用.2018第二版.北京:
电子工业出版社出版.2018.1
[2]华成英.模拟电子技术基础教程.2006年二月第一版.北京:
清华大学出版社,2018.10
[3]阎石.数字电子技术基础.2009第五版.北京:
高等教育出版社,2004.1.
[4]郭天祥.51单片机C语言教程.2018第三版.北京:
电子工业出版社出版,2009.1.
[5]樊昌信曹丽娜.通信原理.第六版.北京:
国防工业出版社,2018.1.