|
1、 解决方案(必要的公式、文字等)
在课外实验中,我们选择利用ADC对输入的信号进行采集,然后利用串口控制DAC的输出,实现通过串口控制DAC输出采集到的波形的功能。
在本实验中,是通过判断串口发送的数据来实现对相应DAC的控制的。为了方便,我们选择了字符‘1’和字符‘0’分别表示DAC的开闭两种状态。准确来说,这里的DAC关闭的状态是强制DAC输出为0。这是根据我们的硬件条件所做出的的一种简便的处理。
在本实验中,我们使用的ADC是DSP内置的12位ADC,而使用的DAC则是板载的8位DAC,在程序设计的过程中,由于ADC的数据寄存器为16位,而实际有效的数据位数为12位,所以程序上读取ADC的数值的时候,而我们又在配置模式的时候默认为高12位有效,所以在对ADC的相应寄存器进行读取的时候,我们采取了移位处理。而输出相应数据的时候,由于DAC的有效位数为8位,而我们ADC采集到的数据为12位,所以程序设计的时候就要舍弃一部分ADC的精度,即其实我们只利用到ADC的8位数据,我们舍弃ADC的后四位数据,所以在输出的时候我们做了一个右移处理,保证了输出数据满足DAC芯片的要求。
程序中利用判断串口发送的数据进入两种不同的状态,我们为了标记不同的状态,引入了状态标志位,当不同命令到达的时候,状态标志位就随之改变,而通过判断不同的标志位,程序进入不同的状态。
3、 实验结果与分析
在实际设计过程中,我们的串口传递的数据出现了问题,即上位机发送过来数据,DSP可以接收到,但是总是接受为另外一个数。我们检查了通信方式的各种参数,发现配置并无问题。通过硬件仿真过程,也确保了当上位机发送数据的时候DSP的确能够接受到数据。我们尽最大的努力分析了各种可能并逐一排除,包括下列几种:
1. 由于串口通信是在主函数循环中不停检查串口的接收缓冲器的就绪标志位,而在此过程中ADC也在采样,可能ADC“打断”了CPU对数据的读取。
排除原因:在串口接收数据的过程本身其实并不需要CPU对串口进行控制,只有当就绪标志位被置位之后程序才对数据进行读取,而这时候数据已经正常读进来了,所以不会有影响。
2. 连续数据导致后面的数据和前面的数据混在一起导致错误。
排除原因:程序逻辑上,我们的循环检查一直在进行,而中断时间较短,只要标志位置位程序就会及时将数据读走;实验验证,我们只发单个数据也出现错误的问题。
3由于其他问题导致时钟并不准确。虽然标定的系统时钟为150M,但是仍有存在误差导致串口时钟不准的可能。
排除原因:ADC采样率可以通过硬件仿真计算出来,而该采样率符合系统时钟为150M的理论计算,所以系统时钟没有问题。
此外,我们还观察到一个现象,就是在串口接收上位机的数据时,串口的接受缓冲区的就绪标志位会置位,但是无论发送什么数据,接收寄存器中的数据总是相同的。我们只好怀疑是否是由于其他原因导致上位机发送的数据就不对。
4、 问题与分析与解决
为了解决上述问题,我们利用了接受缓冲区的标志位会置位这一性质,判定每一次串口发送数据都是一个命令,而命令无非开启关闭两种,而开启关闭两种命令总是交替出现的,所以我们可以不判断所发出的信号的具体值,而是根据发送命令这一行为本身来切换开闭的两种状态。
|
|