论文信号波形合成.docx
《论文信号波形合成.docx》由会员分享,可在线阅读,更多相关《论文信号波形合成.docx(29页珍藏版)》请在冰点文库上搜索。
论文信号波形合成
中国地质大学
2013年电子设计大赛
竞赛论文
参赛题目:
信号波形合成
成员:
信号波形合成实验电路
摘要:
本作品主要用于非正弦信号的分解与合成实验验证,包括电源电路模块,方波信号产生模块,放大、移相、波形合成模块、测量显示模块等。
通过1MHz晶振电路产生1MHz方波信号,经计数、分频得到10kHz方波信号,利用LC并联谐振(滤波器)分离出10kHz、30kHz、50kHz正弦波信号,然后对三个正弦波信号进行放大、移相加到加法器中合成方波信号。
把10kHz和30kHz正弦波信号送到减法器中合成三角波信号。
三个正弦波信号的幅度通过单片机采样,由液晶屏显示出来。
关键词:
方波信号,滤波器,正弦波信号,分解,合成
1作品简介
1.1设计目标
设计制作一个电路,能够产生多个不同频率的正弦信号,利用傅里叶原理产生以10KHz为基波,以奇次谐波为辅助谐波的信号,并将这些信号再合成为近似方波和其他信号。
电路示意图如图1所示:
图1信号波形合成电路示意图
1.2要求及指标
1.2.1基本要求
(1)方波振荡器的信号经分频与滤波处理,同时产生频率为10kHz和30kHz的正弦波信号,这两种信号应具有确定的相位关系;
(2)产生的信号波形无明显失真,幅度峰峰值分别为6V和2V;
(3)制作一个由移相器和加法器构成的信号合成电路,将产生的10kHz和30kHz正弦波信号,作为基波和3次谐波,合成一个近似方波,波形幅度为5V,合成波形的形状如图2所示。
图2利用基波和3次谐波合成的近似方波
1.2.2发挥部分
(1)再产生50kHz的正弦信号作为5次谐波,参与信号合成,使合成的波形更接近于方波;
(2)根据三角波谐波的组成关系,设计一个新的信号合成电路,将产生的10kHz、30kHz等各个正弦信号,合成一个近似的三角波形;
(3)设计制作一个能对各个正弦信号的幅度进行测量和数字显示的电路,测量误差不大于5%;
(4)其他。
2方案设计
2.1系统分析及整体方案
方波信号由基波成分和若干个谐波成分构成,即
,本作品根据这一理论原理制作而成。
本系统要包括了以下几个模块:
电源电路模块,方波信号产生模块,放大、移相、波形合成模块、测量显示模块,如图3所示。
本系统通过1MHz晶振电路产生1MHz方波信号,通过分频得到10kHz方波信号,经过三个不同频率的滤波器分离出10kHz、30kHz、50kHz正弦波信号,再对三个正弦波信号进行放大、移相加到加法器中合成方波信号。
三个正弦波信号的幅度通过单片机采样,由液晶屏显示出来。
图3系统方框图
2.2设计方案论证
2.2.1方波信号发生器
方案一:
通过反相器、外加电阻和电容来产生频率可调、占空比可调的方波信号。
其优点电路简单,且有些芯片可以产生稳定的方波。
方案二:
利用单片机时钟信号,通过软件编程实现输出10kHz方波信号。
实现起来相对较容易,但若没有时间做本参赛题的发挥部分,大材小用了。
综合所述,由于频率稳定直接影响信号的方波信号的分解与合成,并从实际出法,所以选择方案二。
2.2.2滤波器
方案一:
无源滤波。
由无源元器(电阻、电容、电感)设计而成,电路简单,但是滤波效果不好,且产生较多的杂波。
方案二:
有源滤波。
由运算放大器、电阻和电容构成,无需电感器。
还可提供电压增益。
由于方波信号发生器输出的信号幅度较高(5V),从实际制作、调试方便和产生较好的滤波效果等角度考虑,所以选择方案二。
2.2.3移相电路
方案一:
有源移相电路。
在移相的同时,还可以得到一定的增益,移向效果好,角度范围大。
方案二:
RC电路移相。
电路简单,但每级RC电路理论极限移相90度。
由于三个正弦波是在同一个方波信号下滤波产生的,它们之间相的位差相对较小,故选择方案一。
2.2.4整流滤波电路
方案一:
采用精密整流、滤波电路。
整流、滤波效果好,可对低于二极管导通电压的信号进行整流、滤波。
但电路复杂。
方案二:
采用转换芯片将交流直接转换为直流,电路简单、易于制作。
由于任务要求对峰峰值为6V、2V、1.2V的正弦波信号进行整流、滤波,故选择方案二。
3.系统实现
3.1硬件电路(主要单元电路设计)
3.1.1电源电路
本设计系统共需要四种不同的直流电压,分别为+9V、-9V、+5V和+3.3V电压。
为了满足电路供电要求,我们把+9V、-9V、+5V电源使用同一个电路输出,如图4(a)所示;而3.3V电压的输出使用了TI公司REG1117稳压芯片,专门为后续单片机提供电压,如图4(b)所示。
(a)±9V、+5V电源电路(b)+3.3V电源电路
图4电源电路
3.1.2方波信号产生电路
图5方波信号产生
锁相环CD4046为数字PLL,内有两个PD、VCO、缓冲放大器、输入信号放大与整形电路、内部稳压器等。
它具有电源电压范围宽、功耗低、输入阻抗高等优点,其工作频率达1MHz,内部VCO 产生50% 占空比的方波,输出电平可与TTL电平或CMOS 电平兼容。
同时,它还具有相位锁定状态指示功能。
信号输入端:
允许输入0.1V左右的小信号或方波,经A1放大和整形,提供满足PD要求的方波。
PDI由异或门构成,具有三角形鉴相特性。
它要求两个输入信号均为50%占空比的方波。
当无输入信号时,其输出电压为VDD/2,用以确定VCO的自由振荡频率PDI由异或门构成,具有三角形鉴相特性。
CD4046锁相环采用的是RC型压控振荡器,必须外接电容C1和电阻R1作为充放大元件。
当PL对跟踪的输入信号的频率宽度有要求时还需要外接电阻R2。
由于VCO是一个电流控制振荡器,对定时电容C1的充电电流与从9脚输入的控制电压成正比,使VCO的振荡频率亦正比于该控制电压。
当VCO控制电压为0时,其输出频率最低;当输入控制电压等于电源电压VDD时,输出频率则线性地增大到最高输出频率。
VCO振荡频率的范围由R1、R2和C1决定。
由于它的充电和放电都由同一个电容C1完成,故它的输出波形是对称方波。
一般规定CD4046的最高频率为1.2MHz(VDD=15V),若VDD<15V,则fmax要降低一些。
3.1.3分频电路
分频电路实现将某方波通过分频产生10KHz、30 KHz和50 KHz的新的方波。
根据题意要求,在某特定频率的方波上要产生几个其他频率方波,可按照这些频率的最小公倍数×2为原则,题目要求的三个频率为10KHz、30KHz和50KHz,其公倍数为150KHz,再乘以2,则上述方波发生器为300KHz。
验证一下:
300KHz频率30分频得10KHz,10分频30KHz,6分频50KHz。
采用十进制计数分配器CD4017配合D触发器CD4013实现分频为上述3个频率的方波,CD4017默认10分频,下图中二极管正极连接位置决定分频系数。
对于CD4013,所起的作用是将由CD4017分频后非50%占空比调节为50%。
设计电路见图3所示,300KHz输入信号送CD4017的CLK(14pin),输出信号从CD4013的Q端送出。
图6 分频器电路
该图中由于D2接CD4017的Q3,因此实现将300KHz 3分频,为 300KHz/3=100KHz
再经后级CD4013进行2分频,获得了 100KHz/2=50KHz 的频率。
对于30KHz和10KHz的分析计算方法相同,不再细述。
3.1.4滤波电路
滤波电路的作用是从300kHz的方波信号中得到10kHz、30kHz、50kHz正弦波信号。
本系统中选用有源LC带通滤波电路,如
图7带通电路
电路设计时,低通与高通滤波电路串联就可以构成带通滤波电路,条件是低通滤波电路的截止频率大于高通滤波的截止频率,两者覆盖的通路就构成了带通响应。
在选用元器件时,应当考虑由于元器件的误差对传递函数造成的影响;考虑到已知A1的增益=1.586,A2的增益=2.515;同时要尽量使运放同相输入端和反向输入端对地电阻相等,同相比例放大电路的电压增益就是有源低通或者高通的电压增益。
当f0=10kHz时,f=1/2πRC;将高通和低通的电容都取为103pF(为了满足运放电路的电阻不宜选择过大或者过小,一般为几千欧至几十千欧比较合适)。
取低通截止为10kΩ,高通截止频率为8kΩ,R1和R17可调。
图7中,R7=(A1-1)R15,取R15=4.7kΩ,R8=7.9kΩ;同理,当f0=30kHz时,R1=R4=5.25kΩ,R10=R17=5.73kΩ可调,C==102pF。
取R15=12.95kΩ,R8=15.9kΩ;同理当f0=50kHz时,R1=R4=3.18kΩ可调,R10=R17=24kΩ可调,C=102nF。
取R15=10kΩ,R8=10kΩ。
为了取得更好的滤波效果,在每一级滤波后面加上RC滤波电路,频率按照上面的公式计算。
3.1.5放大电路
放大电路的作用是把得到10kHz、30kHz、50kHz正弦波信号的幅度进行放大,得到峰峰值为6V、2V、1.2V的正弦波信号。
本系统选用了TI公司OPA227、082CD这两种集成运放作为放大电路的核心[2]。
10kHz,30kHz,50kHz均采用如图8所示的电路图。
由于输入信号为20mV左右,前面加上跟随器的原因是因为跟随器的输入电阻趋于无穷大,该电路几乎不从信号源吸收电流,因此当负载变化时,输出电压几乎不变,从而消除负载变化对输出电压的影响。
图8调幅电路
3.1.6移相电路
移相电路的作用是使三个正弦波信号在同一个相位叠加,我们以10kHz正弦波信号为基准,对30kHz、50kHz正弦波信号进行移相。
移相电路采用有源移相电路,如图12所示。
移相角φ=
,最大移相角为90°。
具体电路参考附总电路图。
30kHz正弦波信号的移相电路R取10kΩ,C取10pF;50kHz正弦波信号的移相电路R取10kΩ,C取1pF。
图12移相电路
3.1.7加法电路
加法电路作用是对10kHz、30kHz、50kHz三个正弦波信号进行合成方波信号,电路如图13所示,采用TI082CM。
其中AV=-1,前面加上跟随器的原因是因为跟随器的输入电阻趋于无穷大,该电路几乎不从信号源吸收电流,因此当负载变化时,输出电压几乎不变,从而消除负载变化对输出电压的影响。
U0=-(Ui1*R6/R1+Ui2*R6/R4+Ui3*R6/R5);当R1=R4=R5=R6的时候,就是这三个信号相加,合成方波。
图13加法电路(方波合成电路)
3.1.8减法电路
减法电路作用是对10kHz、30kHz正弦波信号进行合成三角波信号,电路如图14所示,采用TI082CM。
其中AV=-1,其他和加法合成电路一样,只是将加了一个反向器,将30k的正弦波进行反向后才能够合成正弦波,因为三角波是由一次基波和多次谐波合成的,且每个相邻的正弦波是反向的。
U0=-(Ui1*R6/R1-Ui2*R6/R4+Ui3*R6/R5);当R1=R4=R5=R6的时候,就是这三个信号相加,合成三角波。
图14减法电路(三角波合成电路)
3.1.9整流滤波检测电路
由于任务要求检测的信号幅度较高,故采用AD637集成有效值转换器电路,并由单片机采样、处理、显示正弦波幅度的大小,如图16所示。
图16整流滤波检测电路
3.2软件设计
3.2.1软件流程图
软件流程图如图17所示。
图17软件流程图
3.3.2软件程序
软件程序见附录2。
4系统性能测试与分析
4.1测试仪器
示波器、数字万用表
4.2性能测试
4.2.1.测试方法
用示波器分别测量10kHz、30kHz、50kHz正弦波信号的波形、峰峰值和合成后的方波信号的三角波信号的波形、峰峰值及三个正弦波信号的频谱分析。
4.2.2测量内容
1.用示波器分别测量10kHz方波信号的波形,如图18所示。
2.用示波器分别测量10kHz、30kHz、50kHz正弦波信号的波形、峰峰值及相位关系,如图19~22所示。
图1810kHz方波信号图1910kHz正弦波信号图2030kHz正弦波信号
图2150kHz方波信号图2210kHz、30kHz正弦波信号的相位比较
3.用用示波器分别测量合成后的方波信号、三角波信号的波形、峰峰值,如图23、24所示
图23合成后的方波信号图24合成后的三角波信号
4.对示波器对30kHz正弦信号的幅度进行测量,与峰峰值数字显示电路的值进行比较,如表1所示。
表1正弦波信号幅度的测量
示波器测量值(V)
峰峰值数字显示电路显示值(V)
6.08
6.00
2.10
2.00
1.26
1.20
4.2.3误差分析
1.由于在万能板上进行焊接,对于频率相对比较高的信号影响较大,可能产生波形的抖动和频率的波动。
2.在元器件参数选择上也存在一定的误差,测量值与标称测量值不同或是没有我们需要的元器件,采用各式方法合成的器件。
5总结与展望
从测量的波形、数据看,本系统基本实现了题目中的各个要求。
同时,本次比赛也极大地提高了我们的实践操作能力和团队协作能力。
由于时间关系,系统仍有待进一步完善,精度需要进一步提高、测量信息需要进一步扩展,三角波可增加高次谐波成分进行合成等。
附录1:
电路总图
附录2:
软件程序
#include//锁存器****
#include
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitst=P3^0;//ADC0809端口定义
sbiteoc=P3^2;
sbitoe=P3^1;
//sbitdabc=P1^4;
sbitale=P3^7;
sbitkey0=P2^0;
sbitkey1=P2^1;
sbitkey2=P2^2;
sbitkey3=P2^3;
sbitLCD_RS=P3^3;//数据/命令选择端(H/L)
sbitLCD_RW=P3^4;//读/写选择端(H/L)
sbitLCD_EN=P3^5;//使能信号
sbitLCD_PSB=P3^6;//并/串选择(H/L)
ucharad_0809;
uintad_data,ad_data1,ad_data2,ad_data3;
//ucharnumber=0;
ucharcodedis0[]={"幅值测量:
(V)"};
ucharcodedis1[]={"1:
频率[10KHZ]"};
ucharcodedis2[]={"2:
频率[30KHZ]"};
ucharcodedis3[]={"3:
频率[50KHZ]"};
ucharcodedis4[]={"幅值:
"};
ucharcodedis5[]={"[10KHZ]"};
ucharcodedis6[]={"[30KHZ]"};
ucharcodedis7[]={"[50KHZ]"};
voiddelay(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/*******************12864*******************/
/*************写指令数据到LCD************/
//RS=L,RW=L,E=高脉冲,D0-D7=数据
voidwrite_cmd(ucharcmd)
{
LCD_RS=0;
LCD_RW=0;
LCD_EN=0;
P1=cmd;
delay(5);
LCD_EN=1;
delay(5);
LCD_EN=0;
}
/*************写显示数据到LCD************/
//RS=H,RW=L,E=高脉冲,D0-D7=数据
voidwrite_dat(uchardat)
{
LCD_RS=1;
LCD_RW=0;
LCD_EN=0;
P1=dat;
delay(5);
LCD_EN=1;
delay(5);
LCD_EN=0;
}
ucharread_date()//读数据
{
uintreadvalue;
P1=0xff;
LCD_RS=1;
LCD_RW=1;
LCD_EN=0;
LCD_EN=1;
readvalue=P1;
delay
(1);
LCD_EN=0;
returnreadvalue;
}
voidlcd_set_dot(unsignedcharx,unsignedchary)
{
ucharx_byte,x_bit;//在横坐标的哪一个字节,哪一个位
uchary_byte,y_bit;//在纵坐标的哪一个字节,哪一个位
uchartmph,tmpl;
x_byte=x/16;//算出它在哪一个字节(地址).注意一个地址是16位的
x_bit=x%16;//(取模)算出它在哪一个位
y_byte=y/32;//y是没在哪个字节这个说法.这里只是确定它在上半屏(32行为一屏)还是下半屏.0:
上半屏1:
下半屏
y_bit=y%32;//y_bit确定它是在第几行
write_cmd(0x34);//打开扩展指令集.绘图显示关闭
write_cmd(0x80+y_bit);//先写垂直地址
write_cmd(0x80+x_byte+8*y_byte);//水平坐标.下半屏的水平坐标起始地址为0x88.(+8*y_byte)就是用来确定在上半屏还是下半屏
read_date();//先空读一次
tmph=read_date();//读高位
tmpl=read_date();
write_cmd(0x80+y_bit);//读操作会改变AC,所以重新设置一次
write_cmd(0x80+x_byte+8*y_byte);
if(x_bit<8)//如果x_bit位数小于8
{
write_dat(tmph|0x01<<(7-x_bit));//写高字节。
因为坐标是从左向右的.而GDRAM高位在左,低位在右
write_dat(tmpl);//原数据送回
}
else
{
write_dat(tmph);//原数据送回
write_dat(tmpl|0x01<<(15-x_bit));
}
write_cmd(0x36);//打开绘图显示
write_cmd(0x30);//回到基本指令集,毕竟ST7920是以字符为主的
}
voidlcd_displayclr()//使用图形模式时,应对所有GDRAM写0x00才算清屏,清屏命令(write_cmd(0x01))是对使用自带字库显示时用的
{
uchari,j,k;
write_cmd(0x34);//打开扩展指令集,绘图显示关
write_cmd(0x36);//打开扩展指令集,绘图显示开
for(i=0;i<2;i++)//分上下两屏写
{
for(j=0;j<32;j++)
{
write_cmd(0x80+j);//写Y坐标
delay
(1);
if(i==0)//写X坐标
{
write_cmd(0x80);
delay
(1);
}
else//写下半屏
{
write_cmd(0x88);
delay
(1);
}
for(k=0;k<16;k++)//写一整行数据
{
write_dat(0x00);
delay
(1);
}
}
}
write_cmd(0x30);//关闭扩展指令集
}
voidlcd_init()
{
LCD_PSB=1;//并口方式
write_cmd(0x30);//基本指令操作(8位数据)
delay(5);
write_cmd(0x0c);//显示开,关光标
delay(5);
write_cmd(0x01);//清除LCD的显示内容
delay(5);
}
voidfsin1()
{
floatx,y;
ucharx1,y1;
for(x=0;x<(4*3.1415);x+=0.1)
{
y=2*sin(x);
x1=10*x;
y1=31-(10*y+0.5);//对y值进行四舍五入
lcd_set_dot(x1,y1+10);
}
}
voidfsin2()
{
floatx,y;
ucharx1,y1;
for(x=0;x<(4*3.1415);x+=0.1)
{
y=1*sin(3*x);
x1=10*x;
y1=31-(10*y+0.5);//对y值进行四舍五入
lcd_set_dot(x1,y1+10);
}
}
voidfsin3()
{
floatx,y;
ucharx1,y1;
for(x=0;x<(4*3.1415);x+=0.1)
{
y=0.5*sin(5*x);
x1=10*x;
y1=31-(10*y+0.5);//对y值进行四舍五入
lcd_set_dot(x1,y1+10);
}
}
/*************************AD0809*********************/
voidad0809()
{
ale=1;
ale=0;
oe=0;//以下三条指令为起动AD0809
st=0;
delay
(2);
st=1;
st=0;
while(eoc==0);//等待转换结束
oe=1;//取出读得的数据
ad_0809=P0;
oe=0;
}
voiddisplay1()
{
uinti;
write_cmd(0x80);
i=0;
while(dis0[i]!
='\0')
{
write_dat(dis0[i]);//显示字符
i++;
}
write_cmd(0x90+1);
i=0;
while(dis1[i]!
='\0')
{
write_dat(dis1[i]);//显示字符
i++;
}
write_cmd(0x88+1);
i=0;
while(dis2[i]!
='\0')
{
write_dat(dis2[i]);//显示字符
i++;
}