/////51单片机P2口接44键盘的行线和列线;红灯亮时进行频率输入;绿灯亮时进行占空比输入;频率值暂定在100到60KHZ之间;输入频率和占空比时要输够六位整数,不够的在前面补0;占空比以百比数(0-100)形式存在。///////////
/////////方波发生器资料。空军工程大学导院501明明,20071010初稿/////////
#include<reg52h>
#include<stdioh>
#define uchar unsigned char
sbit coma=P1^0;
sbit comb=P1^1;
sbit comc=P1^2;
sbit comd=P1^3;
sbit come=P1^4;
sbit red=P1^5;
sbit green=P1^6;
sbit new=P1^7;
sbit Q=P3^7;
int i,x,y;
/ 延时函数 /
void delay(void)
{
uchar j;
for (j=300;j>0;j--);
}
/数字对应的共阳极段码/
uchar getcode(uchar i)
{
uchar p;
switch (i)
{
case 0: p=0xC0; break; / 0 /
case 1: p=0xF9; break; / 1 /
case 2: p=0xA4; break; / 2 /
case 3: p=0xB0; break; / 3 /
case 4: p=0x99; break; / 4 /
case 5: p=0x92; break; / 5 /
case 6: p=0x82; break; / 6 /
case 7: p=0xF8; break; / 7 /
case 8: p=0x80; break; / 8 /
case 9: p=0x90; break; / 9 /
default: break;
}
return(p);
}
/////////显示函数/////////
void display(int t)
{int a=t/10000,b=t/1000%10,c=t/100%10,d=t/10%10,e=t%10;
P1=0x00;
P0=getcode(a);coma=1;comb=0;delay();
P0=getcode(b);coma=0;comb=1;delay();
P0=getcode(c);comb=0;comc=1;delay();
P0=getcode(d);comc=0;comd=1;delay();
P0=getcode(e);comd=0;come=1;delay();
}
/ 键扫描函数 /
uchar keyscan(void)
{
uchar scancode,tmpcode;
P2 = 0xf0; // 发全0行扫描码
if ((P2&0xf0)!=0xf0) // 若有键按下
{
delay(); // 延时去抖动
if ((P2&0xf0)!=0xf0) // 延时后再判断一次,去除抖动影响
{
scancode = 0xfe;
while((scancode&0x10)!=0) // 逐行扫描
{
P2 = scancode; // 输出行扫描码
if ((P2&0xf0)!=0xf0) // 本行有键按下
{
tmpcode = (P2&0xf0)|0x0f;
/ 返回特征字节码,为1的位即对应于行和列 /
return((~scancode)+(~tmpcode));
}
else scancode = (scancode<<1)|0x01; // 行扫描码左移一位
}
}
}
return(0); // 无键按下,返回值为0
}
/////////////T0中断/////////
timer0 () interrupt 1
{
Q=~Q;
i=~i;
if(i)
{TL0=65536-(1000000/y(1-x/100))%256; ////输出低电平状态计数器所需溢出次数///
TH0=65536-(1000000/y(1-x/100))/256;}
else
{TL0=65536-(1000000/y(x/100))%256; ////输出高电平状态计数器所需溢出次数///
TH0=65536-(1000000/y(x/100))/256;}
}
///////////主函数///////////
main( )
{
int key,count,confirm;
Q=1;
TMOD=0x01;
EA=1;ET0=1;
while(1)
{TR0=1;red=1;
while(confirm<2)
{
key = keyscan(); // 调用键盘扫描函数
switch(key)
{case 0x11: if (count<=5) {x=10x;count++;} break; // 1行1列,数字0
case 0x21: if (count<=5) {x=10x+1;count++;} break;// 1行2列,数字1
case 0x41: if (count<=5) {x=10x+2;count++;} break;// 1行3列,数字2
case 0x81: if (count<=5) {x=10x+3;count++;} break;// 1行4列,数字3
case 0x12: if (count<=5) {x=10x+4;count++;} break;// 2行1列,数字4
case 0x22: if (count<=5) {x=10x+5;count++;}break; // 2行2列,数字5
case 0x42: if (count<=5) {x=10x+6;count++;} break;// 2行3列,数字6
case 0x82: if (count<=5) {x=10x+7;count++;} break;// 2行4列,数字7
case 0x14: if (count<=5) {x=10x+8;count++;} break;// 3行1列,数字8
case 0x24: if (count<=5) {x=10x+9;count++;} break;// 3行2列,数字9
case 0x44: if (count==5) {if(confirm==0)
{y=x;x=0;count=0;red=0;green=1;}confirm++;} break;// 3行3列,确认键
//输入完频率,按下确认键,再输入占空比
case 0x84: x=0;count=0; break; // 3行4列,取消键
default: break;
}
display(x);
}
TR0=1;
if(new==0)
{ delay();if(new==0){confirm=0;y=0;x=0;count=0;} }
}}
基于ICL8038函数信号发生器的设计本设计是以ICL8038 和AT89C2051 为核心设计的数控及扫频函数信号发生器。ICL8038 作为函数信号源
结合外围电路产生占空比和幅度可调的正弦波、方波、三角波; 该函数信号发生器的频率可调范围为1~100kHz, 步进为01kHz, 波形稳定, 无明显失真。
1系统设计框图如图1 为系统设计框图。本设计是利用键盘设置相应的频率值, 根据所设置频率段选择相应电容, 经计算获得相应数字量送数字电位器实现D/A 转换, 同时与参考电压( 本例为55V) 相加后形成数控调压去控制ICL8038 第8 脚, 这样即可由ICL8038 实现对应频率值的矩形波、三角波和正弦波。方波幅度经衰减后送单片机可测得信号源频率并由数码管显示。
2电路原理图
图2 为电路原理图。其中AT89C2051 是8 位单片机, 其中: P14~P17、P12、P13、P30、P31 作为数
码显示; P33、P35 、P37 作为键盘输入口; P34 作为计数口, 用于测量信号源频率;P30~P32 作为数字电位器的SPI总线; P11、P10 可根据需要扩展继电器或模拟开关选择ICL8038第10 脚( CAP) 与第11 脚间的电容C。
MCP41010 是8 位字长的数字电位器, 采用三总线SPI 接口。/CS: 片选信号, 低电平有效; SCK:时钟信号输入端; SI: 串行数据输入端, 用于寄存器的选择及数据输入。MCP41010 可作为数字电位器, 也可以作为D/A 转换器, 本设计是将MCP41010 接成8 位字长的D/A 转换器, MCP41010 根据输入的串行数据, 对基准电压进行分压后由中间抽头输出模拟电压, 即VPWO =DN/256VREF ( 式中VREF=5V) 。
函数发生电路ICL8038, 图2所示是一个占空比和一个频率连续可调的函数发生电路。ICL8038是一种函数发生器集成块, 通过外围电路的设计, 可以产生高精密度的正弦波、方波、三角波信号, 选择不同参数的外电阻和电容等器件, 可以获得频率在001Hz~300kHz 范围内的信号。通过调节RW2 可使占空比在2%~98%可调。第10 脚( CAP) 与第11 脚间的电容C 起到很重要的作用, 它的大小决定了输出信号频率的大小, 当C 确定后, 调节ICL8038 第8 脚的电压可改变信号源的输出频率。从ICL8038 引脚9(要接上拉电阻)输出的波形经衰减后送单片机P34 进行频率测量。
正弦函数信号由三角波函数信号经过非线性变换而获得。利用二极管的非线性特性, 可以将三角波信号的上升和下降斜率逐次逼近正弦波的斜率。ICL8038 中的非线性网络是由4 级击穿点的非线性逼近网络构成。一般说来, 逼近点越多得到的正弦波效果越好, 失真度也越小, 在本芯片中N= 4, 失真度可以小于1。在实测中得到正弦信号的失真度可达05 左右。其精度效果相当满意。为了进一步减小正弦波的失真度, 可采用图2 所示电路中两个电位器RW3 和RW4 所组成的电路, 调整它们可使正弦波失真度减小。当然, 如果矩形波的占空比不是50% , 矩形波不再是方波, 引脚2 输出也就不再是正弦波了。 图2 电路原理图
经实验发现, 在电路设计中接10 脚和11 脚的电容值和性能是整个电路的关键器件, 电容值的确定也就确定电路能产生的频率范围, 电容性能的好坏直接影响信号频率的稳定性、波形的失真度, 由于该芯片是通过恒流源
对C 充放电来产生振荡的, 故振荡频率的稳定性就受到外接电容及恒流源电流的影响, 若要使输出频率稳定, 必须采用以下措施:外接电阻、电容的温度特性要好; 外部电源应稳定; 电容应选用漏电小、质量好的非极化电容器。3实验结果
当±12V 工作电源时, 输出频率如下表: 失真度情况, 实验数据如下表: 4软件流程图
图3 为软件流程图。T0 设为计数器,T1 设为定时器(初值为5ms)。5ms 启动主循环, 主要用于键盘扫描及扫描显示, 图2 中K0 作为控制键, K1 作为调整键, K2 作为增加键; 上电时程序进入频率设置模式, 按一下K0 键程序进入数控模式, 按二下K0 键程序进入扫频模式, 按三下K0 键程序进入频率设置模式, 周而复始。在频率设置模式, 由K1 键和K2 键完成频率设置。 图3 软件流程图基于ICL8038的函数发生器函数发生器是一种可以同时产生方波、三角波和正弦波的专用集成电路。当调节外部电路参数时,还可以获得占空比可调的矩形波和锯齿波。因此,广泛用于仪表之中。一、电路结构函数发生器ICL8038的电路结构如图虚线框内所示,共有五个组成部分。两个电流源的电流分别为IS1和IS2,且IS1=I,IS2=2I;两个电压比较器Ⅰ和Ⅱ的阈值电压分别为 和 ,它们的输入电压等于电容两端的电压uC,输出电压分别控制RS触发器的S端和 端;RS触发器的状态输出端Q和 用来控制开关S,实现对电容C的充、放电;两个缓冲放大器用于隔离波形发生电路和负载,使三角波和矩形波输出端的输出电阻足够低,以增强带负载能力;三角波变正弦波电路用于获得正弦波电压。RS触发器是数字电路中具有存储功能的一种基本单元电路。Q和 是一对互补的状态输出端,当Q=1时, ;当Q=0时, 。S和 是两个输入端,当 时,Q=0时, ;反之,当 时,Q=1时, ;当S=0, 时,Q和 保持原状态不变。两个电压比较器的电压传输特性如下图所示。二、工作原理★当给函数发生器ICL8038合闸通电时,电容C的电压为0V,根据电压比较器的电压传输特性,电压比较器Ⅰ和Ⅱ的输出电压均为低电平;因而RS触发器的 ,输出Q=0, ;★使开关S断开,电流源IS1对电容充电,充电电流为IS1=I因充电电流是恒流,所以,电容上电压uC随时间的增长而线性上升。★当上升为VCC/3时,电压比较器Ⅱ输出为高电平,此时RS触发器的 ,S=0时,Q和 保持原状态不变。★一直到上升到2VCC/3时,使电压比较器Ⅰ的输出电压跃变为高电平,此时RS触发器的 时,Q=1时, ,导致开关S闭合,电容C开始放电,放电电流为IS2-IS1=I因放电电流是恒流,所以,电容上电压uC随时间的增长而线性下降。起初,uC的下降虽然使RS触发的S端从高电平跃变为低电平,但 ,其输出不变。★ 一直到uC下降到VCC/3时,使电压比较器Ⅱ的输出电压跃变为低电平,此时 ,Q=0, ,使得开关S断开,电容C又开始充电,重复上述过程,周而复始,电路产生了自激振荡。由于充电电流与放电电流数值相等,因而电容上电压为三角波,Q和 为方波,经缓冲放大器输出。三角波电压通过三角波变正弦波电路输出正弦波电压。结论:改变电容充放电电流,可以输出占空比可调的矩形波和锯齿波。但是,当输出不是方波时,输出也得不到正弦波了。三、性能特点ICL8038是性能优良的集成函数发生器。可用单电源供电,即将引脚11接地,引脚6接+VCC,VCC为10~30V;也可双电源供电,即将引脚11接-VEE,引脚6接+VCC,它们的值为±5~±15V。频率的可调范围为001Hz~300kHz。输出矩形波的占空比可调范围为2%~98%,上升时间为180ns,下降时间为40ns。输出三角波(斜坡波)的非线性小于005%。输出正弦波的失真小于1%。四、常用接法如图所示为ICL8038的引脚图,其中引脚8为频率调节(简称为调频)电压输入端,电路的振荡频率与调频电压成正比。引脚7输出调频偏置电压,数值是引脚7与电源+VCC之差,它可作为引脚8的输入电压。如图所示为ICL8038最常见的两种基本接法,矩形波输出端为集电极开路形式,需外接电阻RL至+VCC。在图(a)所示电路中,RA和RB可分别独立调整。在图(b)所示电路中,通过改变电位器RW滑动的位置来调整RA和RB的数值。当RA=RB时,各输出端的波形如下图(a)所示,矩形波的占空比为50%,因而为方波。当RA≠RB时,矩形波不再是方波,引脚2输出也就不再是正弦波了,图(b)所示为矩形波占空比是15%时各输出端的波形图。根据ICL8038内部电路和外接电阻可以推导出占空比的表达式为故RA<2RB。 为了进一步减小正弦波的失真度,可采用如下图所示电路中两个100kΩ的电位器和两个10kΩ电阻所组成的电路,调整它们可使正弦波失真度减小到05%。在RA和RB不变的情况下,调整RW2可使电路振荡频率最大值与最小值之比达到100:1。在引脚8与引脚6之间直接加输入电压调节振荡频率,最高频率与最低频率之差可达1000:1。
这个不难吧。第一种方案:在单片机里面构造各种波形的数据表,然后用数组来保存。单片机控制给DA的数据的时间间隔就可以控制输出的频率了,为了得到比较精确的频率,可以用定时器控制数据的输出频率啦。幅度的调节可以用双DA来做啊,也就是用另外一块DA来控制数据转换DA的基准电压。第二种方案:用单片机控制DDS芯片啊,比如用单片机控制AD9834,可以产生正弦波、方波、三角波,频率的调节就更简单了。幅度的调节也可以用双DA来实现,也可以先用电阻衰减再用运放放大,这样幅度就可以连续可调了。电路图和程序你确定了方案就可以很容易搞定了,实在不行再联系我吧
函数(波形)信号发生器。能产生某些特定的周期性时间函数波形(正弦波、方波、三角波、锯齿波和脉冲波等)信号,频率范围可从几个微赫到几十兆赫函数信号发生器在电路实验和设备检测中具有十分广泛的用途。例如在通信、广播、电视系统中,都需要射频(高频)发射,这里的射频波就是载波,把音频(低频)、视频信号或脉冲信号运载出去,就需要能够产生高频的振荡器。除供通信、仪表和自动控制系统测试用外,还广泛用于其他非电测量领域。
电子线路中的电流源、电压源一般是为电子器件提供能量的,也就是说器件要想工作必须为它提供电能。
区别就是虽然它们都以电的形式出现,但前者提供的是电信号,后者只是提供电能。
归根到底就是使用单片机控制送给DAC的数据:
矩形波——从0电平直接跳变至最高电平,再直接跳变至0电平;
三角波——从0电平等量递增至最高电平,再等量递减至0电平;
锯齿波——从0电平递增至高电平,再递减至0电平,且递增和递减量阶不等;
幅值就是最高电平,周期就是变化时间。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)