ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

LAT1545与STM32 DFSDM输入模式配置实战详解

LAT1545与STM32 DFSDM输入模式配置实战详解 做高精度采集项目时我第一次把LAT1545接到MCU的DFSDM外设上就卡在输入模式配置这一关。DSD数字Sigma-Delta信号到底该走哪种输入路径、时钟怎么给、滤波器和抽取率怎么配合手册里分散在好几个章节不完整读一遍根本串不起来。这篇把LAT1545配合DFSDM的输入模式选择和配置过程完整拆开讲适合正在调DSD采集链路、或者准备用DFSDM但还没理清输入模式的开发者参考。1. LAT1545和DFSDM能组成什么样的采集链路1.1 LAT1545在采集链路中的角色LAT1545不是常规意义上的ADC芯片。它内部集成了Sigma-Delta调制器把前端模拟信号转换成1-bit的数字流输出而不是直接输出并行的二进制数据。这种架构跟传统的逐次逼近型ADCSAR ADC有本质区别SAR ADC直接把模拟信号量化成N bit的并行数据推给MCU而Sigma-Delta调制器输出的是一串01码流码流中“1”的密度反映输入信号的幅值。要恢复出高分辨率的数字结果必须由后级MCU或者DSP对这串码流做数字滤波和抽取。DFSDMDigital Filter for Sigma-Delta Modulators就是STM32系列里专门干这个活的外设。它能产生调制器需要的时钟也能接收调制器输出的1-bit数据流内部通过可配置的Sinc滤波器、积分器、抽取器把串行码流转换成24位或更高精度的并行数据同时还能做平均值、极值等后处理。从整体链路看LAT1545负责“模拟到1-bit数字流”的转换DFSDM负责“1-bit数字流到高分辨率数字值”的还原中间省掉了传统模拟放大器和独立ADC的麻烦电路设计和PCB面积都能明显收缩。1.2 为什么是DFSDM而不是软件模拟有人会问LAT1545输出的就是1-bit码流用MCU的普通GPIO加上定时器中断在软件里数脉冲密度不也能还原信号吗理论上可行但实际工程里几乎没人这么干。DFSDM的时钟可以做到几十MHz而GPIO翻转加中断响应的开销通常在百纳秒级CMOS输入阈值抖动、中断延迟抖动、电源噪声耦合进I/O缓冲都会让采样的时间基准不干净。Sigma-Delta系统的核心优势恰恰在于“过采样噪声整形”如果采样时钟本身带抖动噪声整形效果直接被破坏最终的有效位数甚至不如普通12位SAR ADC。DFSDM的优势在于硬件化、并行化。它内部有完整的数字滤波链不占用CPU周期就能持续处理码流多个通道可以同时跑采集通道多、采样率要求高的场景优势更明显。我们项目里需要同时监视多路传感器信号每路的采样率在几kHz到几十kHz级别用DFSDM处理LAT1545的码流CPU负载几乎可以忽略不计这在软件解调方案里很难做到。1.3 一个典型信号链路的全貌实际项目中完整的链路是传感器输出的模拟小信号先经过LAT1545内部的放大和调制输出单bit码流DATA同时由MCU通过DFSDM提供调制时钟CLK。DFSDM收到DATA后按配置好的输入模式、时钟边沿、滤波类型、抽取率进行处理结果存入数据寄存器再通过DMA或者中断搬运到内存。应用层拿到的是已经还原好的24位数据直接做工程量转换即可。如果LAT1545还支持同步输出SYNC或者多个LAT1545级联DFSDM的输入配置会更复杂一些。我在第一次调试时只关注了DATA和CLK两条线忽略了SYNC信号导致多片LAT1545的采样时钟不同步信号还原出来后相位有偏差。这个坑后面会详细讲。2. DFSDM的四种输入模式到底该怎么选2.1 四种模式的原理和差异STM32的DFSDM外设标准型号通常支持四种输入模式外部输入模式External input、外部串行输入模式External serial input、内部级联输入模式Internal cascade input、内部串行输入模式Internal serial input。手册上写得比较官方实际选型时只要抓住一个核心问题你的调制器数据流是被动由DFSDM驱动时钟还是自己产生时钟并主动输出数据外部输入模式是最常用的适合LAT1545这类需要DFSDM提供时钟的调制器。DFSDM的DATINx引脚接收LAT1545输出的串行数据流CKOUT引脚输出时钟给LAT1545的CLK引脚。时钟的极性和频率都由DFSDM控制数据流与时钟同步可以在时钟上升沿或下降沿采样。外部串行输入模式的区别在于调制器自己有时钟数据流和时钟都已经同步好DFSDM只需要接收数据和时钟不需要自己产生CKOUT。这种模式适合那些内部自带时钟源的Sigma-Delta调制器或者前级已经有独立的时钟管理芯片的场景。缺点是DFSDM对输入时钟的质量要求较高时钟抖动直接影响采样性能。内部级联输入模式用于多个DFSDM滤波器级联比如第一个滤波器输出的结果作为第二个滤波器的输入用来实现更高阶的滤波或者更复杂的信号处理链。这种模式不接外部调制器属于DFSDM内部数据流的再处理日常单级采集基本用不到。内部串行输入模式则是把内部数据总线的数据当作串行码流输入通常用于测试或者处理来自其他外设的特殊数据流工程上应用最少。2.2 LAT1545适配哪种模式根据LAT1545典型应用结构滤波器时钟由外部提供数据输出与时钟同步且数据线上输出的就是调制器处理后的1-bit码流最适合的输入模式是外部输入模式。此时DFSDM作为主控方提供时钟LAT1545作为从属方接收时钟并输出数据时序关系简单清晰DFSDM采样时可以精确对齐时钟边沿。选择外部输入模式还有一个实际好处DFSDM的CKOUT频率可以通过配置寄存器精确控制不依赖外部晶振或振荡器的频率精度。LAT1545的调制器对时钟频率有一定的容忍范围只要DFSDM输出的时钟频率在LAT1545数据手册规定的工作范围内就能保证调制器正常工作。我们实测下来时钟频率在2.56MHz时效果最好此时滤波后的有效位数最高。2.3 选错模式会有什么现象如果误选了外部串行输入模式而LAT1545本身并没有独立的时钟输出DFSDM就会一直等待外部时钟数据寄存器永远不更新DMA也拿不到数据。反过来如果LAT1545有内部时钟却被配置成了外部输入模式DFSDM的CKOUT和LAT1545内部时钟会产生频率竞争数据流时序错乱滤波器输出的数据会周期性跳变表现为采集结果的噪声异常大甚至直接饱和。我在第一次调试时为了省事直接套用了其他项目的DFSDM配置把输入模式设成了外部串行输入结果LAT1545的码流一直在但DFSDM的DFSDM_FLT0xISR寄存器里始终没有数据就绪标志。排查了很久才发现是输入模式不匹配配置改成外部输入模式后数据立即正常了。这个坑值得记下来。3. 输入模式与关键参数的完整配置步骤3.1 CubeMX中的配置路径推荐先用STM32CubeMX做图形化配置生成基础工程后再按需修改。因为DFSDM的输入模式、时钟分频、滤波器参数之间存在关联手工直接写寄存器容易漏配。在CubeMX中选择DFSDM外设后首先是Channel标签页每个DFSDM通道对应一组输入引脚。需要选择输入模式为External input启用Channel并确保引脚分配正确。然后是Filter标签页每个滤波器绑定一个通道滤波器的阶数、类型、抽取率等参数在这里设置。关键配置项如下表所示这些参数直接影响信号还原的精度和效率配置项目可选值或范围推荐值/说明输入模式External input / External serial input / Internal cascade input / Internal serial input选择External input通道引脚DFSDM_DATINy / DFSDM_CKOUTy需分配实际引脚时钟源内部时钟 / 外部时钟通常选内部时钟时钟分频1~256根据LAT1545工作频率计算滤波器类型Sinc x 1 / Sinc x 2 / Sinc x 3一般选Sinc x 3抽取率FOSR1~1024根据目标输出数据率计算积分器抽取率IOSR1~256与FOSR配合数据格式MSB对齐 / LSB对齐一般选MSB对齐3.2 时钟频率的计算逻辑DFSDM的输入时钟一般来自芯片内部总线时钟例如APB2时钟。假设APB2时钟为80MHzDFSDM内部预分频为8则实际进入DFSDM模块的时钟为10MHz。再经过CKOUTDIV分频输出到LAT1545的时钟频率就是10MHz除以分频系数。LAT1545的典型工作时钟范围是1MHz到3.2MHz取2.56MHz比较适中。需要设置的分频系数就是10MHz除以2.56MHz约等于3.9实际取整数分频系数4得到2.5MHz的调制时钟。这个频率略低于理想值但Sigma-Delta调制器对时钟频率不敏感性能影响可以忽略。如果时钟源是80MHz的HSE直接分频可以先通过DFSDM的CLKIN选择器把时钟源切成PLL输出再用CKOUTDIV分频。调制时钟确定后需要确定滤波器参数。DFSDM内部滤波链的第一级是Sinc滤波器其抽取率由FOSR控制第二级是积分器抽取率由IOSR控制。最终的输出数据率等于调制时钟频率除以FOSR再除以IOSR。以2.5MHz调制时钟为目标输出500Hz数据率则FOSR和IOSR的乘积需要达到5000比如FOSR取50、IOSR取100或者FOSR取100、IOSR取50。这里要注意一个关键结论Sinc滤波器的通带纹波和阻带衰减与FOSR相关FOSR越大滤波效果越好但输出数据率会降低。所以在满足输出率要求的前提下尽量让FOSR大一些IOSR小一些这样信号带宽内的波动更小信纳比更高。我们在项目里多次调节发现FOSR64、IOSR39的组合比FOSR32、IOSR78的组合在关键频段内信纳比高出约1.2dB但FOSR不能无限大否则输出延迟明显增加。3.3 HAL库代码中映射的实际操作CubeMX生成的工程里核心初始化代码在mx_dfsdm1_init函数中。但CubeMX对DFSDM的部分高级配置支持不够灵活比如Sinc滤波器的阶数选择、时钟边沿极性等通常需要在用户代码里手动补充。实际初始化流程大致如下/* 配置DFSDM1 Channel 0为外部输入模式 */ static void MX_DFSDM1_Init(void) { dfsdm1_channel_handler.Instance DFSDM1_Channel0; dfsdm1_channel_handler.Init.OutputClock DFSDM_CHANNEL_OUTPUT_CLOCK_ENABLE; dfsdm1_channel_handler.Init.InputMode DFSDM_CHANNEL_INPUT_MODE_EXTERNAL; dfsdm1_channel_handler.Init.InputPolarity DFSDM_CHANNEL_INPUT_POLARITY_RISING; dfsdm1_channel_handler.Init.TriggerMode DFSDM_CHANNEL_TRIGGER_MODE_SW; HAL_DFSDM_ChannelInit(dfsdm1_channel_handler); } /* 配置DFSDM1 Filter 0为Sinc x 3滤波器 */ static void MX_DFSDM1_Filter0_Init(void) { dfsdm1_filter_handler.Instance DFSDM1_Filter0; dfsdm1_filter_handler.Init.RegularParam.Trigger DFSDM_FILTER_SW_TRIGGER; dfsdm1_filter_handler.Init.FilterParam.Order DFSDM_FILTER_SINC3; dfsdm1_filter_handler.Init.FilterParam.FOSR 64; dfsdm1_filter_handler.Init.FilterParam.IOSR 39; HAL_DFSDM_FilterInit(dfsdm1_filter_handler); }这里特别注意Init.InputMode字段取值必须是DFSDM_CHANNEL_INPUT_MODE_EXTERNAL而不是默认的DFSDM_CHANNEL_INPUT_MODE_INTERNAL。很多从旧项目复制代码的朋友就是栽在这里。此外InputPolarity字段决定DFSDM在时钟的哪个边沿采样数据。LAT1545的数据在时钟上升沿输出、下降沿稳定那么DFSDM就应该配置为下降沿采样即DFSDM_CHANNEL_INPUT_POLARITY_FALLING。如果极性和LAT1545不匹配接收到的码流虽然存在但滤波器输出的数据噪声会明显增大严重时信号完全失真。3.4 DMA方式的数据搬运配置高精度采集场景下数据输出率一般不高但需要连续采集中断方式频繁进ISR会消耗CPU资源。推荐用DMA循环模式搬运数据这样CPU几乎不参与数据搬运只在应用层消费数据即可。DMA配置需要注意数据宽度和方向。DFSDM的数据寄存器是32位的DMA搬运方向为从外设到内存外设地址固定内存地址递增数据宽度设为32位。DMA的循环模式开启后缓冲区满了会自动回绕保证数据持续写入缓冲区。static void MX_DMA_Init(void) { hdma_dfsdm1_filter0.Instance DMA1_Channel0; hdma_dfsdm1_filter0.Init.Request DMA_REQUEST_DFSDM1_FILTER0; hdma_dfsdm1_filter0.Init.Direction DMA_PERIPH_TO_MEMORY; hdma_dfsdm1_filter0.Init.PeriphInc DMA_PINC_DISABLE; hdma_dfsdm1_filter0.Init.MemInc DMA_MINC_ENABLE; hdma_dfsdm1_filter0.Init.PeriphDataAlignment DMA_PDATAALIGN_WORD; hdma_dfsdm1_filter0.Init.MemDataAlignment DMA_MDATAALIGN_WORD; hdma_dfsdm1_filter0.Init.Mode DMA_CIRCULAR; HAL_DMA_Init(hdma_dfsdm1_filter0); HAL_DMA_Start_IT(hdma_dfsdm1_filter0, (uint32_t)hdfsdm1_filter_handler.Instance-ISR, (uint32_t)dfsdm_buffer, BUFFER_SIZE); }DMA中断里只需要置一个标志位表示新数据已经就位主循环检测到标志后处理缓冲区即可。这种方式即使后续增加多路通道也只是增加DMA通道和缓冲区不会显著增加CPU负载。4. 实测中的信号异常与完整排查链路4.1 现象数据恒为0或者偶尔跳变LAT1545接入DFSDM后最常见的问题就是滤波结果恒为0或者数据偶尔跳一下然后回到0。这种问题从现象看很像LAT1545没有工作但用示波器测量LAT1545的数据输出引脚发现码流是正常的。此时问题大概率出在DFSDM的输入配置上而不是信号源上。排查链路建议按下面步骤走第一步读取DFSDM通道的输入状态寄存器确认码流是否真正到达DFSDM内部。DFSDM的通道状态寄存器里有时钟和数据引脚的实时电平状态如果数据引脚电平跟示波器测量一致说明引脚电平没有问题。第二步检查DFSDM的时钟输出是否正常。用示波器测量CKOUT引脚确认频率和占空比符合预期。如果CKOUT没有波形检查OutputClock使能位是否打开、时钟分频是否正确。第三步验证输入采样极性。在时钟极性配置错误时DFSDM会在数据未稳定的边沿采样导致采到的值几乎全是0。调整InputPolarity为相反边沿观察数据是否恢复。4.2 数据有值但噪声显著偏大数据有值但噪声大通常意味着系统正在拾取干扰或者DFSDM的滤波配置无法有效抑制Sigma-Delta量化噪声。LAT1545的调制器把大部分量化噪声推向高频DFSDM的Sinc滤波器必须恰好把这些高频噪声抑制掉否则噪声会混叠到低频表现就是数据方差大、有效位数低。如果确认LAT1545的模拟输入已经短接或者接稳定的参考电压但转换结果仍有较大的波动最可能的原因是FOSR/IOSR配置不合理。Sinc3滤波器在FOSR较小时阻带衰减不够高频量化噪声泄漏到基带。解决办法就是增加FOSR但同时要调整IOSR保持目标输出率不变。此外电源噪声也是一个常见的干扰源。DFSDM和LAT1545最好使用独立的LDO供电中间加磁珠隔离避免数字电源的高频噪声通过电源网络耦合进模拟前端。板卡上LAT1545的模拟电源引脚旁边必须加0.1uF和10uF去耦电容且尽量靠近引脚放置。我们做过对比测试把去耦电容从板卡边缘移到芯片引脚旁边后低频噪声峰值降低了接近1/3。4.3 数据率不对的排查输出数据率的误差通常来自时钟分频和抽取率的组合计算。很多人忘记DFSDM内部还有一个可选的时钟分频预分频器以为CKOUT输出的就是最终调制时钟。实际在有些型号上DFSDM内核时钟和输出时钟之间还有一级分频。检查寄存器实际值而不是依赖CubeMX的可视化界面显示是关键一步。排查时直接读取DFSDM_CH0CFGR1的CKOUTDIV字段和DFSDM_FLT0FCR的FOSR、IOSR字段手动计算当前配置下的输出数据率再和实际观察到的DMA中断频率对比就能定位是哪一个分频设置出了问题。4.4 多片LAT1545级联时的同步问题多片LAT1545同时采集时不同通道的DFSDM各自输出CKOUT即使配置完全一致由于芯片间时钟起始相位不同多通道数据之间会存在固定的相位偏移。对于只关心各通道独立幅值的应用这种偏移问题不大。但如果要做多通道之间的相位差分析或者用多个传感器信号做波束合成就必须处理同步问题。最简单的同步方案是让所有LAT1545共用一个时钟源从其中一个DFSDM通道的CKOUT引出时钟信号接到所有LAT1545的CLK引脚同时把所有LAT1545的SYNC引脚连接在一起由MCU的GPIO统一触发启动转换。这样每个通道的调制器在同一时钟沿工作多通道数据的相位关系就保持一致了。另一种方案是使用DFSDM内部的级联模式但级联更多用于滤波器的串联而不是多通道同步所以实际项目里还是优先用外置硬件同步方案。5. 从输入模式到信号质量的几个进阶细节5.1 时钟极性和数据稳定时间的匹配DFSDM对输入数据的采样边沿必须匹配LAT1545的数据输出时序。LAT1545的数据是在时钟上升沿之后延迟一段时间才稳定因此DFSDM必须在时钟下降沿采样才能保证采到的是稳定数据。如果配置成上升沿采样DFSDM有可能采到数据跳变过程中的中间态这在数字接口上虽然不常见但实际会引入额外误差。这个问题可以用示波器测量验证把LAT1545的CLK和DATA两路信号同时接到示波器上放大时间轴观察数据信号相对时钟边沿的建立时间和保持时间。如果数据在时钟上升沿后约几十纳秒才稳定那么DFSDM配置下降沿采样是安全的。实测中把极性和LAT1545匹配好后滤波输出的信纳比从约73dB提升到了接近85dB效果非常明显。5.2 Sinc滤波器阶数选择的权衡DFSDM支持Sinc1、Sinc2、Sinc3三种滤波器阶数。Sinc1结构最简单通带较宽但阻带衰减慢Sinc3阻带衰减快对带外噪声抑制好但通带边缘的跌落更明显。实际选择时如果目标是宽频带信号的高线性度Sinc1可能更合适如果目标是最小化带内噪声、最大化有效位数Sinc3是更稳妥的选择。以2.5MHz调制时钟、FOSR64为例Sinc3的第一零点在2.5MHz/64即约39kHz。也就是说39kHz附近及以上的噪声会被极大衰减。如果信号本身带宽在1kHz以内这个滤波性能完全够用如果信号带宽要到10kHz以上就需要适当降低FOSR并增加IOSR来拓宽通带但这会增加带内量化噪声。取舍原则是信号带宽越大FOSR相对越小有效位数相对越低。5.3 失调校准与增益校准DFSDM虽然内部没有硬件校准模块但高精度应用里建议在应用层做软件校准。最简单的方法是两点校准输入短接时采集零偏值输入一个已知精密参考电压时采集满量程值然后用线性映射修正输出。实测中发现DFSDM滤波器在上电初始阶段会有一段暂态过程输出的前几十个点不是稳态信号直接采集会污染平均值计算。解决方法是在DMA开始搬运后先丢弃固定数量的样本比如丢弃64个样本再开始累计有效数据。这个方法在项目里帮我们省去了很多无效数据的烦恼。5.4 抗混叠滤波的必要性Sigma-Delta调制器本身有过采样和噪声整形理论上不需要额外的模拟抗混叠滤波器因为输入信号带宽远低于调制时钟频率。但在强电磁环境下如果模拟输入端存在接近调制时钟整数倍的干扰信号这些干扰会折叠到基带Filter也无法完全消除。这种情况下在LAT1545前端加一个简单的RC低通滤波器截止频率设置在信号带宽的2至3倍可以有效抑制高频干扰折叠。我们项目里最开始没有加RC滤波采集结果偶发突变排查了很久才定位到是现场设备产生了与调制时钟接近的电磁干扰频率约为2.5MHz的整数倍。增加RC低通后突变消失数据稳定性明显提升。RC的取值不需要特别精确常见的是10kΩ电阻串联、1nF电容对地截止频率约16kHz满足大多数传感器信号带宽需求。5.5 极低功耗场景下的DFSDM时钟策略如果项目对功耗有严格要求比如电池供电的传感器节点DFSDM可以用较低频率的调制时钟来降低动态功耗。但Sigma-Delta系统的过采样比OSR与有效位数直接相关降低调制时钟会降低过采样比从而降低有效位数。这时需要在功耗和精度之间做取舍一般不建议把调制时钟降低到1MHz以下否则信纳比下降太快24位分辨率形同虚设。更合理的低功耗策略是间歇工作高速采集一小段时间然后把LAT1545和DFSDM全部关断只在需要时重新启动。DFSDM重新启动后需要等待滤波器暂态结束通常耗时在微秒级对慢速传感器应用完全可以接受。6. 扩展思路把DFSDM用得更深DFSDM不仅仅能接LAT1545这类单bit调制器还可以接多bit的Sigma-Delta调制器某些型号的DFSDM还支持曼彻斯特编码输入。曼彻斯特编码的优势是数据和时钟叠加在一根线上传输节省引脚。如果后续项目里选了支持曼彻斯特编码的传感器DFSDM输入模式的配置会变为Manchester模式此时时钟重建和数据采样都由DFSDM内部完成不再需要单独的CKOUT信号。这类模式对引脚时序更敏感建议在拿到实物后先用低速时钟验证确认无误再提高频率。多路并行采集方面DFSDM的多个通道可以独立配置但滤波器资源是共享的通道多了之后每个滤波器同一时间只能处理一路信号如果所有通道都要连续采集需要合理分配滤波器与通道的绑定关系。低采样率的通道可以多个共用一个滤波器通过时间片轮转或外部触发来分时复用代价是每个通道的采样率会被摊薄。对于真正需要多路同步高速采集的场景往往要选择滤波器资源更多的MCU型号或者在PCB设计时把多个DFSDM外设分布在不同的时钟域避免共同时钟产生的串扰。如果要把数据通过串口或以太网实时上送记得在DMA缓冲区和网络发送之间做双缓冲切换避免在拷贝缓冲区时造成数据撕裂。这个技巧和DFSDM本身无关但多通道高精度采集系统一旦跑起来数据量大、位宽高这个细节早晚会遇到。我在实际项目中还有一个体会第一次配置DFSDM时别急着把滤波器阶数调到最高、抽取率拉到最大先通过自测信号验证基本的数据通路。LAT1545的数据输出是否达到预期DFSDM的滤波器和抽取器组合是否正常这些基础功能确认无误后再逐步优化性能和参数。否则一旦出现问题排查范围会很大很难确定是信号源、通道配置还是滤波参数的问题。DFSDM配起来不难难的是理清输入模式、时钟、滤波器三者之间的关系。把外部输入模式、时钟分频、FOSR/IOSR这几个关键点一一确认LAT1545的码流就能稳定变成干净的24位数据。后续再遇到其他Sigma-Delta调制器只要按同样的思路走一遍基本都能顺利跑通。
返回列表