① 基于单片机信号发生器设计重点研究问题是什么
利用单片机做信号发生器,其重点就是单片机的主频啦
因为主频代表着程序运行的时间,这个时间是完成一次程序的从头到尾单片机内部所需的时间,而运行一次只能输出一种端口状态,那么需要方波输出,则需要单片机运行两次才能真正输出一个方波信号,所以主频才是重中之重。
另外还有程序的整体步数,就是程序的长度或多少,程序语句越多,运行速度也越慢,输出的信号频率也越低
例如想做一个1MHz的方波发生器,那么51单片机的最高主频是12MHz,然而真正输出的最高只能达到12分之一,那就是1MHz,勉勉强强算是可以
如果超过1MHz的波形,51类单片机是达不到效果了,只能选择其它单片机
下面是本人曾经利用单片机做的PMW信号发生器程序,仅供参考
/***************************************************************************/
#include<reg51.h>//频率约为 2.37 KHz
//根据按键来控制输出波形
sbit D=P2^0 ; //端口定义
int h,m,s,f;
/***************************************************************************/
void main(void)
{
TMOD=0x22; EA=1; ET0=1; ET1=1; TR0=1;//定时器初始化
while(1)
{
switch(P0)
{
case 0xfe : h=1; break;
case 0xfd : h=2; break;
case 0xfb : h=3; break;
case 0xf7 : h=4; break;
case 0xef : h=5; break;
case 0xdf : h=6; break;
case 0xbf : h=7; break;
case 0x7f : h=8; break;
default : h=9; break;
}
m=10-h;
}
}
/***************************************************************************/
void int0() interrupt 1 //定时器 0 中断
{
TH0=0xff; s++;
if(s>=h){ TR0=0; TR1=1; D=0; s=0; }//开始时间
}
/***************************************************************************
/void int1() interrupt 3 //定时器 1 中断
{
TH1=0xff; s++;
if(s>=m){ TR1=0; TR0=1; D=1; s=0; }//休止时间
}
/***************************************************************************/
② 51单片机做信号发生器,怎样才能提高频率
罗辑混乱,定时器只定时0.1us,而向DAC传送数据要花时间远大于0.1us.
应该定时时间大于DAC(sin[i])的时间。
理论上可产生几百HZ的正弦波。
一次转换需12.5us,假设20US更新一次,把一个正弦波分成256份。
那么产生的正弦波频率可达195HZ。
③ 利用89C51单片机设计多功能低频函数信号发生器,能产生方波、正弦波、三角波等信号波形,信号的频率、幅度
这个不难吧。第一种方案:在单片机里面构造各种波形的数据表,然后用数组来保码悉帆存。单片机控制给DA的数据的时间间隔就可以控制输出的频率了,为了得到比较精确的频率,可以用定时器控制数据的输出频率啦。幅度的调节可迟雹以用双DA来做啊,也就是用另外一块DA来控制数据转换DA的基准电压。第二种方案:用单陆液片机控制DDS芯片啊,比如用单片机控制AD9834,可以产生正弦波、方波、三角波,频率的调节就更简单了。幅度的调节也可以用双DA来实现,也可以先用电阻衰减再用运放放大,这样幅度就可以连续可调了。电路图和程序你确定了方案就可以很容易搞定了,实在不行再联系我吧
④ 基于单片机的信号发生器的设计,输出方波,正弦波,三角波,锯齿波,频率可调。原理是如何哒怎么取点
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模块,可配置成定时翻转模式,比较方便~
锯齿波是不是和方波类似啊?
⑤ 急求!!!在c51单片机上的三角波信号发生器,求原理图与c程序代码.
**************************************/
/* 信号发生器 (正弦波,方波,三角波)
*/
/*************************************/ #include<reg52.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int
sbit cs=P2^0; //tlc5615片选端口 sbit clk=P2^1; //tlc5615时钟线 sbit din=P2^2;
//tlc5615传输端口
sbit key1=P1^0; sbit key2=P1^1;
//按键的单片机接口
uchar keydat;
uchar flag;
//波形发生终止信号的标志位 一旦
被置零立马停止发信号
uchar flagsqu; //方波高低电平控制为(运用定时器1
中断控制)
uchar m,num; uchar dat=0xff;
uchar code tosin[141]={ //正弦波的编码
0x00,0x01,0x02,0x02,0x03,0x04,0x05,0x06,0x07,0x08, 0x09,0x0a,0x0b,0x0d,0x0e,0x10,0x11,0x13,0x15,0x16,<a href="http://www.jsykyy.com/" target="_blank">涂料加盟</a>0x18,0x1a,0x1c,0x1e,0x20,0x22,0x25,0x27,0x29,0x2b, 0x2e,0x30,0x33,0x35,0x38,0x3a,0x3d,0x40,0x43,0x45, 0x48,0x4c,0x4e,0x51,0x55,0x57,0x5a,0x5d,0x60,0x63, 0x66,0x69,0x6c,0x6f,0x70,0x71,0x72,0x73,0x74,0x75, 0x76,0x77,0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x7e,0x7e, 0x7f,0x80,0x7f,0x7e,0x7e,0x7d,0x7c,0x7b,0x7a,0x79, 0x78,0x77,0x76,0x75,0x74,0x73,0x72,0x6f,0x6c,0x69, 0x66,0x63,0x60,0x5d,0x5a,0x57,0x55,0x51,0x4e,0x4c, 0x48,0x45,0x43,0x40,0x3d,0x3a,0x38,0x35,0x33,0x30, 0x2e,0x2b,0x29,0x27,0x25,0x22,0x20,0x1e,0x1c,0x1a, 0x18,0x16,0x15,0x13,0x11,0x10,0x0e,0x0d,0x0b,0x0a, 0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x02,0x01,
0x00};