请选择 进入手机版 | 继续访问电脑版

你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【实战经验】利用DFSDM开发PDM麦克风应用介绍

[复制链接]
zero99 提问时间:2017-8-4 13:43 /
利用DFSDM开发PDM麦克风应用介绍

前言
      STM32提供了丰富的音频应用外设,并得益于灵活高效的内部架构,可以支持广泛的音频应用。本文中,在简单介绍音频采集的背景知识后,从应用需求出发,确定麦克风的选用。然后,描述了STM32内部DFSDM (Digital Filter for Sigma-Delta Modulator)在PDM麦克风采集中应用。最后逐步介绍如何利用STM32CubeMX进行DFSDM设计开发,实现PDM麦克风声音采集。


一 背景知识

      声音通过声学传感器获取模拟信号,经过模数转换器,转换成二进制码0和1,这些0和1便构成了音频数字信号。PDM麦克风能够实现上述的模拟信号获取,并输出PDM信号。PDM(Pulse Density Modulation)脉冲密度调制,利用脉冲密度表示模拟信号强度。
      从PDM位流中获取数据,还需要经过如下图环节才能获得模拟信号幅度对应的数字量。
11.jpg




二 应用需求及DFSDM支持分析
      在音频应用开发前,需要根据应用需求,对麦克风个数、支持编码类型、采样率及分辨率等进行确定。下面围绕DFSDM在这些需求方面的支持情况进行分析。

2.1 麦克风数量
      同时运行的最大麦克风数量,对于DFSDM,由DFSDM中滤波器数量决定。简单理解,就是一个滤波器对应一个麦克风。注意这种简单等同并不适用于非同时采样的应用场景。
      麦克风的数量不直接对应通道数量,如下图。
12.jpg



      可映射任一DFSDM通道单元至滤波器单元。对于通道CH(y-1),数据线可来源于DATIN(y-1)引脚,也可来自于DATIN(y),在通道单元中可以选择获取数据的时刻(上升沿或者下降沿)。这样带来的益处是,可利用内部两个通道单元对同一个数据线上数据进行分离并处理获得采样数据。而这个应用,直接满足了双通道数据在同一条数据线上的数据采集场景。
      上述描述的应用场景中,数据处理流向如下图所示:
13.jpg

      注1:图中CLK线硬件设计上不一定需要连接,DFSDM可在内部关联,实现利用输出时钟作为时钟输入,具体可通过参考手册了解。

2.2 编码类型
      DFSDM支持PDM、曼彻斯特编码,支持具有类似编码的麦克风器件,具体可通过参考手册了解。

2.3 采样率
      DFSDM通过时钟源、滤波模式、快速模式选择、过采样配置,实现不同采样率的支持。能够支持常见的8k,16k,22k,44k,48k的采样率,也能够支持特殊应用场合所需的更高采样率,例如192k, 384k等。
      更多关于DFSDM采样率介绍,以及具体计算公式可通过参考手册了解。

2.4 分辨率
      DFSDM具有24位数据寄存器,可通过配置实现不同分辨率的支持,有效数据最高支持到24位。同时,新的 HAL库支持全硬件获取16位采样数据,不增加CPU负载。
      DFSDM分辨率由过采样率,滤波器类型和右移位器决定,更多内容可通过参考手册了解。
14.jpg

      在不同处理环节数据分辨率情况如下图所示。
15.jpg

      积分器最大数据输出范围如下表。例如当FOSR为64,IOSR为1,采用Sinc3滤波,在不考虑后续处理环节时,输出范围为±262144,分辨率能够达到19位。并可通过右移位器灵活获得需要的有效数据位数。
16.jpg


三 前期准备
      出于将重心放在DFSDM应用介绍,简化其他环节考虑。本文中实现例在ST提供的NUCLEO-L476RG和X-NUCLEO-CCA02M1板展开。
      考虑到利用DFSDM实现PDM麦克风采集,首先根据UM1900对麦克风板X-NUCLEO-CCA02M1进行处理,使其支持基于DFSDM采集的两路PDM麦克风。需要准备软硬件资源如下表。
17.jpg



四 实现过程


4.1 应用实现
      利用X-NUCLEO-CCA02M1板上已有的两路PDM麦克风,可实现最多两路麦克风数据采集。
      在本例中,先将应用需求定为两路麦克风采集,采样率为8KHz,分辨率为16-bit。后续介绍如何利用STM32CubeMX生成遵循应用需求的工程,以及在获得工程后,如何启动采样,实现麦克风采集的应用。

4.2 开发流程
18.jpg

4.3 STM32CubeMX配置实现
      STM32CubeMX操作流程如下图所示。
19.jpg

    a. DFSDM通道选择
      根据X-NUCLEO- CCA02M1板原理图,可知在将其处理成支持DFSDM采集的两路麦克风时,麦克风总线引脚与STM32L476RG连接情况如下。
20.jpg    21.jpg
           
      在STM32CubeMX中,选择Channel1中“ PDM/SPI Input from ch2 and internal clock ”和Channel2中“ PDM/SPI Input from ch2 and internal clock ”,并选择“CKOUT”,如下图所示,PC2、PB14自动对应与DFSDM的Clock out和Data In功能脚。
22.jpg


    b. 配置通道
      切换至“Configuration” 标签页,点击“Control\DFSDM”打开DFSDM配置界面。由于选择了通道1和通道2,这里可以对这两个通道进行配置。配置情况如下图。
23.jpg

      Type:配置数据读取时刻。SPI with rising edge在时钟的上升沿读取数据;SPI with falling edge在时钟下降沿读取数据。
      Spi clock:总线时钟源。Internal SPI clock利用内部时钟,对应为CKOUT时钟。
      Offset:数据偏移量补偿。
      Right Bit Shift : 右移位。右移位的确定,涉及到获取有效数据的位数,如“分辨率”小节中图所示。需要结合滤波器和积分器配置及分辨率需求进行确定。本文中,经过滤波器和积分器处理后输出数据分辨率为29-bit,所以将右移位设置为5,从而在24位数据寄存器中获得有效的24-bit数据。
      Analog watchdog parameters : DFSDM中模拟看门狗参数设置。应用例中没涉及到此功能,参数保持默认。

    c. 配置滤波器
      切换至“Filter0”/ “Filter1” 标签页,配置情况如下图。
24.jpg

      Regular channel selection: 数据来源。选择与外部麦克风连接的通道。
      Continuous mode: 转换模式。选择连续转换模式。
      Trigger to start regular conversion: 启动转换的触发源。
      Fast mode: 快速模式。在连续转换数据源来自于同一个通道时可启用,能够提高转换速度。本文应用例满足条件,使能Fast mode。
      DMA mode : DMA 模式。如果无法使能,需参考后面“配置DMA”小节,先完成对DMA参数的配置。
      Inject channel selection: 注入通道选择。应用例中没涉及到此功能,参数保持默认。
      Sinc Order: 滤波类型。
      Fosr: 滤波器过采样率。
      Iosr: 积分器过采样率。
      其中,Sinc order, Fosr和Iosr共同决定了积分器处理后的内部数据分辨率。根据“分辨率”小节,在如上配置时,积分器最大输出分辨率为29位。

    d. 配置时钟
      切换至“Output Clock” 标签页,配置情况如下图。
222.png

      Selection: CKOUT时钟源选择。
      Divider: 时钟预分频因子。CKOUT = Audio clock / divider。
      其中,Audio clock来源于SAI1时钟,如下图配置,SAI1时钟配置为17.411765MHz。CKOUT输出时钟频率为1.0242MHz。
      在Fast mode情况下,采样率Fs如下:
223.png
26.jpg

    e. 配置DMA
      切换至“DMA Settings” 标签页,配置情况如下图。
27.jpg

      DMA配置中,选择Circular模式,可实现循环向数据buffer中填充采样数据。
      Data Width设置为Half Word,以便实现只获取数据寄存器的高16位数据,实现16-bit分辨率数据采集。


    f. 生成工程
      在STM32CubeMX\Help打开帮助文档UM1718,参考文档,生成IAR工程。至此获得与硬件对应,支持两路麦克风,采样率为8KHz,分辨率为16-bit的初始化软件工程。


    g. 启动采样
      完成上述步骤后,即可调用HAL库中提供的函数,启动麦克风数据采集。建议利用DMA方式实现麦克风采集,占用CPU开销最小。下述为启动采样的实现例程。在例程中通过调用HAL_DFSDM_FilterRegularMsbStart_DMA启动采样,这个函数实现了利用DMA接收DFSDM的数据寄存器的高16位数据,并传输到分配的Buffer空间中。
      注:HAL_DFSDM_FilterRegularMsbStart_DMA()的实现需要在DMA配置中将Data Width 设置为Half Word。
      由于DMA采用Circular模式,采样数据向buffer空间的搬运连续进行,而半传输完成和传输完成中断回调函数被执行时,意味新的数据被填充至Buffer空间,用户可以在其中增加处理指令,完成利用DFSDM的麦克风数据采集应用的开发。
311.jpg
312.jpg

      除此之外,还可以调用HAL_DFSDM_FilterRegularStart_DMA启动采样,而这种实现获取的整个32位的数据寄存器内容,获取数据需要利用软件指令将低8位,非采样数据移除。同时这种实现,需要在DMA配置中,将Data Width配置为Word。

五 小结
      本文虽然尽可能详细的介绍在PDM麦克风采集中,DFSDM作用及实现步骤。但并没有涉及到所有DFSDM支持功能的介绍,而是侧重于DFSDM在PDM麦克风采集中涉及的功能介绍,更多DFSDM功能介绍可以通过参考手册了解。另外不同系列STM32的DFSDM支持情况会略有差异,需以对应型号的参考手册为准。


评分

参与人数 1 ST金币 -1 收起 理由
kingmanlight -1

查看全部评分

收藏 评论2 发布时间:2017-8-4 13:43

举报

2个回答
zhang5055258 回答时间:2018-11-13 09:55:47
有例程下载吗?
kylongmu 回答时间:2021-2-9 23:41:59
用nucleo-h723z做了一遍,可以获取普通PDM麦克风的数据,但是总采样率受到模块20M时钟上限限制,用官方的计算表试了一下,在15bit左右精度条件下只能够1个通道192kHz采样。 dfsdm.png
比较鸡肋啊,单个通道高速采样+高精度都无法支持,这都用到550MHz的H7了。

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版