OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6696|回复: 10

如何不间断地实现DAC波形输出,并可以实时更新输出数据?

[复制链接]

20

主题

468

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
1681
金钱
1681
注册时间
2014-2-25
在线时间
229 小时
发表于 2016-4-23 09:18:20 | 显示全部楼层 |阅读模式
10金钱
本帖最后由 1201yuge 于 2016-4-23 09:26 编辑

   问题是这样的,我想用DAC输出连续的信号,现在假设是需要输出一种无规律的波形(可以认为是噪声),并且需要以2MHz的转换速率输出;现在的实现方式是在内存中定义一个50K的数组,配置成DMA DAC输出,那么现在问题来了,以2MHz的速率输出,那么输出完50K 16位的数组只需要15.6ms,我想每次输出的波形是不重复的,那么怎么样才可以实现数据的更新呢?

我想到的方法有:
1.每次DMA传输完产生一个完成中断,然后更新数据,再次触发DMA传输,可以保证数据不重复,但是不连续了。
2.每次DMA传输到一半的时候或者完成的时候产生一个中断,更新缓冲区前一半或者后一半的数据,DMA是连续传输方式。

注:我现在更新的数据来源是随机数发生器,速率跟不上DAC的输出,请问有没有朋友做过类似的东西,给点意见,谢谢。

最佳答案

查看完整内容[请看2#楼]

我之前用F1的DAC输出,做过播放WAV文件的。 播放的采样率比较低,大概16k。音频数据是存放在SPI FLASH中的。 基本思路就是定时器触发DMA传输到DAC寄存器,给DMA开辟两个缓冲区。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

12

主题

228

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1730
金钱
1730
注册时间
2016-3-8
在线时间
678 小时
发表于 2016-4-23 09:18:21 | 显示全部楼层
我之前用F1的DAC输出,做过播放WAV文件的。
播放的采样率比较低,大概16k。音频数据是存放在SPI FLASH中的。
基本思路就是定时器触发DMA传输到DAC寄存器,给DMA开辟两个缓冲区。
回复

使用道具 举报

2

主题

686

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
10569
金钱
10569
注册时间
2014-6-12
在线时间
1022 小时
发表于 2016-4-23 10:30:46 | 显示全部楼层
如果要连续,就直接采样一次DAC输出一次,不必要DMA传输。
回复

使用道具 举报

20

主题

468

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
1681
金钱
1681
注册时间
2014-2-25
在线时间
229 小时
 楼主| 发表于 2016-4-23 10:48:55 | 显示全部楼层
xuyaqi 发表于 2016-4-23 10:30
如果要连续,就直接采样一次DAC输出一次,不必要DMA传输。

这个只是初步测试,我中间需要使用DSP库进行一些数据处理的
回复

使用道具 举报

2

主题

686

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
10569
金钱
10569
注册时间
2014-6-12
在线时间
1022 小时
发表于 2016-4-23 11:21:46 | 显示全部楼层
如果要连续,采样率要和DAC输出率一致只能在采样输出间隙干一些其他事,用定时触发比较好。
回复

使用道具 举报

12

主题

228

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1730
金钱
1730
注册时间
2016-3-8
在线时间
678 小时
发表于 2016-4-23 11:40:54 | 显示全部楼层
要实现连续输出,用DMA的ping-pong缓冲模式是比较合理的思路。就是LZ说的第二点。

如果数据产生的速率达不到设计的要求,那就没办法了。可以把缓冲区开大一些试试。
回复

使用道具 举报

20

主题

468

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
1681
金钱
1681
注册时间
2014-2-25
在线时间
229 小时
 楼主| 发表于 2016-4-23 12:18:29 | 显示全部楼层
adlu 发表于 2016-4-23 11:40
要实现连续输出,用DMA的ping-pong缓冲模式是比较合理的思路。就是LZ说的第二点。

如果数据产生的速率达 ...

嗯嗯,我还想做些傅里叶变换在输出呢,看来速度是不够,只能降低DAC的输出频率了。能够请教一下假设我要输出20K的正弦波的话,DAC的输出速度是多少合适?
回复

使用道具 举报

12

主题

228

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1730
金钱
1730
注册时间
2016-3-8
在线时间
678 小时
发表于 2016-4-23 14:54:08 | 显示全部楼层
1201yuge 发表于 2016-4-23 12:18
嗯嗯,我还想做些傅里叶变换在输出呢,看来速度是不够,只能降低DAC的输出频率了。能够请教一下假设我要 ...

这个就看你对波形质量的要求了,比如每个波形32个点,那DAC输出速度就是32x20k=640k。

用F4来做数字信号处理还是比较吃力的,一般都用FPGA或者DSP。
回复

使用道具 举报

20

主题

468

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
1681
金钱
1681
注册时间
2014-2-25
在线时间
229 小时
 楼主| 发表于 2016-4-23 15:29:06 | 显示全部楼层
adlu 发表于 2016-4-23 14:59
我之前用F1的DAC输出,做过播放WAV文件的。
播放的采样率比较低,大概16k。音频数据是存放在SPI FLASH中的 ...

嗯嗯,我最终的目的也是要输出到功放上面,你觉得给人听,最低的输出采样率是多少合适,16K会不会稍微有点低?
回复

使用道具 举报

12

主题

228

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1730
金钱
1730
注册时间
2016-3-8
在线时间
678 小时
发表于 2016-4-23 16:01:01 | 显示全部楼层
1201yuge 发表于 2016-4-23 15:29
嗯嗯,我最终的目的也是要输出到功放上面,你觉得给人听,最低的输出采样率是多少合适,16K会不会稍微有 ...

呵呵,你这个"给人听"没标准啊。

音乐播放也是给人听,公车报站也是给人听,两个的要求天差地别。
如果是前者,是用于享受音乐的,必须用专用DAC。
如果是后者,只是用于输出提示信息,16k完全可以了。
回复

使用道具 举报

20

主题

468

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
1681
金钱
1681
注册时间
2014-2-25
在线时间
229 小时
 楼主| 发表于 2016-4-23 19:32:26 | 显示全部楼层
adlu 发表于 2016-4-23 16:01
呵呵,你这个"给人听"没标准啊。

音乐播放也是给人听,公车报站也是给人听,两个的要求天差地别。

ok,懂了。谢了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-27 01:58

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表