所有关于电路
项目

高速波形生成一个单片机和DAC

2017年12月08日通过罗伯特Keim

在本文中,我们将评估不同的固件策略在我们追求最大频率的模拟信号的一代。

在本文中,我们将评估不同的固件策略在我们追求最大频率的模拟信号的一代。

这是第二个项目基于条专门设计的任意波形发生器(AWG)围绕C8051F360单片机和TxDAC从模拟设备。

前一篇文章提出了一个固件框架,方便,高速并行数据传输从单片机DAC。在那篇文章中,您还将找到链接四个技术文章探索AWG的方案设计和PCB布局。be paly外围beplay体育下载不了

客观的

我们在这个项目的目标是确定我们可以更新的最大速率DAC输出。这些信息然后让我们考虑关于获得波形频率最高。系统的最大频率相比绝不是惊人的高性能数字合成系统的能力,但在我看来这是相当令人印象深刻的上下文中的低成本、适度复杂的电路,是灵活的,可扩展的和容易使用。

我们有很多,我们跳的。

阅读代码的内存

第一个策略,我们会评估是使用单片机的闪存存储DAC数据。我们为什么使用flash内存吗?因为单片机通常(或现在也许总是)flash比内存。有时差别的例子,C8051F360只有32 kB的flash和XRAM 1024字节。

但很多DAC数据存储的优势是什么?为什么我们不能储存足够的数据点为一个周期,然后重复?这是一个选择,但有一个(多)不再数据缓冲区在某些情况下可能是非常有益的。例如,如果你转移通过数据,您可以存储整个包的DAC数据,这意味着单片机没有生成波形值。相反,它只是从内存中读取的值,当然,这节省了处理器资源。这个概念可以扩展到复杂波形的生成,比如唧唧声预示了更好的计算唧唧喳喳的数据并将其存储在单片机的内存的其他地方,而不是迫使单片机计算chirp-waveform值。

我实现了code-memory-based技术通过使用Excel来生成波形值,然后将它们存储在一个代码空间数组:

无符号字符代码DACdata_128SPP [DACDATA_LEN] = {128, 134, 140, 146, 152, 158, 165, 170,…,……,……};

我用8192字节数组,外部生成的数据对应于64周期的正弦波128样本/。上一篇文章中解释道,关键参数所需的时间来完成所有的指令在DAC-update中断服务例程(ISR):

SI_INTERRUPT (INT0_ISR INT0_IRQn) {DEBUG_PORT | = REDLED;DAC_WORD = DACdata_128SPP [DACdata_index];DACdata_index + +;如果(DACdata_index = = DACDATA_LEN) {DACdata_index = 0;}DEBUG_PORT & = ~ REDLED;}

因此,我们将评估我们的固件技术通过激活一个调试信号初的ISR和它的ISR才会安静下来。然后我们探测信号,积极的脉冲的宽度给了我们一些关于ISR信息执行时间,通过扩展,最大DAC更新速率。注意,我在其最大运行单片机处理器频率,即。,100 MHz。这是一个代表捕获范围:

所以read-from-code方法给我们ISR平均执行时间约325 ns(其实没有那么简单,稍后我们会看到)。注意到在下降沿抖动。范围是触发上升边缘,下降沿的位置的变化告诉我们,ISR执行时间不是完全不变。

这是另一个捕捉范围;您可能会发现这一个有趣的,因为它显示了ISR执行之间的关系和DAC电压的变化。你也可以看到“楼梯”模式是正弦曲线的斜率部分更加明显。

阅读从XRAM

DAC数据存储在代码空间给我们长缓冲区的优势,但是这种方法减慢了我们的吗?这里的问题是是否从flash读取数据花费的时间大大超过从XRAM读取数据。

这个新的固件配置使用一个384字节XRAM数组来存储3周期的正弦波128样本/期。我外部生成的值并将它们存储在一个384字节的代码空间数组,然后将所有的值复制到XRAM数组。我不得不这样做,因为编译器不允许我初始化XRAM数组以同样的方式,我初始化代码空间阵列(实际上它确实让我,然后程序就会崩溃在执行)。这是代码:

无符号字符xdata DACdata_RAM [DACDATA_LEN];无符号字符代码DACdata_128SPP [DACDATA_LEN] = {128、134……,……};
(n = 0;n < DACDATA_LEN;n + +) {DACdata_RAM [n] = DACdata_128SPP [n];}

正如你所看到的在接下来的捕捉范围,这种技术确实降低了ISR执行时间。

这是重要的,但不是令人惊叹。我仔细对比了两种技术,和积极的脉冲宽度平均329 ns当阅读代码和310 ns XRAM当阅读。

所以我们处在什么位置?让我们来reading-from-XRAM测量并添加margin-say, 20%。这让我们的ISR执行时间372 ns,这对应于一个DAC更新~ 2.7 MHz。如果我们限制自己每时期10个样本产生一个丑陋的波形,但绝不是不足从信号处理的角度(稍后)——我们可以从理论上讲产生信号的频率高达270千赫。实际的最大频率会降低,我们会看到。

最大化的秘密DAC更新率

所有这一切都归结到256号。你可能会注意到在上面的代码片段,ISR递增数组索引检查它的价值,每一次。然后,如果数组指数达到最大值,它需要重置为零。检查索引变量的值增加了每个ISR执行的时间,然后重置零的数组添加更多的时间的ISR处决。我们可以消除这些麻烦的语句吗?是的,在两个步骤:

  1. 限制我们的数组大小为256,因此我们可以使用1字节变量的指数。这里我们使用一个8位机,执行操作在一个字节是速度比执行操作在两个字节。
  2. 我们将实施每个时期的样本数量的限制必须匀到256。为什么?因为这意味着过去正弦波周期将永远结束在255年索引值,当我们增量索引变量时,它自然会展期为0。因此,我们要做的是增量。没有必要检查索引值。

这是新技术的代码:

SI_INTERRUPT (INT0_ISR INT0_IRQn) {DEBUG_PORT | = REDLED;DAC_WORD = DACdata_RAM [DACdata_index_8bit];DACdata_index_8bit + +;DEBUG_PORT & = ~ REDLED;}

这里是一个捕捉范围;每节课我用16个样品:

正如你所看到的,平均正脉冲宽度从310 ns 209.7 ns。这是一个重大的改进;我们已经减少了~ 32%的执行时间。也注意到抖动消失了:每个ISR执行需要相同的时间,确认的微不足道的区别“最小值”和“Max”提供的统计范围。

实际执行时间

debug-signal-based测量提出了迄今为止比较技术,另一个是有用的,但是他们反映了实际执行时间多少?不是很好,因为ISR fast-i.e。,因为执行时间短的开销相对于矢量从ISR和返回。我检查了拆卸和证实,大量的处理器行动发生在第一个debug-signal语句之前和之后第二个debug-signal声明。因此,实际的执行时间是相当的时间比积极的脉冲宽度。

多久?嗯,我消除了手动调试语句,那么加起来的数量为所有ISR中的指令时钟周期。我以43个时钟周期结束,接近但不准确,因为我不负担自己详细的时钟周期的变化需求。一个处理器时钟周期是10 ns-so我们看430 ns的ISR执行时间而不是210 ns !这太令人失望了,我们需要做出一个试图加快速度有点....

轮询和中断

毫无疑问,我们ISR-based固件模型,总体来说,正确的解决方案。但是让我们想象我们决心推动DAC绝对最大频率,我们不在乎处理器卡在一个轮询循环。轮询方法消除中断处理的开销;这是代码:

而(1){如果(TCON_IE0) {TCON_IE0 = 0;DAC_WORD = DACdata_RAM [DACdata_index_8bit];DACdata_index_8bit + +;}}

我又看了看拆卸,加起来时钟周期;结果是27日,一个主要的减少。这对应于270 ns的执行时间而不是430纳秒。

确认我的计算是相当准确的,我试图操作单片机的采样率接近理论最大值1 / (270 ns) = 3.7 MHz。然后我计算预期的正弦波频率基于采样率和样本的数量每段(在本例中16)。如果测量正弦波频率等于预期的正弦波的频率,然后我们已经证实单片机能够更新DAC数据的时间内提供的采样率。

我改变了PCA clock-output频率(也就是采样率)到3333333赫兹。(频率选择是有限的,因为PCA分配器值是有限的。)下面的捕捉范围确认生成的波形有预期的频率,即。(每秒3333333个样本)/(每节课16个样本)= 208.333 kHz。

从更新速度信号的频率

在这一点上我认为我们建立了最大DAC更新率,我们可以希望与一个8位单片机实现运行在100 MHz:大约每秒350万个样本。那么,什么是最大的信号频率?这一切都取决于每个时期的样本数量(SPP)。我们限制数字匀到256年,但除此之外,SPP的信号质量,你会很惊讶你能做多少与low-SPP波形看起来可怕的范围。

这里的基本问题是频率的内容。当你生成一个300 kHz波形时,你已经在300 kHz频率的能量。一个FFT情节将代表这个能量作为基本频率(即著名的高峰。300千赫)。你不会失去这300 kHz飙升通过减少SPP;相反,你获得你不想要的东西,即噪音。

我用我MDO3104从美国泰克示波器捕捉一些真正有用的FFT情节与128年为正弦波,16日和8个SPP。你可以看看蓝色的”是指“频率测量底部跟踪哪个情节对应哪个SPP:采样率永远是3333333 Hz,所以128 SPP产生26.04 kHz的正弦信号,16 SPP给我们208.3 kHz,和8 SPP给我们416.7 kHz。让我们看看8 SPP的情节:

的在最左边是基本频率。你可以看到有明显的噪声能量在采样频率的倍数(事实上,这些噪声谱由两个峰值位于对称的多重采样频率)。垂直规模是20 dB /部门,所以基本是大约20 dB以上第一个噪声峰值,大约30 dB第三噪声峰值。看看会发生什么当我16 SPP变化:

现在基本是28 dB以上第一高峰和40 dB第三高峰。甚至在128 SPP,只有第一个高峰是可见的,它是超过40分贝以下基本:

这些情节我的主要意图是证明减少SPP并不会使基频disappear-rather,它降低了信噪比,因为它创造了额外的噪声能量在采样频率的倍数。这很重要,因为它表明,我们可以弥补低SPP,通过融合一个过滤器将抑制这些噪声峰值。

你可以使用以下链接下载zip文件包含固件文件和完整的示意图。

proj_AWG2_firmware-and-schematic.zip

这是一个视频,让你看到时域波形和频谱的变化从8 SPP固件的变化,16 SPP, 128。

结论

我们探索固件beplay体育下载不了技术创建高速DAC的波形,我们选定了一个近似的最大采样率,我们可以实现与一个相当简单的AWG架构基于8位微控制器和一个并行输入DAC。这个系统结果的最大采样频率的当然限制按现代标准。如果我们想维持这种架构带来的好处,同时追求更高的信号频率,我们需要减少每个时期的样本数量,然后试图恢复一些失去了信噪比的实现二阶(或三阶、四阶……)DAC输出滤波器。

28日评论
  • 年代
    Sambo007 2017年12月22日

    我喜欢你的文章。不该“兆赫”与“赫兹”代替“3333333 MHz”?

    谢谢

    喜欢的。 回复
  • 约翰韭菜 2017年12月31日

    你的决心是什么设置频率,如果您正在使用一个循环计数器将会改变根据一组频率即可以设置F = 10000赫兹10001 Hz即改变1赫兹在10 khz ? ? ? ?或任何其他频率?

    喜欢的。 回复