信号发生器Word文档格式.docx

上传人:b****6 文档编号:20822400 上传时间:2023-01-25 格式:DOCX 页数:21 大小:444.77KB
下载 相关 举报
信号发生器Word文档格式.docx_第1页
第1页 / 共21页
信号发生器Word文档格式.docx_第2页
第2页 / 共21页
信号发生器Word文档格式.docx_第3页
第3页 / 共21页
信号发生器Word文档格式.docx_第4页
第4页 / 共21页
信号发生器Word文档格式.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

信号发生器Word文档格式.docx

《信号发生器Word文档格式.docx》由会员分享,可在线阅读,更多相关《信号发生器Word文档格式.docx(21页珍藏版)》请在冰豆网上搜索。

信号发生器Word文档格式.docx

一、方案设计与论证

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程控数据控制块:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1