1. 原理
产生连续信号的方法有两种,一种是查表法,另一种是我们常用的计算法。
查表法,即将要输出的数据计算好,存储在DSP中,然后依次输出。查表法,速度快,可以产生较高频率的波形,而且不占用DSP的计算时间,但是占用DSP存储空间较大。
计算法,即用计算的方法依次计算数据而后输出,然后再计算而后输出。其优点是不占用DSP的存储空间,但缺点是要占用DSP的计算时间,使得执行程序的开销变大。
本实验用计算法产生一个余弦波信号,从DA输出。由余弦递推公式: ,如果要产生一个连续的余弦波形,必须先知道前两个余弦值的大小,然后利用递推公式计算出后面的数据。
计算法算法实现:
#define _cosx 0.999390827
由程序中的这个语句可以推出,语句中的x=2;其中n=0,1,2,~~~~~~~180。
根据公式
可以知道,所发生的余弦信号的各取值分别为cos0,cos2,cos4……cos88,cos90……cos178,cos180……cos358,cos360,一共显示180个余弦值。
2. 分析思路
首先了解产生连续波形的两种方法,了解余弦信号的发生原理,继而对其原理进行分析,然后细看程序,寻找突破口,找到调试点,对硬件连接(相关各芯片和接口之间的连接)分析,实验仿真,查找资料解决问题。
二、电路原理下图为MCBSP缓冲串口接收和发送数据的过程,McBSP通过DX和DR引脚与外部设备进行数据通信,DX串行数据发送,DR串行数据发送。
下图为DSP5402芯片与AD50连接图
三、应用程序
本实验程序基于以上设计思路,使用C语言实现连续余弦波的输出,主程序如下:
/* Program for generates a sequence cosine signal */
/* used wt-5402 in dsp tms320vc5402 */
/* and send this signal to ad50() */
/* If you use oscillograph you can see this signal */
/* Designed by wcang.axn.mpin */
/* 2002.6.8 */
/* All rights reserved. Property of wcang.axn.mpin */
/* "@(#) DSP/BIOS 4.51.0 06-10-02 (wcang.axn.mpin)" */
ioport unsigned port0bfff;
#define IOSR port0bfff
#define _cosx 0.999390827
#pragma DATA_SECTION(_COSX,"data_buf1")
float _cosx[200];
#pragma DATA_SECTION(dacdata,"data_buf2")
int dacdata[180];
void delay(void);
void main(void)
{
unsigned int i=0;
_cosx[0]=1.000;
dacdata[0]=4095;
_cosx[1]=_COSX;
dacdata[1]=_COSX*2047+2048;
i=1;
while(1)
{
if(i++>179)
break;
_cosx[i]=2*_COSX*_cosx[i-1]-_cosx[i-2];//余弦递推公式
dacdata[i]=_cosx[i]*2047+2048;//(dacdata的范围是[1,4095])
}
i=0;
while(1)
{
if(i>179)
i=0;
IOSR=dacdata[i++];
/*delay*/
}
}
void delay(void)
{
long int j;
for(j=0; j<200; j++)
asm("_nop");
}
程序所使用的配置文件为:
-c
-o cos.out
-l rts.lib
MEMORY
{
PAGE 0:
PARAM : origin=0x1000, length=0x0efd
PAGE 1:
DARAM : origin=0x2000, length=0x2000
}
SECTIONS
{
.text : {} > PARAM PAGE 0
.cinit: {} > PARAM PAGE 0
.data: {} > DARAM PAGE 1
.bss: {} > DARAM PAGE 1
.const: {} > DARAM PAGE 1
}
对程序的分析:
1.“#define _cosx 0.999390827”,程序中此语句告诉清楚的告诉我们,x的取值为2,也就是说生成的波形每隔2°就输出一个连续的点,以这样的方式产生波形。
2.程序关键部分:
while(1)
{
if(i++>179)
break;
_cosx[i]=2*_COSX*_cosx[i-1]-_cosx[i-2];//余弦递推公式
dacdata[i]=_cosx[i]*2047+2048;//(dacdata的范围是[1,4095])
}
以上部分实现波形发生的算法。本实验的算法主要体现在余弦递推公式上面,利用余弦递推公式产生一组连续的余弦波形。“dacdata[i]=_cosx[i]*2047+2048”此语句使浮点数转换为定点数。
3.以上程序是存在问题的。以上程序只提供了实现波形的产生,并没有提供与硬件相连的程序,也就导致了实验过程中无法用示波器找到合适的测试点测试实验结果。接收数据的端口是IOSR,其地址为port0bfff,这是一个IO端口地址,而程序中所给地址都是数据空间DARAM和程序空间PARAM。
程序运行结果:
数据图:
产生的信号数据波形图
上图显示了两个周期内的数据图,循环输出一个周期内的数据就会产生连续的波形。此图中对应的实际数据如下图所示:
四、结果分析
本实验通过DSP芯片产生一个连续的余弦波信号,产生的余弦波由AD50的DA输出。DSP的缓冲串口MCBSP与AD50相连接,传递数据。