c8051单片机模拟dds信号发生器

上传人:优*** 文档编号:49926552 上传时间:2022-01-19 格式:DOC 页数:8 大小:606KB
收藏 版权申诉 举报 下载
c8051单片机模拟dds信号发生器_第1页
第1页 / 共8页
c8051单片机模拟dds信号发生器_第2页
第2页 / 共8页
c8051单片机模拟dds信号发生器_第3页
第3页 / 共8页
资源描述:

《c8051单片机模拟dds信号发生器》由会员分享,可在线阅读,更多相关《c8051单片机模拟dds信号发生器(8页珍藏版)》请在装配图网上搜索。

1、真诚为您提供优质参考资料,若有不当之处,请指正。单片机模拟dds信号发生器一、 信号发生器原理信号发生器就是能够产生如正弦信号,三角波信号及锯齿波信号的装置。在模拟电路中可以用运放、电阻和电容来搭建。数字电路中需要DA转换。这里主要讨论数字方式产生信号,并且以正弦信号为列来讲解。首先,需要一个均匀采样一个正弦周期的数据,通常将这个数据表固化在ROM中,网上有这种软件,可以直接生成数据表。然后,在程序中不断的将这个数据表中的数据顺序送出,就可以产生正弦信号。如图1所示。实际单片机送出的数据为红色的圆点,圆点的包络就是一个正弦信号,当然DAC输出后用低通滤波器滤波后效果会更好。图1 信号发生器原理

2、示意图二、 简易信号发生器根据上面叙述的原理,在设计的时候用定时器给DAC送数据,那么DAC输出的数据就是一个正弦信号。采用定时器2启动DAC0来产生信号。定时器2初始化产生溢出时间为50us(频率为20kHz),也就是说每隔50us会向DAC写入一个数据。由此可以计算出频率最小(当256个点都写入到DAC时,程序中变量step为1)为1/(50us*256)=78.125Hz;最大频率(只有两个点输入DAC中,程序中变量step为127)为10Khz,但是此时输出就是一个方波信号了。而且频率调整的时候只能是78.125Hz的倍数。三、 简易信号发生器的问题及缺陷上面简易信号发生器有很多不完善

3、的地方:、频率范围比较小(78.125Hz10kHz);、频率调整只能是78.125Hz的倍数,不能实现连续调整;、对于有按键输入的系统,不能实现任意频率信号的输出。为了能增加频率,只能缩短定时器溢出时间,但是不能太小,要保证能大于中断函数中代码执行的时间。为了能进一步减小频率,可以有两种方法:一是延长定时器中断溢出时间;二是在向DAC输出数据的时候,将一个数据重复写入DAC中(可以理解为步进值step为负数)。如果采用第一种方法,那么在频率调整的时候需要调整两个参数,即步进值step和中断初值,这种方法对于精确调整频率是很难实现的,因此,我们需要调整一个参数就能实现频率的精确调整。通常为了计

4、算方便,中断溢出的时间是一定的,调整的参数是步进值step。前面说到,要进一步减小频率,需要进一步减小步进值,但是最小也只能为1,那么如何做到进一步减小步进值呢?这就需要DDS的原理。四、 DDS原理简单介绍DDS原理如图2所示。在上面讨论中,希望步进值可以更小,实际上DDS原理就是一种能够使得步进值可以更小的算法。图2 DDS原理框图假设时钟为2MHz,数据保持寄存器选择N Bit,在时钟驱动下,累加器输出结果S被反馈到累加器输入端B,B和A的数据被累加到S,下一个时钟脉冲又将S反馈到B,再次与A累加到S,下一个时钟脉冲又将S反馈到B,如此循环累加,实现按步进值,按时钟节拍循环累加,使得N

5、Bit数据被徐循环累加。完成一次地址循环需要的时间由时钟和步进值决定,可以由公式计算:当晶振(2M)和计数器Bit数N确定之后,fout即与K成正比,对K的调整可以完成对fout的设定,当N足够大时,比例常数可以很小,例如0.01,即fout等于K的0.01倍,这样就可以实现对fout的精细调整,譬如0.01Hz。五、 单片机编程实现DDS用单片机模拟DDS的程序其实很简单,主要就是在中断函数中对DAC写数据就可以了,具体程序如下:void timer2_isr(void) interrupt 5TF2 = 0; /清除中断标志位,定时器2的中断标志位必须用软件清零counter = coun

6、ter + step; /累加器累累加DAC0L=sin_data(unsigned char)(counter8);/取出累加器的高8位作为偏移量DAC0H = sin_data(unsigned char)(counter8)8;定时器2配置为16位自动重载方式,初值设定函数如下:CKCON = 0x78; /将定时器0、1、2、4的时钟选择为系统时钟24M 不分频T2CON = 0x00; /将定时器2配置为16位自动装载定时模式TH2 = 0xfe;/装初始值,在24M时钟下,中断时间为15.25uSTL2 = 0x92;/装初始值RCAP2H = 0xfe;/重载寄存器高位初始值RC

7、AP2L = 0x92;/重载寄存器地位初始值ET2 = 1; /允许定时器2中断EA = 1; /中断总允许TR2 = 1; /启动定时器2下面主要讨论下计算问题:为了设计简单,在调整步进值step的时候设计为当step为1的时候输出信号频率为1Hz。由上面的公式fout=fc*K/2n,式中的K=step/2m (m为累加器位数的一半),fc为定时器溢出频率,n为量化值的个数,在程序中m和n都为8。现在要做的工作是:已知step=1,输出频率fout =1Hz,求定时器溢出频率fc。 按照上面的公式很容易就可以计算出定时器溢出频率fc为65.536KHz,周期为15.258us。然后可以计

8、算出定时器的初值为0xfe92。实际计算的时候将会出现小数,即使四舍五入后也会有一定的误差,下面计算这个误差:已知定时器初值为0xfe92,定时器工作时钟频率为24M,step=1,计算输出频率。还是由上面的公式可以计算出,当step=1的时候,输出频率为1.000576Hz。也就是说误差为0.000576Hz。定时器实际溢出频率也可以计算出为65573.77Hz。通过设计step的值,计算出了定时器的溢出频率,但是有两个问题需要考虑,一是DAC0两次写入数据时间间隔能否小于15.258us;二是中断函数执行时间是否小于15.258us。对于第一个问题,可以查询数据手册,手册中给出DAC0输出

9、稳定的时间为10us,是小于15.258us的。对于第二个问题,定时器溢出时间需要满足下面的公式:定时器溢出时间 DAC0输出稳定时间 + 中断函数执行时间。DAC0输出稳定时间为10us,那么就需要知道中断函数执行的时间。由于C语言不能精确计算函数运行时间,但是还是有办法知道中断函数执行的时间的,可以查看编译后的汇编文件,并查询数据手册中的指令执行的时间,如下所示:C:0x0536 C0E0 PUSH ACC(0xE0) 2个时钟周期C:0x0538 C0F0 PUSH B(0xF0) 2个时钟周期C:0x053A C083 PUSH DPH(0x83) 2个时钟周期C:0x053C C08

10、2 PUSH DPL(0x82) 2个时钟周期C:0x053E C0D0 PUSH PSW(0xD0) 2个时钟周期C:0x0540 75D000 MOV PSW(0xD0),#0x00 2个时钟周期C:0x0543 C006 PUSH 0x06 2个时钟周期 59: TF2 = 0;/清除中断标志位 C:0x0545 C2CF CLR TF2(0xC8.7) 1个时钟周期 61: counter = counter + step; C:0x0547 E513 MOV A,0x13 2个时钟周期C:0x0549 2511 ADD A,0x11 2个时钟周期C:0x054B F511 MOV 0

11、x11,A 2个时钟周期C:0x054D E512 MOV A,step(0x12) 2个时钟周期C:0x054F 3510 ADDC A,counter(0x10) 2个时钟周期C:0x0551 F510 MOV counter(0x10),A 2个时钟周期 62: DAC0L=sin(unsigned char)(counter8); C:0x0553 75F002 MOV B(0xF0),#0x02 2个时钟周期C:0x0556 A4 MUL AB 4个时钟周期C:0x0557 2463 ADD A,#0x63 2个时钟周期C:0x0559 F582 MOV DPL(0x82),A 2个

12、时钟周期C:0x055B E5F0 MOV A,B(0xF0) 1个时钟周期C:0x055D 3402 ADDC A,#0x02 2个时钟周期C:0x055F F583 MOV DPH(0x83),A 2个时钟周期C:0x0561 E4 CLR A 2个时钟周期C:0x0562 93 MOVC A,A+DPTR 3个时钟周期C:0x0563 FE MOV R6,A 1个时钟周期C:0x0564 7401 MOV A,#0x01 2个时钟周期C:0x0566 93 MOVC A,A+DPTR 3个时钟周期C:0x0567 F5D2 MOV DAC0L(0xD2),A 2个时钟周期 63: DAC

13、0H = sin(unsigned char)(counter8)8; C:0x0569 EE MOV A,R6 1个时钟周期C:0x056A F5D3 MOV DAC0H(0xD3),A 2个时钟周期 64: C:0x056C D006 POP 0x06 2个时钟周期C:0x056E D0D0 POP PSW(0xD0) 2个时钟周期C:0x0570 D082 POP DPL(0x82) 2个时钟周期C:0x0572 D083 POP DPH(0x83) 2个时钟周期C:0x0574 D0F0 POP B(0xF0) 2个时钟周期C:0x0576 D0E0 POP ACC(0xE0) 2个时

14、钟周期C:0x0578 32 RETI 5个时钟周期一共75个时钟周期,还需要加上中断跳转的3个时钟周期,一共是78个时钟周期的时间,在24M晶振的系统时钟下,周期为0.04167us那么中断执行的时间为3.125us,那么DAC0输出稳定时间加上中断执行时间就小于定时器溢出时间15.258us,因此,在上面所设计的参数下是能够正常运行的。六、 实际测试Step为1的时候,输出应该为1Hz,测试图片如下所示:Step为100的时候,输出应该为100Hz,测试图片如下所示:Step为1000的时候,输出应该为1KHz,测试图片如下所示:Step为10000的时候,输出应该为10KHz,测试图片如下所示:8 / 8

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!