用CPLD和单片机设计任意波形发生器

合集下载

基于单片机的波形发生器设计及实现

基于单片机的波形发生器设计及实现

基于单片机的波形发生器设计及实现引言:波形发生器是电子设备中常用的测试设备,它可以产生各种波形信号,如正弦波、方波、三角波等,对于电子工程师来说是非常重要的仪器。

本文将介绍一种基于单片机的波形发生器的设计及实现方法。

设计目标:1.可以产生正弦波、方波和三角波等多种波形信号。

2.波形发生器的频率范围可以调节,并且稳定可靠。

3.实现简单、成本低廉、易于维护。

硬件设计和实现:波形发生器的核心部件是单片机,通过单片机的高精度计数器和时钟模块可以实现频率的调节和控制。

其基本原理是通过单片机的IO口输出不同的电平来产生不同的波形。

1.信号发生部分:通过单片机的IO口输出电平控制信号发生电路。

正弦波的发生电路可以采用RC振荡器电路,方波和三角波的发生电路可以采用计数器和比较器。

2.频率调节和控制部分:使用单片机内部的定时器和计数器来控制波形的频率和周期。

通过改变定时器的工作模式和计数器的计数值,可以实现不同频率的波形信号输出。

3.显示和控制部分:通过LCD显示屏显示波形参数和频率,并且可以使用按键控制频率的调节和选择不同的波形。

软件设计和实现:1.初始化设置:包括单片机的IO口设置、定时器和计数器的初始化、LCD显示屏的初始化等。

2.频率调节和控制:通过按键扫描和中断处理函数来实现频率的调节和控制。

按键的按下和释放可以触发相关的中断服务程序,从而实现频率的增加和减少。

3.波形产生:通过定时器中断来控制波形的产生。

当定时器溢出时,会触发中断服务程序,从而改变IO口的电平状态,实现不同波形信号的输出。

测试与结果:进行相应的软硬件调试后,我们可以成功实现基于单片机的波形发生器。

通过按键可以选择不同的波形类型,并且可以根据需要调节波形的频率。

总结:本文介绍了一种基于单片机的波形发生器的设计与实现方法。

通过使用单片机的IO口、定时器和计数器,可以实现不同波形信号的输出和频率的调节。

这种波形发生器具有成本低廉、稳定可靠、易于维护等优点,可以满足电子工程师对波形发生器的基本需求。

基于CPLD的智能波形发生器

基于CPLD的智能波形发生器

来, 应用 于频 率 范 围宽 , 率 步 进 小 , 能 多 的 波 形 频 功
发 生器 中 , 从而 使其 各 自扬长 避 短 , 连 壁 合 了 。 珠
l 功 能
具 有产生 正弦波 、 三角波 、 方波 功能 ; 由键盘 输 可 入生 成上述 三种 波 形 的线 性 组合 波 形 或 由 基 波及 其
上, 但在 实 现 复杂 的控 制 时序 上 占用 资 源很 多 , 又显
谐 波线性组 合 波形 ; 有 波形 存 储 功 能 ; 出 波形 的 具 输
频率 范 围 10 z 0 Hz 频 率 可 调 , 率 步 进 间 隔 0 H 一5 K , 频
≤lOI; 出波形 幅度 可调 , 围 0—5 步进 0 1 OI 输 - z 范 V, .V;
1 r

YES

N o


R AM

、 l
: : : /
Y ES

、 ~ J 、

启 CL 动 PD

J 达 LrL1 9
N O
: L




¨ 2 h r f
图 2 MC 85 软 件 控 制 原 理 流 程 图 S7 1
去 执行 相应 的初 始 化 子 程 序 : 算 一 个 周 期 某 波 形 计
初 J 始化
1 r、
显 示
NO



/ — \
, — e o ,
、 、\

1r

YES
l启 Al 动
I数 转 I 据换

关 示 CL 显 禁P D

单片机波形发生器的设计

单片机波形发生器的设计

单片机波形发生器的设计波形发生器是一种能够产生不同类型波形信号的电子设备,常用于电子实验、测试和通信系统中。

在单片机技术的发展下,设计一款基于单片机的波形发生器已经变得相对简单和便捷。

本文将从硬件设计和软件编程两个方面,详细介绍如何设计一款基于单片机的波形发生器。

第一部分:硬件设计硬件设计是波形发生器设计的基础,它涉及到信号源、滤波电路、放大电路等多个方面。

1.信号源波形发生器需要一个稳定的、可调节的信号源。

在单片机中,可以使用定时器/计数器模块产生一个稳定的方波信号。

通过调整定时器的计数值和预分频系数,可以改变方波的频率。

造成方波到正弦波,可以通过模拟滤波电路。

2.滤波电路为了将方波信号变成正弦波,需要使用低通滤波器。

一种简单的低通滤波器是RC电路,通过调整电阻和电容值,可以改变滤波器的截止频率。

为了实现更好的滤波效果,可以使用更复杂的滤波电路,如椭圆滤波器或数字滤波器。

3.放大电路波形发生器输出的信号一般较小,需要经过放大电路才能达到合适的信号水平。

放大电路一般选择运算放大器(Op Amp),通过调整反馈电路中的电阻值和放大器的放大倍数,可以调节波形发生器输出的信号幅度。

第二部分:软件编程软件编程是实现波形发生器的核心部分,它涉及到单片机内部的定时器、IO口、中断等多个模块。

1.定时器配置在单片机中,定时器模块可以根据设定的计数值和预分频系数产生指定频率的方波信号。

通过配置定时器的工作模式、计数值和预分频系数,可以实现对方波频率的调节。

2.IO口配置通过配置IO口,可以将波形输出到外部设备,如示波器或音响设备。

通过将IO口输出为PWM信号,可以将方波信号转化为模拟信号,并通过滤波电路进行进一步处理。

3.中断处理在波形发生器中,需要使用中断来实现定时器计数值的更新和波形输出的控制。

通过编写中断处理函数,可以在指定的时间间隔内进行定时器计数值的更新,并控制IO口输出波形信号。

总结:通过对单片机波形发生器的硬件设计和软件编程进行详细说明,可以发现设计一款基于单片机的波形发生器并不复杂。

基于CPLD和单片机的任意波形发生器设计

基于CPLD和单片机的任意波形发生器设计

基于CPLD和单片机的任意波形发生器设计
引言
在电子工程设计与测试中,常常需要一些复杂的、具有特殊要求的信号,要
求其波形可任意产生,频率方便可调。

通常的信号产生器难以满足要求,市场
上出售的任意信号产生器价格昂贵。

结合实际需要,我们设计了一种任意波形
发生器。

电路设计中充分利用MATLAB 的仿真功能,将希望得到的波形信号
在MATLAB 中完成信号的产生、抽样和模数转换,并将得到的数字波形数据
存放在数据存储器中,通过单片机和CPLD 控制,将波形数据读出,送入后向通道进行A/D 转换和放大处理后得到所需的模拟信号波形。

利用上述方法设计的任意波形发生器,信号产生灵活方便、功能扩展灵活、信号参数可调,实现
了硬件电路的软件化设计。

具有电路结构简单、实用性强、成本低廉等优点。

系统框图
任意波形发生器的设计思想,是利用MATLAB 的强大仿真功能,方便、快
捷的生成给定频率、周期、脉宽的任意波形数据;并将数据预存在数据存储器中。

在单片机控制下,利用CPLD 电路产生地址读出数据,送入D/A 转换电路,得到所需的任意波形信号。

系统结构框图如图1;图中分频电路和地址发生器由CPLD 实现。

图1 系统框图
电路设计及实现
单片机控制电路
单片机采用AT89C52 芯片,通过软件编程产生所要求的控制信号。

主要的
控制参数包括:信号周期、脉宽;分频电路的开始信号、地址发生器的复位信号; E2PROM 的选通信号;D/A 转换电路的选通信号。

在具体电路中,端口P1.0 控。

基于cpld集成芯片实现任意波形发生器

基于cpld集成芯片实现任意波形发生器
续、输出频率稳定度高、分辨率高等优点。
2021/7/22
5
DDS的基本原理是基于采样定理,将模拟信号进行 采集,经量化后存入存储器中,通过寻址ห้องสมุดไป่ตู้找表输 出波形数据,再经过D/A转换滤波即可恢复模拟波 形。基本框图如下
2021/7/22
6
实现DDS有三种技术方法 a 采用高性能DDS单片电路 b 采用低频正弦波DDS单片电路 c 设计基于CPLD芯片的个人方法
言编程,对硬件结构和工作方式进行重构,再由可 编程逻辑器件控制数据的输出,经D/A转换器转换 成相应模拟信号。在设计过程中,以Altera公司的 EPM7128SLC84-15 芯 片 为 设 计 器 件 。 讨 论 了 DDS 技术的基本组成结构、工作原理和特点
2021/7/22
2
在现代电子测量仪器中,任意波形发生器 (Arbitrary Waveform Generator,AWG)作为最新 一类的信号源,正日益受到人们的重视,国内外的 许多科研单位和高等院校也纷纷着手研制AWG。 但目前使用的AWG大部分是利用分立元件实现的, 体积大、可靠性差、准确度低。
c方案三:采用直接数字频率合成器 ,可用硬件或软件 实现。即用累加器按频率要求相对应的相位增量进行累 加,再以累加相位值作为地址码 ,经D/A转换、滤波即 得所需波形。方法简单,频率稳定度高,易于程控。
d 方案四:采用单片机控制动态生成程序 ,该方法引入
动态编程和吞时钟技术,使用8031便可产生50kHz的正
基于CPLD集成芯片实现DDS技术的 任意波形发生器
姓名:黄先英,刘祧 指导老师:裴东,王全洲 学生届别:2005 专业:电子信息工程 班级:电子甲班
2021/7/22

51单片机制作的波形发生器

51单片机制作的波形发生器

51单片机制作的波形发生器相信很多朋友都可能接触到一个波型发生器的制作,可能刚刚入门,做的东西也不会说是很复杂。

可能就一个矩形波,或者是三角波。

但是网上的很多资料是忽悠人的,就此,我也提供一个比较完整的波型发生器 C51 原代:该系统的软件比较典型:包括键盘的应用,显示的应用和 DA 转换器的应用。

本设计中,输出的波形有三种:正弦波,方波,三角波。

方波的输出最为简单,只要按照设定的周期值将输出的电压改变即可。

三角波的输出也比较简单,单片机的输出只要完成数字量递增和递减交替进行即可。

、正弦波的输出最麻烦,如果在软件中计算出输出的各点电压值,将会浪费很多的 CPU 时间,以至于无法满足频率的要求。

通常最简单的方法是通过手动的方法计算出输出各点的电压值,然后在编写程序时以数组的方式给出。

当需要时,只要按照顺序进行输出即可。

这种方法比运算法速度快且曲线的形状修改灵活。

在本设计中将 360 度分为 256 个点,则每两个点之间的间隔为1.4 度,然后计算出每个点电压对应的数字量即可。

只要反复输出这组数据到 DAC0832, 就可以在系统输出端得到想要的正弦波。

具体程序如下:#include ;#define uchar unsigned char#define uint unsigned int#define DAdata P0uchar code Sinetab[256]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c,0x8e,0x90,0x92,0x94,0x96,0x98,0x9a,0x9c,0x9e,0xa0,0xa2,0xa4,0xa6,0xa8,0xaa,0xab,0xad,0xaf,0xb1,0xb2,0xb4,0xb6,0xb7,0xb9,0xba,0xbc,0xbd,0xbf,0xc0,0xc1,0xc3,0xc4,0xc5,0xc6,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xce,0xcf,0xd0,0xd1,0xd1,0xd2,0xd2,0xd3,0xd3,0xd3,0xd2,0xd2,0xd1,0xd1,0xd0,0xcf,0xce,0xce,0xcd,0xcc,0xcb,0xca,0xc9,0xc8,0xc6,0xc5,0xc4,0xc3,0xc1,0xc0,0xbf,0xbd,0xbc,0xba,0xb9,0xb7,0xb6,0xb4,0xb2,0xb1,0xaf,0xad,0xab,0xaa,0xa8,0xa6,0xa4,0xa2,0xa0,0x9e,0x9c,0x9a,0x98,0x96,0x94,0x92,0x90,0x8e,0x8c,0x8a,0x88,0x86,0x84,0x82, 0x80,0x7d,0x7b,0x79,0x77,0x75,0x73,0x71, 0x6f,0x6d,0x6b,0x69,0x67,0x65,0x63,0x61, 0x5f,0x5d,0x5b,0x59,0x57,0x55,0x54,0x52, 0x50,0x4e,0x4d,0x4b,0x49,0x48,0x46,0x45, 0x43,0x42,0x40,0x3f,0x3e,0x3c,0x3b,0x3a, 0x39,0x37,0x36,0x35,0x34,0x33,0x32,0x31, 0x31,0x30,0x2f,0x2e,0x2e,0x2d,0x2d,0x2c, 0x2c,0x2b,0x2b,0x2b,0x2b,0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a,0x2a,0x2b,0x2b,0x2b,0x2b, 0x2c,0x2c,0x2d,0x2d,0x2e,0x2e,0x2f,0x30, 0x31,0x31,0x32,0x33,0x34,0x35,0x36,0x37, 0x39,0x3a,0x3b,0x3c,0x3e,0x3f,0x40,0x42, 0x43,0x45,0x46,0x48,0x49,0x4b,0x4d,0x4e, 0x50,0x52,0x54,0x55,0x57,0x59,0x5b,0x5d, 0x5f,0x61,0x63,0x65,0x67,0x69,0x6b,0x6d, 0x6f,0x71,0x73,0x75,0x77,0x79,0x7b,0x7d, };uchar code Triangletab[58]={0x1a,0x21,0x28,0x2f,0x36,0x3d,0x44,0x4b, 0x52,0x59,0x60,0x67,0x6e,0x75,0x7c,0x83,0x8a,0x91,0x98,0x9f,0xa6,0xad,0xb4,0xbb,0xc2,0xc9,0xd0,0xd7,0xde,0xe5,0xde,0xd7,0xd0,0xc9,0xc2,0xbb,0xb4,0xad,0xa6,0x9f,0x98,0x91,0x8a,0x83,0x7c,0x75,0x6e,0x67,0x60,0x59,0x52,0x4b,0x44,0x3d,0x36,0x2f,0x28,0x21,};uchar code Squaretab[2]={0x56,0xaa};uchar code disp1[]={"Sine Wave ""Triangle Wale ""Square Wave "};uchar idata disp2[16]={"Frequency:Hz"};uchar code Coef[3]={10,100,200};uchar idata WaveFre[3]={1,1,1};uchar code WaveTH[]={0xfc,0xfe,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xfc,0xfe,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, };uchar code WaveTL[]={0xf2,0x78,0xfb,0x3c,0x63,0x7d,0x8f,0x9d,0xa8,0xb1, 0x17,0x0b,0xb2,0x05,0x37,0x58,0x70,0x82,0x90,0x9b, 0x4d,0xa7,0xc4,0xd3,0xdc,0xe2,0xe6,0xea,0xec,0xee };uchar Wavecount,THtemp,TLtemp;uchar Waveform;sbit rs=P2^5;sbit rw=P2^6;sbit e=P2^7;sbit DA=P2^0;sbit KEY=P3^2;void delay(uchar i){uchar j;for(;i>;0;i--)for(j=20;j>;0;j--);}void busy(){uchar temp;temp=0x00;rs=0;rw=1;while((temp&0x80)==0x80) {P0=0xff;e=1;temp=P0;e=0;}}void WR_Com(uchar temp) {busy();rs=0;rw=0;P0=temp;e=1;e=0;}void WR_Data(uchar num){busy();rs=1;rw=0;P0=num;e=1;e=0;}void disp_lcd(uchar addr,uchar *temp1) {uchar i;WR_Com(addr);delay(100);for(i=0;i;0;i--){P0=0x30;rs=0;rw=0;e=1;e=0;delay(100);P0=0x38;rs=0;rw=0;e=1;e=0;delay(100);}void lcd_Reset(){WR_Com(0x01);delay(100);WR_Com(0x06);delay(100);WR_Com(0x0c);delay(100);}void SineOUT(uchar Wavecount) {DAdata=Sinetab[Wavecount++]; Wavecount=0;DA=0;}void TriangleOUT(uchar Wavecount) {DAdata=Triangletab[Wavecount++]; if(Wavecount>;57)Wavecount=0;DA=0;DA=1;}void SquareOUT(uchar Wavecount) {DAdata=Squaretab[Wavecount++];if(Wavecount>;1)Wavecount=0;DA=0;DA=1;}void timer() interrupt 1{TH0=THtemp;TL0=THtemp;if(Waveform==0)SineOUT(Wavecount); else if(Waveform==1)TriangleOUT(Wavecount); else if(Waveform==2)SquareOUT(Wavecount); }void key_int() interrupt 0 {uchar keytemp,keytemp1;uint WaveCoef;EA=0;TR0=0;keytemp1=0;delay(10);while(!KEY);keytemp=~P2&0x1e; keytemp>;>;=1;while(keytemp!=8){keytemp=~P2&0x1e;keytemp>;>;=1;if(keytemp!=keytemp1){keytemp1=keytemp;switch(keytemp){case 1:if(++Waveform==3)Waveform=0;break;case 2:if(++WaveFre[Waveform]==11)WaveFre[Waveform]=1;break;case 4:if(--WaveFre[Waveform]==0)WaveFre[Waveform]=10;break;}THtemp=WaveTH[Waveform*16+(WaveFre[Waveform]-1)]; TLtemp=WaveTL[Waveform*16+(WaveFre[Waveform]-1)];WaveCoef=WaveFre[Waveform]*Coef[Waveform]; disp2[13]=WaveCoef%10+0x30;WaveCoef/=10;disp2[12]=WaveCoef%10+0x30;WaveCoef/=10;disp2[11]=WaveCoef%10+0x30;WaveCoef/=10;disp2[10]=WaveCoef%10+0x30;WaveCoef/=10;disp_lcd(0x80,&disp1[Waveform*16]);disp_lcd(0xc0,disp2);}}TH0=THtemp;TL0=THtemp;Wavecount=0;TR0=1;}void main(){uint WaveCoef;uchar i;lcd_ini();lcd_Reset();WaveCoef=WaveFre[Waveform]*Coef[Waveform]; disp2[13]=WaveCoef%10+0x30;WaveCoef/=10;disp2[12]=WaveCoef%10+0x30;WaveCoef/=10;disp2[11]=WaveCoef%10+0x30;WaveCoef/=10;disp2[10]=WaveCoef%10+0x30;WaveCoef/=10;disp_lcd(0x80,&disp1[Waveform*16]);disp_lcd(0xc0,disp2);i=0;DAdata=0x00;DA=0;TMOD=0x01;IT0=1;ET0=1;EX0=1;EA=1;while(1);}。

基于CPLD的多波形发生器的设计

基于CPLD的多波形发生器的设计
ZHAO e g b n , U —i CH EN ix Ch n ・ i LI Yu l , Zh - ue
f. e o g ag ntue f c ne eh o g , ab 50 7 hn; H i nj n st i c &Tcn l yH ri 102 ia 1 l i I ito S e o n C
Ab t a t A i d o liwa e o m e e a o e i n d b s d o i c i i l e u n y s n h sst c n l g , st eM CU o e sr c : kn f mu t — v f r g n r t r sd sg e a e n d r t g t q e c y t e i e h o o y a h i e d a f r c r
d wn p le wi t d l t n a d S n a e s me t e a l e u n y v l e o v f r a e a c r t l ip a e o , u s d h mo u a i n O o , tt a i , l f q e c a u fwa e o msc n b c u a e y d s l y d o h m r
h g — p e p r t n l mp i e n x e d c re t ic i. t u v f r sm u a i n a d f l s e u t h w h t i h s e d o e a i a o a l ra d e tn u r n r u t Ou p twa e o m i lto n e d t t s l s o t a i f c i e r s t e s s e a d wi i h rp a tc l a u a i h p e ii n c a a t rsi , i h s a i t mu tf n to . h y t m n t h g e r c i a l e h s h g — r c so h r c e i t h g — t b l y, h v c i l u c i n i

基于51单片机的波形发生器的设计

基于51单片机的波形发生器的设计

基于51单片机的波形发生器的设计引言:波形发生器是一种可以生成特定频率、特定波形的电子设备。

它广泛应用于科研、教学和产业生产等领域,可以用于信号发生、信号测试、信号仿真等各种任务。

本文将介绍一个基于51单片机的波形发生器的设计方案。

一、系统硬件设计1.系统框架该波形发生器系统采用51单片机作为主控芯片,主要包括三个部分:信号生成模块、显示模块和控制模块。

其中,信号生成模块负责产生各种特定频率、特定波形的信号;显示模块用于展示信号参数等相关信息;控制模块负责接收用户输入并对波形发生器进行控制。

2.硬件连接信号生成模块与主控芯片之间通过I/O接口相连,用于传输数据和控制信号。

显示模块通过串口与主控芯片相连,用于显示相关信息。

控制模块通过按键、旋钮等输入设备与主控芯片相连,用于接收用户输入。

二、系统软件设计1.系统初始化在系统初始化阶段,主控芯片需要完成引脚、定时器、串口等相关资源的初始化工作。

同时,还需要设置一些全局变量和参数的初始值。

2.信号生成模块信号生成模块通过定时器产生特定频率的时钟信号,并根据用户输入的参数生成相应的信号波形。

主控芯片利用定时器中断函数进行波形生成,并将生成的信号数据存放在缓冲区中。

3.显示模块显示模块负责将信号波形显示在液晶屏上,并显示相关参数,如频率、幅度等。

主控芯片将信号数据从缓冲区中读取,并通过串口发送给显示模块进行显示。

4.控制模块控制模块负责接收用户输入的控制指令,并通过按键、旋钮等输入设备完成用户交互。

主控芯片通过中断函数实时读取用户输入并进行相应的控制操作。

三、系统功能设计1.频率设置功能用户可以通过控制模块设置波形发生器的频率,可以选择固定频率或者可调频率。

利用定时器时钟频率与定时器中断的时间间隔来控制波形的频率。

2.波形选择功能用户可以通过控制模块选择不同的波形类型,如正弦波、方波、三角波、脉冲波等。

主控芯片根据用户指令设置波形参数,并生成相应的波形信号。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于单片机频率计的设计说明书开封大学参赛成员:郭东卫王超参赛指导教师:杨志帮侯静基于单片机频率计的设计指导老师-杨志帮、侯静核心器件: AT89C52 74HC163在电子工程设计与测试中,常常需要一些复杂的、具有特殊要求的信号,要求其波形可任意产生,频率方便可调。

通常的信号产生器难以满足要求,市场上出售的任意信号产生器价格昂贵。

结合实际需要,我们设计了一种任意波形发生器。

电路设计中充分利用MATLAB的仿真功能,将希望得到的波形信号在MATLAB中完成信号的产生、抽样和模数转换,并将得到的数字波形数据存放在数据存储器中,通过单片机和CPLD控制,将波形数据读出,送入后向通道进行A/D转换和放大处理后得到所需的模拟信号波形。

利用上述方法设计的任意波形发生器,信号产生灵活方便、功能扩展灵活、信号参数可调,实现了硬件电路的软件化设计。

具有电路结构简单、实用性强、成本低廉等优点。

一、系统框图任意波形发生器的设计思想,是利用MATLAB的强大仿真功能,方便、快捷的生成给定频率、周期、脉宽的任意波形数据;并将数据预存在数据存储器中。

在单片机控制下,利用CPLD电路产生地址读出数据,送入D/A转换电路,得到所需的任意波形信号。

系统结构框图如图1;图中分频电路和地址发生器由CPLD实现。

图1 系统框图二、电路设计及实现单片机控制电路单片机采用AT89C52芯片,通过软件编程产生所要求的控制信号。

主要的控制参数包括:信号周期、脉宽;分频电路的开始信号、地址发生器的复位信号;E2PROM的选通信号;D/A转换电路的选通信号。

在具体电路中,端口P1.0控制分频电路的启动、P1.1控制地址发生器的清零,P2.0控制28C256和AD7545的选通信号。

单片机工作在定时器0方式,软件设计利用C语言实现。

流程图如图2所示。

图2 软件流程图三、波形数据生成MATLAB作为一款优秀的数学工具软件,具有强大的运算功能;可以方便的产生各种信号波形,在软件中实现波形信号的产生、抽样和模数转换。

设计的任意波形发生器,数据存储器选用28C256芯片,信号波形通过MATLAB仿真产生;得到的波形数据存放在数据存储器28C256中。

具体设计中,我们要求产生周期为200ms,脉宽为5ms的单/调频混合信号,其中单频信号的脉宽为4ms,频率为30KHz;调频信号的脉宽为1ms,频率为30KHz_35KHz。

在MATLAB中设定抽样率为500KHz,得到了2500个波形数据。

这些混合波形数据在烧录入数据存储器的过程中,由于波形数据较多,直接用手工录入数据存储器中不仅费时且容易出错。

为克服这一弊端,通过MATLAB编程的方法将产生的波形数据按照HEX文件的INTEL格式存放,然后将这些波形数据整批次烧录入数据存储器中。

采用上述方法,波形数据生成简单,快捷;可根据需要在软件程序中方便地修改信号参数;无需改动硬件电路即可实现信号参数的功能扩展。

四、CPLD逻辑设计分频电路采用两片74HC163实现。

通过分频电路,将12MHz的晶振标准频率分频后,得到500KHz的抽样频率,作为地址发生器的时钟。

分频电路的工作由单片机控制。

地址发生器电路由3片74HC163组成,时钟频率为500KHz,有分频电路提供;和预存的波形数据抽样频率相一致,以实现数据的无失真读出。

电路设计中,采用ALTRA公司的EPM7128AETC100-10芯片,在MAX+PLUSⅡ开发环境中完成分频缏泛偷刂贩⑸鞯缏返纳杓啤;贑PLD的电路设计,可以省去大部分的中小规模集成电路和分离元件;使得电路具有集成度高、工作速度快、编程方便、价格低廉的显著优点。

通过CPLD和数据预生成的信号实现方法,无需改变硬件电路,即可实现信号参数的任意调整;同时外围电路十分简单,为工程调试和应用带来了方便。

五、D/A转换电路D/A转换电路的实现如图3所示。

电路中,AD7545将波形数据转换为模拟信号;LF353进行信号滤波和整形。

根据项目要求,要实现输出波形程序设计主要解决按键控制输出三角波、方波、锯齿波和正弦波的问题。

按键控制:根据设计要求和按键控制输出波形的变化,程序应设计不断查询检测按键的状态,以便输出对应的波形。

对于要通过一个按键来识别每种不同的功能,我们给每个不同的功能模块设置ID号进行标识,这样每按一次键,ID的值就不一样。

因此,我们不同的波形用flag标识:当flag=0时,输出三角波;当flag=1时,输出方波;当flag=2时,输出锯齿波;当flag=3时,输出正弦波。

我们规定,每次按下K键,分别给出不同的flag值就能实现任务。

输出模拟电压:由于DAC0832和单片机AT89C51采用直通方式,因此只要往数据输入端送数字量,从后面的运放输出端就可得到模拟电压。

输出的电压根据公式计算到。

由此在需要输出某个电压值时,求出对应的数字值,通过P2口输出,就可以得到所需的模拟电压。

为了方便编程我们将DAC0832的输出封装为一个子函数,用形参表示待输出的数值。

程序中用4个子函数分别表示产生不同的波形,程序设计的流程图如图所示图简易波形发生器程序流程图根据程序流程图,写出单片机C语言程序清单:#include <reg51.h>#define uchar unsigned char#define uint unsigned int#define DAC0832 P2 // 将DAC0832定义为P2口#define ALL 65536 // 将ALL定义为65536#define Fosc 12000000 // 频率为12MHzuchar TH_0,TL_0,flag1,flag=0;uint FREQ=100,num;float temp;uchar code sin_num[]={0,0,0,0,0,0,0,0,1,1,1,1,1,2,2,2,2,3,3,4,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,12,12,13,14,15,15,16,17,18,18,19,20,21,22,23,24,25,25,26,27,28,29,30,31,32,34,35,36,37,38,39,40,41,42,44,45,46,47,49,50,51,52,54,55,56,57,59,60,61,63,64,66,67,68,70,71,73,74,75,77,78,80,81,83,84,86,87,89,90,92,93,95,96,98,99,101,102,104,106,107,109,110,112,113,115,116,118,120,121,123,124,126,128,129,131,132,134,135,137,139,140,142,143,145,146,148,149,151,153,154,156,157,159,160,162,163,165,166,168,169,171,172,174,175,177,178,180,181,182,184,185,187,188,189,191,192,194,195,196,198,199,200,201,203,204,205,206,208,209,210,211,213,214,215,216,217,218, 219,220,221,223,224,225,226,227,228,229,230,230,231,232,233,234, 235,236,237,237,238,239,240,240,241,242,243,243,244,245,245,246, 246,247,247,248,248,249,250,250,251,251,251,252,252,253,253,253, 253,254,254,254,254,254,254,255,255,255,255,255,255,255,255,255}; /************端口设置*********/sbit cs=P3^6;sbit change=P3^2;/************延时1m s*********/void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}/************初始化函数*********/void init(){TMOD=0X01; //设定工作模式1temp=ALL-Fosc/12.0/256/FREQ; //定时器初值计算TH_0=(uint)temp/256;TL_0=(uint)temp%256;EA=1; //开总中断EX0=1; //开外部中断IT0=1; //设定下降沿有效工作方式ET0=1; //设定定时器工作在定时方式TR0=1; //开定时器中断}/************切换波形函数*********/void changefreq(void){if(change==0){flag++;if(flag==4) {flag=0;num=0;}}TH_0=(uint)temp/256;TL_0=(uint)temp%256;}/************三角波函数*********/void sanjiaobo(void){for(num=0;num<255;num++){cs=0;DAC0832=num;cs=1;}for(num=255;num>0;--num){cs=0;DAC0832=num;cs=1;}}/************方波函数*********/void fangbo(void){cs=0;DAC0832=0xff;cs=1;for(num=0;num<255;num++);cs=0;DAC0832=0x00;cs=1;for(num=255;num>0;num--);}/************锯齿函数*********/void juchibo(void){cs=0;DAC0832=++num;cs=1;}/************正弦函数*********/void zhengxianbo(void){for(num=0;num<255;num++){cs=0;DAC0832=sin_num[num];cs=1;}for(num=255;num>0;num--){cs=0;DAC0832=sin_num[num];cs=1;} }/************外部中断服务函数*********/ void ext0()interrupt 0{changefreq(); //引用频率改变函数}/************定时器中断函数*********/ void timer0()interrupt 1{TH0=TH_0;TL0=TL_0; //重新装初值TR0=0;switch(flag){case 0:{sanjiaobo();TR0=1;break;}case 1:{fangbo();TR0=1;break;}case 2:{juchibo();TR0=1;break;}case 3:{zhengxianbo();TR0=1;break;}default:;}}/************主函数*********/void main(){init();while(1);}结语采用上述方法设计的任意波形发生器,通过软件和硬件结合,充分发挥MATLAB强大的仿真功能,尽可能的减少了硬件开销。

相关文档
最新文档