信号发生器Word文档格式.docx
《信号发生器Word文档格式.docx》由会员分享,可在线阅读,更多相关《信号发生器Word文档格式.docx(21页珍藏版)》请在冰豆网上搜索。
一、方案设计与论证
1、方案
方案一:
基于单片机的方式。
以单片机为控制中心,通过专门的DDS芯片如AD9852编程,产生所需的正弦波信号,然后用硬件电路搭建产生其他各种调制波信号,该方案简单,易于实现。
方案二:
数字锁相环频率合成技术,利用锁相环把压控振荡器的输出频率锁定在所需的频率上,可以很好的选择所需的频率信号,抑制杂散分量,可以采用集成芯片,但这种锁相环倍频电路中,要减小频率间隙,就必须减小频率fi,导致频率转换时间增加,而减小输出间隙与减小频率转换时间是矛盾的,且输出频率在很大范围变化时,N也要随之变化,环路增益也要增大幅度变化,从而使环路的动态性急剧变化。
方案三:
采用基于以FPGA为平台的DDS直接数字频率合成技术,以单片机和FPGA相结合的方式完成,用单片机完成人机交互;
系统控制部分,用FPGA完成波形发生以及各种调制功能,本方案利用了单片机在软件控制设计方面的通用性和FPGA在逻辑设计上的优势,可以很好的完成系统设计。
2、方案确定
综合考虑以上三种方案的优缺点以及题目的基本要求和发挥要求,以及成本问题,我们选择了第三种方案,即基于FPGA和单片机结合的设计方案,利用新技术、新的解决方案来实现本题目的各项功能。
FPGA选择cycloneII系列的EP2C5T144C8。
单片机采用STM32芯片来实现,显示部分采用性价比较高的NOKIA5110液晶显示器。
控制键盘采用4X4的矩阵键盘。
二、系统设计和理论分析
1.DDS的基本原理是利用采样定理,通过查表的方法产生波形。
DDS的结构有很多种,其中基本的电路原理图可以用下图表示:
采用FPGA实现DDS,可以将要输出的波形数据预先存放在RAM中,然后在系统标准时钟频率下,按照一定的顺序从RAM单元中读出数据,再进行DA转换和低通滤波,就可以得到一定频率的输出波形。
上述过程可使用HDL硬件描述语言对FPGA编程实现。
2.全数字实现各种波形
(1)基本波形:
正弦波,方波,三角波。
直接采用DDS技术,在三个不同的RAM中存放三种不同的波形数据,然后经过描述语言对其输出数据和数据的选择做适当的处理,即得到三种不同的波形。
QUARTUSII综合RTL图如下图所示:
(2)幅度调制信号(AM)
采用AM信号的基本公式结合VerilogHDL语言中对有符号数的计算,来实现AM信号的产生,QUARTUSII综合RTL图:
Count模块是复杂的信号处理模块
(3)模拟频率调制信号(FM)
基于FM的原理,根据调平信号变化的规律采用数字方式控制DDS信号发生的频率控制字,直接作用于输出波形的频率值,即实现了对信号源的频率的调节,该方式下,DDS调制信号输出的波形频率与调制信号频率控制字成正比,而载波信号的频率控制字又随调制信号成正比例变化,本系统采用调制信号,固定为1KHZ,而改变载波频率控制字的方式来实现的。
流程图:
(4)键控法产生ASK信号
通过HDL语言在FPGA里实现时,数字电路内的0,1数字及代码作为选择开关信号对应于键控信号,DDS波形发生器对于载波发生器,如下图:
其中用分频时钟作为0,1基带码产生的数据流
(5)键控法产生PSK信号
和ASK信号类似,同样用时钟模拟0,1基带码的基带流来模拟开关选择,具体实现用到HDL语言和原理图结合的方法,RTL图如下:
三、系统组成
本系统包括FPGA,模拟以及外设三部分。
由于基本波形以及各种调制信号发生的功能都是通过DDS方式在FPGA内实现的,因此模拟部分仅包含高速DA,滤波电路,带宽运放部分,控制部分和显示控制部分,采用32位的STM32单片机实现。
电路图见附录。
四、硬件设计
1.数字部分
即用DDS原理在FPGA里构建一个能产生正弦,方波,三角波,还有AM,FM,ASK,PSK信号的系统,并且能够受STM32控制和选择输出想要的波形和频率等信息。
QUARTUSIIRTL图具体在附件:
2.模拟部分
(1)DA部分
采用十二位高速DA转换器DAC902,作为本系统的DA,然后通过opa690差分输出。
电路截图如下:
五、测试方法与数据
(1)正弦,方波,三角波信号
设定频率
测试频率
相对误差
峰峰值/v
100HZ
6.4
500HZ
1000HZ
2000HZ
3KHZ
4KHZ
5KHZ
6KHZ
7KHZ
8KHZ
9KHZ
1MZ
5.1
5MZ
4.8
10MZ
4.2
(2)AM信号
示波器观察在载波频率增大时AM频率也加大的,而调制度从10%到100%调节时信号的幅度越来越小。
(3)FM信号
示波器观察在载波频率加大时FM频率也在加大,但频偏不随之改变,当改变最大频偏时,测得的最大频偏也随之改变。
(4)ASK和PSK
ASK
100khz
PSK
200khz
以上都符合调制规则,说明准确完成了题目要求。
六、测试结论
(1)输出频率范围为100HZ到10MHZ以上,步进100HZ,稳定度优于10-4;
(2)AM信号可以在10%到100%程控调节,步进10%;
(3)FM信号最大频偏为10KHZ,且可二级程控调节载波信号频率;
(4)实现ASK,PSK信号;
(5)扩展实现方波跟三角波的发生。
附录:
STM32部分程序
voidkey_con(void)
{
if(key[0][0])
{
Delay(100);
state=1;
while(key[0][0]);
}
}
if(state)
if(key[0][1])
num++;
if(num==65536)num=1;
while(key[0][1]);
if(key[0][2])
num--;
if(num==0)num=65535;
while(key[0][2]);
if(key[1][1])
if(key[1][1])
if(num>
=65280)num=1;
elsenum=(num-(num%256))+256;
=65536)num=1;
while(key[1][1]);
if(key[1][2])
if(num<
256)num=num;
elsenum=(num-(num%256))-256;
=1)num=65535;
while(key[1][2]);
if(key[0][3])
state=0;
while(key[0][3]);
if(key[2][0])
bo++;
if(bo==8)bo=1;
while(key[2][0]);
if(key[2][1]&
&
AM==1)
ma++;
if(ma==1024)ma=1;
LCD_WriteString_En(10,130,"
chengkong(AM)"
RED,0xffff);
LCD_WriteNumber(150,130,ma,0x0000,0xffff);
if(key[2][2]&
ma--;
if(ma==0)ma=1023;
if(key[2][3]&
ma=ma*10;
if(key[3][3])
ff++;
if(ff%2==0&
FM==1){
GPIO_SetBits(GPIOB,GPIO_Pin_8);
LCD_WriteString_En(10,110,"
PPG50%(5KHZ)"
}
elseif(ff%2==1&
FM==1){
GPIO_ResetBits(GPIOB,GPIO_Pin_8);
PPG100%(10KHZ)"
while(key[3][3]);
if(bo!
=0)
switch(bo)
case1:
GPIO_SetBits(GPIOB,GPIO_Pin_2);
FM=0;
AM=0;
//正弦波
GPIO_ResetBits(GPIOB,GPIO_Pin_3);
GPIO_ResetBits(GPIOB,GPIO_Pin_4);
//Pant(0xffff);
LCD_WriteString_En(20,85,"
SIN"
//显示正弦标志
break;
case2:
GPIO_ResetBits(GPIOB,GPIO_Pin_2);
//方波
GPIO_SetBits(GPIOB,GPIO_Pin_3);
LCD_WriteString_En(20,85,"
FANG"
case3:
AM=0;
//三角波
GPIO_SetBits(GPIOB,GPIO_Pin_3);
SAN"
case4:
FM=1;
//FM
GPIO_SetBits(GPIOB,GPIO_Pin_4);
FM"
case5:
AM=1;
//AM
GPIO_ResetBits(GPIOB,GPIO_Pin_3);
AM"
case6:
//ASK
GPIO_ResetBits(GPIOB,GPIO_Pin_2);
FM=0;
ASK"
case7:
//PSK
PSK"
////////////////////////////////////////////////
//////把控制字转换为频率值显示在液晶上/////////
///////////////////////////////////////////////
/////频率控制字是32位的,现在我们只取其中的//////
/////16位用单片机输入,这里去L位地位的位值////
/////H位高位的位值,以方便做计算。
////////////
u32num_to_data(u16num)
u32data;
data=SYS_CLK*(N2(L)*num+(N2(L)-1))/N2(Z);
returndata;
uint64_tN2(u8X)
uint64_tS=1;
u16i;
for(i=0;
i<
X;
i++)
S=S*2;
returnS;
FPGA部分程序和原理图
modulexinhao(clk,rst_n,in_data,en_1,en_2,en_3,
datar_out
);
inputclk;
inputen_1,en_2,en_3;
inputrst_n;
input[15:
0]in_data;
output[9:
0]datar_out;
wire[9:
0]data_out_1;
0]data_out_2;
0]data_out_3;
wire[15:
0]in_data_1;
0]data_out_r;
wirerst_n;
//wireclk_system;
assignin_data_1=in_data;
reg[9:
wireclk;
//assignrst_n_r=~rst_n;
//assignen_1_r=~en_1,en_2_r=~en_2,en_3_r=~en_3;
add_dff32add_dff32_inst
(
.data(in_data_1),//
.rst_n(rst_n),//inputrst_n_sig
.clk(clk),//inputclk_sig
.data_out(data_out_r)//outputdata_out_sig
);
rom_zhengrom_zheng_inst(
.address(data_out_r),
.clken(en_1),
.clock(clk),
.q(data_out_1)
rom_fangrom_fang_inst(
.clken(en_2),
.clock(clk),
.q(data_out_2)
ron_sanron_san_inst(
.address(data_out_r),
.clken(en_3),
.q(data_out_3)
always@(posedgeclkornegedgerst_n)begin
if(!
rst_n)datar_out<
=10'
d0;
elseif(en_1)datar_out<
=data_out_1;
elseif(en_2)datar_out<
=data_out_2;
elseif(en_3)datar_out<
=data_out_3;
elsedatar_out<
end
endmodule
modulecount(mul1,mul2,pm,out_data);
inputsigned[9:
0]mul1,mul2;
input[9:
0]pm;
outputunsigned[9:
0]out_data;
0]ph=10'
d512;
wireunsigned[9:
wiresigned[9:
0]data_1;
0]data_2;
wiresigned[19:
0]out_data_1;
0]out_data_2;
0]out_data_3;
0]out_data_4;
assigndata_1=mul1-ph;
assigndata_2=mul2-ph;
assignout_data_1=data_2[9]?
-((ph-data_2[8:
0])*pm):
data_2[8:
0]*pm;
assignout_data_2=out_data_1[19:
10];
assignout_data_3=(out_data_2[9]==1&
data_1[9]==1)?
(ph-out_data_2[8:
0])*(ph-data_1[8:
0]):
(out_data_2[9]==0&
-(out_data_2[8:
0]*(ph-data_1[8:
0])):
(out_data_2[9]==1&
data_1[9]==0)?
-((ph-out_data_2[8:
0])*data_1[8:
out_data_2*data_1:
out_data_2*data_1;
assignout_data_4=out_data_3[19:
assignout_data=out_data_4[9]?
out_data_4[8:
0]:
(out_data_4[8:
0]+ph);
顶层文件截图
部分RTL模块图
波形选择输出块:
AM实现块:
AM程控数据控制块: