|
本帖最后由 watershade 于 2017-2-7 18:51 编辑 手里有nucleo-f446ze,之前移植没有使用STM32自身携带的DAC。最近想用DAC产生复杂波形,来模拟声音。我的做法是用杜邦线焊接到3.5mm耳机孔接插件,然后用耳机插入插孔做测试。当然这种方法可能对耳机造成伤害。在公司里用示波器来测试生成的波形,然后到家之后用耳机来测试音频信号。 为了产生合适的音频,还需要了解音调的频率。因为纯音是正弦波行,所以关键的一步是产生可调节频率的波形。在这个过程中遇到几个问题。 我使用的是通道2产生正弦波,用DSP函数产生100个采样点数值。这些都没有问题。我使用DMA和TIM触发的方式产生DAC波形的,问题出现在三个方面,这里做一个总结。 1、用HAL_DAC_Start_DMA开启通道之前,先启动TIM(HAL_TIM_Base_Start). 2、这里要对定时器的主触发输出事件设置成UPDATA而不是Reset或者Enable 3、DAC的对齐方式可以是8位或12左/右对齐,因此DMA的PeriphDataAligment要相应的设置为Byte或者HalfWord。而MemoryDataAligment若设置的和数据源不同就会出现问题。我就出现了数据源是uint32_t,而外设和存储器的对齐方式都是半字方式的。这就出现了波形切换的时候总有个0的部分。后来才发现、 应该还存在的几个问题是DMA的模式要设置成Circular,TIM更新的时间在哪里。 【本帖是自己对工作过程中问题的总结】 |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| 后面做了一个简单的音频测试程序,来测试频率和音调的关系。效果还可以,但是想要做到播放wav格式的文件还需要继续试验 |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| 下面粘贴几张参考频率表格:
计算timer的Period的方法也很简单。比如的用的是TIM6,用的是AHB1的时钟90MHZ。而我的正弦波是100个采样点。因此我参考这张表格来设置时就是下面的公式: 备选音频周期(us) * 90 / 100 即可 比如中音1,设置的Period就是1720.另外需要注意TIM6/7是16位的定时器。ARR内的数值不能超过65535. 下面上传一下附件和测试的图片:
DAC_TTDMA.rar
(8.54 MB, 下载次数: 183)
|
| 谢谢分享! 赞一个 |
| 谢谢分享 |
| 学习了,多谢分享经验 |
| 多谢分享! |
| 不错,很好的实践精神~~ |
微信公众号
手机版