导航:首页 > 操作系统 > 基于单片机的函数信号发生器设计

基于单片机的函数信号发生器设计

发布时间:2023-03-24 06:00:48

Ⅰ 设计和制作一函数信号发生器

基于ICL8038函数信号发生器的设计本设计是以ICL8038 和AT89C2051 为核心设计的数控及扫频函数信号发生器。ICL8038 作为函数信号源
结合外围电路产生占空比和幅度可调的正弦波、方波、三角波; 该函数信号发生器的频率可调范围为1~100kHz, 步进为0.1kHz, 波形稳定, 无明显失真。
1.系统设计框图如图1 为系统设计框图。本设计是利用键盘设置相应的频率值, 根据所设置频率段选择相应电容, 经计算获得相应数字量送数字电位器实现D/A 转换, 同时与参考电压( 本例为5.5V) 相加后形成数控调压去控制ICL8038 第8 脚, 这样即可由ICL8038 实现对应频率值的矩形波、三角波和正弦波。方波幅度经衰减后送单片机可测得信号源频率并由数码管显示。
2.电路原理图
图2 为电路原理图。其中AT89C2051 是8 位单片机, 其中: P1.4~P1.7、P1.2、P1.3、P3.0、P3.1 作为数
码显示; P3.3、P3.5 、P3.7 作为键盘输入口; P3.4 作为计数口, 用于测量信号源频率;P3.0~P3.2 作为数字电位器的SPI总线; P1.1、P1.0 可根据需要扩展继电器或模拟开关选择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是一种函数发生器集成块, 通过外围电路的设计, 可以产生高精密度的正弦波、方波、三角波信号, 选择不同参数的外电阻和电容等器件, 可以获得频率在0.01Hz~300kHz 范围内的信号。通过调节RW2 可使占空比在2%~98%可调。第10 脚( CAP) 与第11 脚间的电容C 起到很重要的作用, 它的大小决定了输出信号频率的瞎搭大小, 当C 确定后, 调节ICL8038 第8 脚的电压可改变信号源的输出频率。从ICL8038 引脚9(要接上拉电阻)输出的波形经衰减后送单片机P3.4 进行频率测量。
正弦函数信号由三角波函数信号经过非线性变换而获得。利用二极管的非线性特性, 可以将三角波信号的上升和下降斜率逐次逼近正弦波的斜率。ICL8038 中的非线性网络是由4 级击穿点的非线性逼近网络构成。一般说来, 逼近点越多得到的正弦波效果越好, 失真度也越小, 在本芯片中N= 4, 失真度可以小于1。在实测中得到正弦信号的失真度可达0.5 左右。其精度效果相当满意。为了进一步减小正弦波的失真度, 可采用图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。频率的可调范围为0.01Hz~300kHz。输出矩形波的占空比可调范围为2%~98%,上升时间为180ns,下降时间为40ns。输出三角波(斜坡波)的非线性小于0.05%。输出正弦波的失真小于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Ω电阻所组成的电路,调整它们可使正弦波失真度减小到0.5%。在RA和RB不变的情况下,调整RW2可使电路振荡频率最大值与最小值之比达到100:1。在引脚8与引脚6之间直接加输入电压调节振荡频率,最高频率与最低频率之差可达1000:1。

Ⅱ 求一个正确的基于51单片机的函数信号发生器的C程序

#include<reg51.h>
#include<absacc.h>
#include<MAX72191.h>
#defineDAC XBYTE[0x7fff] //P2.7接CS

sbitkey0 = P3^2;// 增减切换键
sbitkey1 = P3^3;//个位,十位,百位,千位的控制切换
sbitkey2 = P3^4;// 调整位
sbitkey3 = P3^5;// 波形选择正弦、三角、矩形波,锯齿波

unsignedchar i,j;
unsignedint counter,step,flag;
typedefunsigned int uint;
//定时器0初始化
voidInit_Timer0(void)
{
TMOD = (TMOD & 0XF0) | 0X01;//设置工作方式和定时初始值
TH0 = 0xff;
TL0 = 0x00;
TR0 =1; //启动定时器
ET0 =1;
}
//定义输出波形的代码
unsignedchar code type[4][256]={
{ //正弦波代码
0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x1, 0x1, 0x2, 0x3, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8,
0x9, 0xb,0xc, 0xd, 0xf, 0x10,0x12,0x13,0x15,0x17,0x19,0x1b,0x1d,0x1f,0x21,0x23,
0x25,0x27,0x2a,0x2c,0x2e,0x31,0x33,0x36,0x39,0x3b,0x3e,0x41,0x43,0x46,0x49,0x4c,
0x4f,0x52,0x55,0x58,0x5b,0x5e,0x61,0x64,0x67,0x6a,0x6d,0x70,0x73,0x76,0x7a,0x7d,
0x80,0x83,0x86,0x89,0x8c,0x8f,0x93,0x96,0x99,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae,
0xb1,0xb4,0xb6,0xb9,0xbc,0xbf,0xc1,0xc4,0xc7,0xc9,0xcc,0xce,0xd1,0xd3,0xd5,0xd8,
0xda,0xdc,0xde,0xe0,0xe2,0xe4,0xe6,0xe8,0xea,0xeb,0xed,0xef,0xf0,0xf1,0xf3,0xf4,
0xf5,0xf6,0xf8,0xf9,0xf9,0xfa,0xfb,0xfc,0xfc,0xfd,0xfd,0xfe,0xfe,0xfe,0xfe,0xfe,
0xfe,0xfe,0xfe,0xfe,0xfe,0xfd,0xfd,0xfc,0xfc,0xfb,0xfa,0xf9,0xf9,0xf8,0xf6,0xf5,
0xf4,0xf3,0xf1,0xf0,0xef,0xed,0xeb,0xea,0xe8,0xe6,0xe4,0xe2,0xe0,0xde,0xdc,0xda,
0xd8,0xd5,0xd3,0xd1,0xce,0xcc,0xc9,0xc7,0xc4,0xc1,0xbf,0xbc,0xb9,0xb6,0xb4,0xb1,
0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x99,0x96,0x93,0x8f,0x8c,0x89,0x86,0x83,0x80,
0x7d,0x7a,0x76,0x73,0x70,0x6d,0x6a,0x67,0x64,0x61,0x5e,0x5b,0x58,0x55,0x52,0x4f,
0x4c,0x49,0x46,0x43,0x41,0x3e,0x3b,0x39,0x36,0x33,0x31,0x2e,0x2c,0x2a,0x27,0x25,
0x23,0x21,0x1f,0x1d,0x1b,0x19,0x17,0x15,0x13,0x12,0x10,0xf,0xd, 0xc, 0xb, 0x9,
0x8,0x7, 0x6, 0x5, 0x4, 0x3, 0x3, 0x2, 0x1, 0x1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
},
{ //三角波代码
0x2,0x4, 0x6, 0x8, 0xa, 0xc, 0xe, 0x10,0x12,0x14, 0x16, 0x18, 0x1a,0x1c, 0x1e, 0x20,
0x22,0x24, 0x26, 0x28, 0x2a, 0x2c, 0x2e, 0x30,0x32, 0x34, 0x36, 0x38, 0x3a, 0x3c, 0x3e, 0x40,
0x42,0x44, 0x46, 0x48, 0x4a, 0x4c, 0x4e, 0x50,0x52, 0x54, 0x56, 0x58, 0x5a, 0x5c, 0x5e, 0x60,
0x62,0x64, 0x66, 0x68, 0x6a, 0x6c, 0x6e, 0x70,0x72, 0x74, 0x76, 0x78, 0x7a, 0x7c, 0x7e, 0x80,
0x82,0x84, 0x86, 0x88, 0x8a, 0x8c, 0x8e, 0x90,0x92, 0x94, 0x96, 0x98, 0x9a, 0x9c, 0x9e, 0xa0,
0xa2,0xa4, 0xa6, 0xa8, 0xaa, 0xac, 0xae, 0xb0,0xb2, 0xb4, 0xb6, 0xb8, 0xba, 0xbc,0xbe, 0xc0,
0xc2,0xc4, 0xc6, 0xc8, 0xca, 0xcc, 0xce, 0xd0,0xd2, 0xd4, 0xd6, 0xd8, 0xda, 0xdc,0xde, 0xe0,
0xe2,0xe4, 0xe6, 0xe8, 0xea, 0xec, 0xee, 0xf0,0xf2, 0xf4, 0xf6, 0xf8, 0xfa, 0xfc,0xfe, 0xff,
0xfe,0xfc, 0xfa, 0xf8, 0xf6, 0xf4, 0xf2, 0xf0,0xee, 0xec, 0xea, 0xe8, 0xe6, 0xe4,0xe2, 0xe0,
0xde,0xdc, 0xda, 0xd8, 0xd6, 0xd4, 0xd2, 0xd0,0xce, 0xcc, 0xca, 0xc8, 0xc6, 0xc4,0xc2, 0xc0,
0xbe,0xbc, 0xba, 0xb8, 0xb6, 0xb4, 0xb2, 0xb0,0xae, 0xac, 0xaa, 0xa8, 0xa6, 0xa4,0xa2, 0xa0,
0x9e, 0x9c, 0x9a, 0x98, 0x96, 0x94, 0x92, 0x90,0x8e, 0x8c, 0x8a, 0x88, 0x86, 0x84, 0x82, 0x80,
0x7e, 0x7c, 0x7a, 0x78, 0x76, 0x74, 0x72, 0x70,0x6e, 0x6c, 0x6a, 0x68, 0x66, 0x64, 0x62, 0x60,
0x5e, 0x5c, 0x5a, 0x58, 0x56, 0x54, 0x52, 0x50,0x4e, 0x4c, 0x4a, 0x48, 0x46, 0x44, 0x42, 0x40,
0x3e, 0x3c, 0x3a, 0x38, 0x36, 0x34, 0x32, 0x30,0x2e, 0x2c, 0x2a, 0x28, 0x26, 0x24, 0x22, 0x20,
0x1e, 0x1c, 0x1a, 0x18, 0x16, 0x14, 0x12, 0x10,0xe, 0xc, 0xa, 0x8, 0x6, 0x4, 0x2, 0x00
},
{// 矩形脉冲波代码
0xff,0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,0xff, 0xff, 0xff, 0xff, 0xff, 0xff,0xff, 0xff,
0xff,0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,0xff, 0xff, 0xff, 0xff, 0xff, 0xff,0xff, 0xff,
0xff,0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,0xff, 0xff, 0xff, 0xff, 0xff, 0xff,0xff, 0xff,
0xff,0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,0xff, 0xff, 0xff, 0xff, 0xff, 0xff,0xff, 0xff,
0xff,0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,0xff, 0xff, 0xff, 0xff, 0xff, 0xff,0xff, 0xff,
0xff,0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,0xff, 0xff, 0xff, 0xff, 0xff, 0xff,0xff, 0xff,
0xff,0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,0xff, 0xff, 0xff, 0xff, 0xff, 0xff,0xff, 0xff,
0xff,0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,0xff, 0xff, 0xff, 0xff, 0xff, 0xff,0xff, 0xff,
0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00,
0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00,
0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00,
0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00,
0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00,
0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00,
0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00,
0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00,
},
{//锯齿波代码
0x00,0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,0x08,0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
0x10,0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,0x18,0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
0x20,0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,0x28,0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
0x30,0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,0x38,0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
0x40,0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,0x48,0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
0x50,0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,0x58,0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
0x60,0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,0x68,0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
0x70,0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,0x78,0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
0x80,0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,0x88,0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
0x90,0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,0x98,0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
0xa0,0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,0xa8,0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
0xb0,0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,0xb8,0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
0xc0,0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,0xc8,0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
0xd0,0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,0xd8,0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
0xe0,0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,0xe8,0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
0xf0,0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,0xf8,0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff}
};

//显示子函数
Disp7219(unsignedlong dat)
{
unsigned char i;
unsigned char led[8];

led[7]=dat%10;
led[6]=dat/10%10;
led[5]=dat/100%10;
led[4]=dat/1000%10;
led[3]=dat/10000%10;
led[2]=dat/100000%10;
led[1]=dat/1000000%10;
led[0]=dat/10000000%10;

for(i=0;i<8;i++)
{
max_7219(i+1, led[i]);
}
}

//延时约1m秒
voiddelay_ms(uint n)
{
uchar j;
while(n--)
for(j=0;j<120;j++);
}

//主函数
main()
{
unsigned int f,n,j;
delay_ms(500);
Init_Max7219();//初始化7219
Disp7219(000);
Init_Timer0();
step=18;
EA = 1;
while(1)
{
if(key0 == 0) n=n+1;
if(n==2)n=0;
if(key1==0) j=j+1;
if(j==4) j=0;
if(n==0 && j == 0 &&key2 == 0) if(step<180) step+=18; //个位增
if(n==1 && j == 0 &&key2 == 0) if(step>18) step-=18; //个位减

if(n==0 && j == 1 &&key2 == 0) if(step<1800) step+=180;//十位增
if(n==1 && j == 1 &&key2 == 0) if(step>180) step-=180; //十位减

if(n==0 && j == 2 &&key2 == 0) if(step<18000) step+=1800;//百位增
if(n==1 && j == 2 &&key2 == 0) if(step>1800) step-=1800;//百位减

if(n==0 && j == 3 &&key2 == 0) if(step<54000) step+=18000;//千位增
if(n==1 && j == 3 &&key2 == 0) if(step>18000) step-=18000;//千位减

if(key3==0)flag=flag+1;if(flag==4)flag=0;

while((!key0)||(!key1)||(!key2)||(!key3));
f=step/18;
Disp7219(f);}//显示频率
}

// 定时中断服务
voidTimer0(void) interrupt 1 using 2
{
TH0 = 0xff;
TL0 = 0x00;
counter = counter + step;
DAC=type[flag][(unsignedint)counter>>8];
}

Ⅲ 基于单片机的信号发生器的设计,输出方波,正弦波,三角波,锯齿波,频率可调。原理是如何哒怎么取点

51单片机硬件有PCA模块的,或者是PWM发生器的型号,也有没有的,你采用的芯片有没有这些硬件?
正弦波:
如果有,以PCA模块为例,可以作为DA使用,使用前根据datasheet配置好PCA。在51头文件中有math.h,里面有sin(X)函数,可以在程序中直接使用,使用前在主函数重要包含math.H这个文件。然后每个点采样输出即可,频率可调可以通过不同方法实现,如果是要做信号发生器,推荐使用一个电位器,通过AD采集电压,将采集值作为你输出函数的系数即可,亦可以通过串口发送指令等方式实现,前提要在使用前将AD或者串口配置好。
如果没有硬件模块,也可以用普通IO口模拟,思路如下,经过y=sinx函数求得的结果,经过算法转化成二进制(主要是将小数转化成二进制的算法),推荐转化成8的整数倍位,比如8位二进制或者16位二进制。转化结束后将结果给IO口输出即可,频率也可采取上述方法设定。
三角波:
如果有DA,将DA的输入值按一定时间自增,到达峰值后按一定时间自减。前文中的“一定时间”设定的足够小,可以近似认为是三角波。三角波输出频率就是周期,在具体到操作层面时,可以将输出函数前加上一个时间系数,还是通过调节正弦波的频率的方式调节。
木有DA···还是和正弦波类似,通过算法将输出值转化成二进制,然后送给IO口
方波:
这个最简单,将IO口定时切换高低电平即可,你定的时间就将成为你输出的频率。
如果有PCA模块,可配置成定时翻转模式,比较方便~
锯齿波是不是和方波类似啊?

Ⅳ 基于单片机、ADC0832信号发生器设计

智能函数发生器设计
设计的要求如下
设计要求
1. 信号频率范围1HZ~100kHZ;
2. 输出波形应有: 方波、三角形、正弦波;
3. 输出信号幅值范围0~10V;
4. 具有数字显示输出信号频率和电压幅值功能。
第一章 方案设计与论证
方案一:本方案直接采用凌阳SPCE061A作为波形发生器。波形的具体产生是通过两路DAC来产生,凌阳SPCE061A在这方面的设计为我们提供了极大的方便,用它实现的好处在于,外围电路极其简单,另外在DAC的编程方面又提供及其便利的编程环境。外围电路的设计包括三大部分,第一是键盘控制电路的设计,这里采用4*4键盘,由IOA的低八位进行控制,把键盘上的行和列分别接在IOA0~IOA3和IOA4~IOA7上,采用外部中断二来中断所显示波形,以便进入下一波形的编辑和输出,在波形输出的同时利用外部中断一来实现同步的频率调节。第二是显示电路的设计,这里为了在波形输出依然有显示,由于单片机的局限性这里采用通常的动态LED显示行不通,因为波形输出时要求CPU不停地为其服务而没有空闲来为LED进行不停更新,解决方案是采用带数据缓存器和驱动的LCD来提供显示,这样只占用八个I/O口即可完成设计要求,也可放弃适时显示功能采用LED显示,这里将提供两种显示方案。第三是滤波和电压转换电路的设计,滤波采用低通滤波器,滤除DAC转换过程中形成的高频小锯齿波。另外由于凌阳SPCE061A单片机DAC输出为电流输出,为满足达到5V的电压输出,外接OP07运算放大器进行放大,加1千欧姆电阻进行电流信号到电压信号的转换。本设计的特点是全面采用数字电路方案,因而工作稳定可靠。利用单片机控制管理,使频率设置和占空比调整等操作可用键盘输入,十分方便.由于方案中涉及到SPCE061A单片机现简介如下:
SPCE061A单片机概述
SPCE061A是继u'nSP系列产品SPCE500A等之后凌阳科技推出的又一个16位结构的微控制器。目前有两种封装形式:84引脚的PLCC84封装和80引脚的LQFP80贴片封装。主要性能如下:
16位m’nSP微处理器;
工作电压:VDD为2.4~3.6V(cpu), VDDH为2.4~5.5V(I/O);
CPU时钟:32768Hz~49.152MHz ;
内置2K字SRAM、内置32K FLASH;
可编程音频处理;
32位通用可编程输入/输出端口;
32768Hz实时时钟,锁相环PLL振荡器提供系统时钟信号;
2个16位可编程定时器/计数器(可自动预置初始计数值);
2个10位DAC(数-模转换)输出通道;
7通道10位电压模-数转换器(ADC)和单通道语音模-数转换器;
声音模-数转换器输入通道内置麦克风放大器自动增益控制(AGC)功能;
系统处于备用状态下(时钟处于停止状态)耗电小于[email protected]
具备触键唤醒的功能;
14个中断源:定时器A / B,2个外部时钟源输入,时基,键唤醒等;
使用凌阳音频编码SACM_S240方式(2.4K位/秒),能容纳210秒的语音数据;
具备异步、同步串行设备接口;
具有低电压复位(LVR)功能和低电压监测(LVD)功能;
内置在线仿真电路接口ICE(In- Circuit Emulator);
具有保密能力;
具有WatchDog功能(由具体型号决定)

Ⅳ 单片机函数信号发生器

DAC0832可以的,但是速度比较慢,如果信号频率比好基较高的话友槐谨建议用高速DAC,另外DA出来的波形是“阶梯”明滑状的,所以后面建议加一个低通滤波器

Ⅵ 怎么用单片机做一个信号发生器

如果要求频率不是很高,可以采用PWM方式,优点是无需另外加DA,且输出分辨率可灵活调整。考虑到单片机的运算能力不强,你可以用EXCEL编制一个正弦信号在一个周期内的等间隔幅值表,比如说,将一个周期的正弦信号分为64个点,信号的峰值为1000,初始相位为0°,那么,这个表格的第一个点是0,第n点为1000*sin(2πn/64),用EXCEL将64个点的幅值计算完毕,按照需要的格式编制为编程语言能够接受的表格。利用单片机的一个定时器,定时器的溢出值设置为1000,溢出时,某个IO口输出低电平,再用一个寄存器存储输出点序号,序号为n时,根据输出点序号通过查表获取1000*sin(2πn/64)的数值,将定时器的计数值与1000*sin(2πn/64)比较,相等时,IO口输出高电平。不断循环执行上述程序,IO将输出占空比与正弦信号幅值成正比的方波信号,这就是常说的正弦调制PWM信号。设计一个增益可调的有源低通滤波器,PWM信号经过低通滤波器后,输出就是正弦波,调节低通滤波器的增益,即可改变正弦信号的幅值。当然,在设置PWM占空比时,将查表结果先乘以一个设定数值(一般是0~1的小数),也可以调节输出幅值。为了简化运算,可以是先乘以一个整数M,再除以N(N为128、256等2的幂的数值),M取值范围为0~N,因为这种除法可通过移位进行,程序简单,且运算速度快。

阅读全文

与基于单片机的函数信号发生器设计相关的资料

热点内容
ctcpip编程 浏览:520
java统计字符串次数 浏览:254
中兴交换机zxr10vlan配置命令 浏览:829
java面试spring 浏览:145
得物程序员加班厉害吗 浏览:958
h1z1东京服务器地址 浏览:397
海贼王一番赏文件夹什么样 浏览:847
24bit高频精品解压音乐 浏览:181
api程序员遇到更新 浏览:298
程序员程序运行搞笑图 浏览:772
秦思怎么下载app 浏览:691
发抖音怎么发自己的APP网站 浏览:362
androidinbitmap 浏览:774
lzma源码使用 浏览:748
ibm服务器湖南经销商云服务器 浏览:991
正规模板建站配云服务器商家 浏览:876
安卓清楚缓存命令 浏览:380
汽车压缩机电磁离合器损坏怎么修 浏览:508
怎么提取安卓软件 浏览:597
单片机和主机高速传文件 浏览:480