stm32 DAC音频输出采用DMA循环模式问题

[复制链接]
13767|28
手机看帖
扫描二维码
随时随地手机跟帖
linc676085|  楼主 | 2013-1-9 09:48 | 显示全部楼层 |阅读模式
这两天因为手头的杂事加上感冒,DAC音频输出的问题放在一边。没有去想。
今天翻看了代码,我发现有几处问题,其实我一直不明白。
方案:因为音频转化为8进制的数据量很大,所以我决定采用DMA方式将音频数据传输到DAC上,再由DAC输出音频,这样节省了占有CPU的资源
结果:从示波器上看到,音频波形是一个类似方形的波形,DAC上输出的声音不是很清晰,有一些嘈杂的声音。
过程:程序解析如下
因为用到DMA,所以根据数据手册采用定时器6,DAC通道1,DMA2的3通道进行实验。
/*定时器6配置-------------------------------------------------------------------------------*/
void TIM6_Configuration(void)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

    TIM_DeInit(TIM6);
    TIM_TimeBaseStructure.TIM_Period = 1633;    //根据音频采样率为44.1khz所以定时器设为2.26us触发DMA
    TIM_TimeBaseStructure.TIM_Prescaler = 0;        
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;     
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;   
    TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure);

    TIM_ITConfig(TIM6,TIM_IT_Update, ENABLE);
    TIM_Cmd(TIM6, ENABLE);

/*DAC配置-----------------------------------------------------------------------------*/
void DAC1_Configuration(void)
{
    rw_DAC_CR&=0xe000e000;    //初始化DAC
    rw_DAC_CR|=(0x08<<8);//设置三角波幅值等于3
    rw_DAC_CR&=~(0x03<<6);//关闭波形生成器
    rw_DAC_CR|=(0<<3);//定时器6触发
    rw_DAC_CR|=(1<<2);//DAC通道1触发使能
    rw_DAC_CR|=(0<<1);//开启缓存使能
    rw_DAC_CR|=(1<<0);//开启DAC使能
}

/*DMA2_Channle配置----------------------------------------------------*/
void DMA2_Configuration(void)
{
    rw_DMA2_CCR3&=0xffff8000;//初始化寄存器
    rw_DMA2_CPAR3=0x40007410;
    rw_DMA2_CMAR3=(u32)&sinedata;
    rw_DMA2_CNDTR3=17052;

    rw_DMA2_CCR3|=(0<<14);//启用非存储器到存储器模式
    rw_DMA2_CCR3|=(0x03<<12);//设置通道优先级为高
    rw_DMA2_CCR3|=(0x00<<10);//设置存储器数据宽度为8位
    rw_DMA2_CCR3|=(0x00<<8);//设置外设数据宽度为8位
    rw_DMA2_CCR3|=(1<<7);//启动存储器增量模式
    rw_DMA2_CCR3|=(0<<6);//关闭外存储器增量模式
    rw_DMA2_CCR3|=(1<<5);//开启循环模式
    rw_DMA2_CCR3|=(1<<4);//从存储器读取数据
    rw_DMA2_CCR3|=(0<<1);//关闭传输完成中断
    rw_DMA2_CCR3|=(1<<0);//开启DMA2通道三
    rw_DAC_CR|=(1<<12);//开启DAC-》DMA的通道  
}


整个配置如上音源文件是我用声音合成软件生成的,但DAC输出的声音不清晰,有杂音。
我试过用tim6中断去做,可是波形只在掉电重启的时候有生成,之后就没有了,这个很奇怪。
所以,我想请教论坛里的前辈们,有没有办法将DAC输出的杂音去掉?我查过百度,没有
相关的资料,请前辈们指教下,如何才能让DAC输出的声音能清晰明朗。
linc676085|  楼主 | 2013-1-9 10:02 | 显示全部楼层
自己做个楼。

使用特权

评论回复
WJ20110308| | 2013-1-9 10:10 | 显示全部楼层
:P

使用特权

评论回复
linc676085|  楼主 | 2013-1-9 10:14 | 显示全部楼层
来,大神们,诚信求指教。

使用特权

评论回复
junwei05| | 2013-1-9 10:36 | 显示全部楼层
不知你想达到什么音效效果,实在要求高的话,直接用音频芯片,要求不高的话,何不直接用PWM,用DA处理不用反而效果更差!发音理论上最好是正弦波,实际上用方波也能凑合用,因为音符的差别就是频率的差别,可以参考网上音符频率对照表!

使用特权

评论回复
uet_cache| | 2013-1-9 10:37 | 显示全部楼层
不知道你的杂音是什么样子。你可以用示 波器看下DAC,,或者做一个三角波或正弦波,看波形有没有干扰。至少得先找出干扰源才好排除。。。

使用特权

评论回复
airwill| | 2013-1-9 10:39 | 显示全部楼层
首先, 我也认为用 DMA  是个很好的方案.
是否可以先验证一下, 杂音是否由 DMA 引起的. 用个两值轮番 DAC, 看看转换精度和时间精度是否足够高
DAC 的数据时间精度要求很高, 所以要求 DMA 的反应足够快, 应该将其优先级设置到最高.

使用特权

评论回复
linc676085|  楼主 | 2013-1-9 10:43 | 显示全部楼层
junwei05 发表于 2013-1-9 10:36
不知你想达到什么音效效果,实在要求高的话,直接用音频芯片,要求不高的话,何不直接用PWM,用DA处理不用反 ...

我想达到一个吐字清晰的效果。不伴有杂音的。
谢谢你,我去找找音符频率对照表。

使用特权

评论回复
linc676085|  楼主 | 2013-1-9 10:46 | 显示全部楼层
uet_cache 发表于 2013-1-9 10:37
不知道你的杂音是什么样子。你可以用示 波器看下DAC,,或者做一个三角波或正弦波,看波形有没有干扰。至少 ...

感谢您的回复。
我按照您说的步骤,我从DAC输出稳定电压开始做,然后用DAC输出方波,正弦波,三角波。用示波器看到的波形没有受到干扰。

使用特权

评论回复
linc676085|  楼主 | 2013-1-9 10:51 | 显示全部楼层
airwill 发表于 2013-1-9 10:39
首先, 我也认为用 DMA  是个很好的方案.
是否可以先验证一下, 杂音是否由 DMA 引起的. 用个两值轮番 DAC,  ...

版主,按照您的方法,如何才能知道转换精度和时间精度是否足够高呢?接上示波器看DAC输出的幅值么和时间数据间的时间吗?

使用特权

评论回复
uet_cache| | 2013-1-9 10:55 | 显示全部楼层
你输出信号的时间间隔是怎么定的?测试的时候能满足你音频输出的频率不?在能满足你输出频率的要求下,去测试正弦波。。。

使用特权

评论回复
airwill| | 2013-1-9 11:11 | 显示全部楼层
linc676085 发表于 2013-1-9 10:51
版主,按照您的方法,如何才能知道转换精度和时间精度是否足够高呢?接上示波器看DAC输出的幅值么 ...

用个两值轮番 DAC, 也就是输出三角波.
看看转换精度和时间精度是否足够高

使用特权

评论回复
linc676085|  楼主 | 2013-1-9 13:07 | 显示全部楼层
uet_cache 发表于 2013-1-9 10:55
你输出信号的时间间隔是怎么定的?测试的时候能满足你音频输出的频率不?在能满足你输出频率的要求下,去测 ...

输出信号的时间间隔由tim6定时器触发dac输出,触发时间设为62.5us,可以满足输出频率。
经过测试,32个数据的正弦波周期由DAC输出正好2ms左右。频率正常。

使用特权

评论回复
linc676085|  楼主 | 2013-1-9 13:50 | 显示全部楼层
airwill 发表于 2013-1-9 11:11
用个两值轮番 DAC, 也就是输出三角波.
看看转换精度和时间精度是否足够高
...

敬爱的版主,我照您说的采用两个值交替输出,出现的是一个方波。不是三角波。

使用特权

评论回复
airwill| | 2013-1-9 14:04 | 显示全部楼层
linc676085 发表于 2013-1-9 13:50
敬爱的版主,我照您说的采用两个值交替输出,出现的是一个方波。不是三角波。 ...

哦, 对, 是方波. 呵呵, 我弄错了.
接下来, 就是验证数值一致性和时间间隔的一致性.
特别是时间间隔, 因为杂音也可能是这个因素导致的. 要示波器取一段波形, 一个个地验证.
如果中间夹杂着时间间隔不同的波形,  说明 DMA  的异步问题导致的.

使用特权

评论回复
linc676085|  楼主 | 2013-1-9 14:27 | 显示全部楼层
airwill 发表于 2013-1-9 14:04
哦, 对, 是方波. 呵呵, 我弄错了.
接下来, 就是验证数值一致性和时间间隔的一致性.
特别是时间间隔, 因为 ...

敬爱的版主,经过验证时间间隔一致,没有夹杂着时间间隔不一样的波形。

使用特权

评论回复
airwill| | 2013-1-9 14:39 | 显示全部楼层
linc676085 发表于 2013-1-9 14:27
敬爱的版主,经过验证时间间隔一致,没有夹杂着时间间隔不一样的波形。 ...

如果所以波形间隔完全一直, 电平也一致, 那说明 mcu 处理是没有问题的, 下面是别的问题了.
1. 数字音源的问题, 或者音频经过你的 8 位数字化后, 音源失真.
2. 运放和功放的问题, 还有扬声器, DAC 出来的信号在后级放大引入了噪声和失真.

使用特权

评论回复
uet_cache| | 2013-1-9 14:43 | 显示全部楼层
那会不会是你数据源本身的问题了,,

使用特权

评论回复
linc676085|  楼主 | 2013-1-9 15:02 | 显示全部楼层
airwill 发表于 2013-1-9 14:39
如果所以波形间隔完全一直, 电平也一致, 那说明 mcu 处理是没有问题的, 下面是别的问题了.
1. 数字音源的 ...

敬爱的版主,您提的第二点,我可以排除,因为我在DAC输出的部分没有接上放大电路。
您提第一点,我个人觉得有这个可能,虽然声音很嘈杂,但是说的内容还是能听的清楚的。
看来我得换个音源再试试。

使用特权

评论回复
linc676085|  楼主 | 2013-1-9 15:02 | 显示全部楼层
uet_cache 发表于 2013-1-9 14:43
那会不会是你数据源本身的问题了,,

嗯,有可能,我换个音源看看,这次不用合成声音。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

42

帖子

1

粉丝