ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

信号带宽与上升沿的关系:从0.35系数到示波器选型与STM32捕获实践

信号带宽与上升沿的关系:从0.35系数到示波器选型与STM32捕获实践 这是一个非常经典的硬件基础问题但凡是做过数字电路、接口设计或者嵌入式开发的工程师迟早都会撞上它。我自己在刚工作那会儿就被一个“看起来没问题”的方波信号坑过当时用示波器一测上升沿和手册上写的完全对不上排查了半天最后才发现是示波器探头带宽不够把信号的真实边沿给“磨圆”了。从那以后我才真正把“信号带宽”和“上升沿”这两个词刻在脑子里。这篇内容我就围绕“信号带宽与上升沿的关系”这个核心把0.35系数怎么来的、怎么用、以及工程上那些容易踩的坑一次讲清楚。最后还会结合STM32CubeMX捕获上升沿的实操说说如何在单片机上准确测量这个参数。无论你是刚入门的学生还是已经工作几年的工程师这篇文章都值得花十分钟看完。1. 先搞清楚我们说的“带宽”和“上升沿”到底指什么很多朋友一上来就背公式带宽等于0.35除以上升时间。但如果你不知道这个公式是从哪来的、适用范围是什么那在工程上就会用得很虚。我见过不止一个同事拿着这个公式去推算示波器带宽结果选错了仪器测出来的数据完全没法用。所以咱们先把概念掰扯清楚。1.1 信号带宽不是“一个频率”而是一个范围所谓信号带宽严谨点说是指信号能量主要集中的频率范围。对于一个理想方波它是由基波加上无数个奇次谐波叠加而成的。基波决定了方波的大致形状而高次谐波决定了上升沿的陡峭程度。如果你把高次谐波滤掉了方波的边沿就会变缓甚至变成类似正弦波的形状。这里要特别注意任何一个真实的物理信号它的带宽都不可能无限大。我们说的信号带宽通常指从直流0Hz到某个频率上限的范围这个频率上限之外的分量对信号形状的影响可以忽略不计。对于数字电路里的方波或者矩形脉冲这个频率上限通常和上升沿的时间有直接关系。1.2 上升沿不是“一条竖线”而是有过程的理想方波的上升沿是一条垂直的线上升时间为0。但现实世界里任何电压的变化都需要时间因为电路里存在电阻、电容、电感还有芯片内部的驱动能力限制。上升沿一般定义为信号从低电平跳变到高电平过程中从幅值的10%上升到90%所需要的时间记作TrRise Time。也有不少场合用20%到80%来定义这取决于具体应用和测量标准。比如很多高速数字标准里就爱用20%-80%而传统的模拟电路分析里10%-90%更常见。这个细节后面会影响我们对公式系数的理解先有个印象。1.3 一个核心直觉上升沿越陡信号的高频分量越丰富这是理解两者关系的钥匙。想象两个信号一个是缓慢爬升的斜坡一个是几乎垂直跳变的阶跃。很明显阶跃信号变化更快、更剧烈它的频谱会延伸到非常高的频率而缓慢爬升的信号能量主要集中在低频段。换句话说上升沿的陡峭程度本质上反映了信号包含高频分量的多少。上升沿越陡需要的带宽越大上升沿越缓带宽要求就越低。这就是“信号带宽与上升沿的关系”最直观的物理图景。2. 0.35这个数字是怎么来的一阶RC模型的完整推演现在进入正题看看带宽和上升沿之间那个著名公式的推导过程。虽然很多文章直接给结论但我觉得还是有必要从RC模型出发走一遍这样你对公式的适用条件会有更清晰的认识。2.1 从一阶RC低通滤波器讲起我们假设一个最简单的RC低通电路一个电阻R串联一个电容C并联到地输入是理想阶跃信号输出是电容两端的电压。这个电路的-3dB截止频率也就是带宽为f_H 1 / (2πRC)对于这个电路当输入一个理想的阶跃信号时输出电压的表达式是一个指数上升过程。从10%上升到90%所需的时间可以通过指数方程推导。电压从0跳到10%的时间大约为0.1倍的时间常数τRC从0跳到90%的时间大约为2.3倍的时间常数。两者相减就能得到上升时间约为2.2τ。把τRC代入也就是Tr ≈ 2.2 / (2π f_H)。计算一下2.2除以2π结果大约是0.35。这就是0.35系数的来源。2.2 公式的完整形式Tr × BW ≈ 0.35所以对一阶RC系统来说信号上升时间与系统带宽的乘积大约等于0.35这个常数。这就是所谓的“带宽-上升时间积”。工程上我们经常进行反向使用。如果已知一个系统比如示波器、探头的带宽就可以估算出这个系统对输入信号上升沿的响应时间反过来如果已知信号的上升沿也可以估算出信号的有效带宽从而判断测量设备是否够用。2.3 现实世界的修正0.35还是0.4还是0.5我在实际工作中发现很多人对这个系数有疑惑为什么有的地方写0.35有的地方写0.4甚至还有写0.5的其实这个差异主要来源于两方面。第一系统阶数不同。真实的示波器、探头或放大器不是理想的一阶RC系统往往是二阶或更高阶的系统。高阶系统的幅频响应在截止频率附近更“陡峭”同样带宽下它的上升时间会更短。因此实测的Tr × BW乘积会偏小一些比如0.4、0.45。更高阶的系统这个乘积可能接近0.35以下但很少低于0.3。第二上升沿定义不同。前面提过上升沿有10%-90%和20%-80%两种定义。20%-80%测出来的时间自然比10%-90%要短所以对应的系数也要相应调整。一般认为Tr(20%-80%) ≈ 0.8 × Tr(10%-90%)。因此如果你用的是20%-80%定义乘积极限从0.35变成了大约0.28。第三测量设备的“真实带宽”只是个标称值。很多示波器的带宽是设计指标实际频率响应曲线并不是理想的砖墙式滤波器在通带内也可能存在起伏。所以用一个常数去精确描述所有系统是不现实的。0.35是一个工程估算的出发点不是物理定律。2.4 补充高斯响应与平坦响应说到示波器还会遇到高斯响应和最大平坦响应两种频率响应类型。老式的模拟示波器多为高斯响应它在-3dB点之后下降比较缓慢所以即使信号频率超过带宽波形依然能显示只是幅度被衰减了但同时也意味着上升沿的显示会偏缓。现代数字示波器很多采用最大平坦或类似响应带外衰减更快显示出来的上升沿更接近真实。这两种响应对应的Tr × BW系数也不同工程估算时对高斯响应系统取0.35比较合适对平坦响应系统可以取0.4甚至更高。这也是为什么有些手册会给出0.4或0.45的经验值。3. 从公式到示波器怎么选带宽才能测准上升沿理解了公式的来源接下来就该用它解决实际问题了。我敢说大部分人第一次接触到这个公式都是因为示波器选型或者测量结果存疑。这一节咱们就专门聊聊示波器测量这件事。3.1 示波器带宽对测量结果的影响示波器本身就是一个测量系统它有自己的带宽限制。如果你的示波器带宽不够那么即使被测信号的真实上升沿非常陡峭示波器显示出来的上升沿也会被仪器自身的响应拉长。换句话说你看到的上升沿是信号真实上升沿和示波器自身上升沿的某种“叠加”结果。这个“叠加”不是简单的算术加法。如果假设信号真实上升时间和示波器上升时间都符合高斯分布一阶RC模型那么示波器显示出来的上升时间约为两者平方和后开根号即Tr_display ≈ √(Tr_signal² Tr_scope²)其中Tr_scope 0.35 / BW_scope。这个公式非常好用它可以用来估算测量误差。举个例子假设被测信号上升沿为1ns你用一台带宽500MHz的示波器测量示波器自身上升时间为0.35/500MHz0.7ns。那么显示出来的上升沿为√(1²0.7²)1.22ns误差大约22%。这就是为什么很多示波器厂商会建议要准确测量某个上升沿示波器本身的上升时间应该比信号快3到5倍也就是示波器带宽应该是信号带宽的3到5倍。3.2 实测案例一台100MHz示波器测10ns上升沿够不够我们来算一笔账。假设被测信号上升沿Tr_signal10ns用100MHz带宽的示波器测示波器自身的上升时间Tr_scope0.35/100MHz3.5ns。按照平方和公式显示出来的上升沿≈√(10²3.5²)10.6ns。误差约为6%还算可以接受。但如果被测信号上升沿是2ns同样用100MHz示波器测Tr_scope3.5ns显示值≈√(2²3.5²)4.03ns误差超过100%。这种情况下测出来的上升沿完全不能反映真实信号只反映示波器自身的响应。所以很多人拿低频示波器测高速信号测出来的边沿其实是示波器的“锅”不是信号本身的质量问题。从这里也能看出工程上“3到5倍法则”并不过分。对于测量上升沿这个需求示波器带宽宁高勿低。当然带宽越高价格越贵噪声也可能更大这是一个需要权衡的问题。3.3 探头的影响为什么带宽够了还是测不准光看主机带宽还不行探头同样是测量链路的重要一环。很多朋友忽略了探头带宽结果主机是1GHz的探头却只有100MHz那整条测量链路就被探头卡住了脖子。示波器探头也有自己的上升时间整条链路的上升时间要按照平方和关系把探头也加进去即Tr_total ≈ √(Tr_signal² Tr_probe² Tr_scope²)我建议在测量高频信号时至少保证探头带宽和示波器带宽在同一水平。同时要关注探头的输入电容。高带宽的无源探头输入电容通常较小但低带宽探头如100MHz输入电容可能达到10pF以上这会对待测电路产生额外的负载效应导致信号边缘变缓。这种情况下示波器测到的上升沿可能比信号实际更慢但这个变慢是探头把信号“拖慢”了而不是示波器显示问题。所以用低带宽高电容探头去测高速数字信号本身就是一种信号失真操作。3.4 一个容易忽略的点测量上升沿时的采样率与存储深度数字示波器还有一个关键参数采样率。根据奈奎斯特定理采样率至少是信号最高频率的两倍工程上为了精确重构上升沿建议采样率是信号带宽的5到10倍以上。现在的数字示波器一般都有“峰值检测”模式在高采样率下可以捕捉到很窄的毛刺但如果你存得不够深时基拉得太大等效采样率会下降这会直接影响上升沿测量的精度。而且示波器测量上升沿时需要准确捕捉到10%和90%两个点。如果采样点太少内插算法会带来误差。所以我个人习惯是测上升沿时把时基设小让屏幕上就显示一个到几个完整的上升沿这样采样率最高测量结果最可靠。这是从实操中总结出来的一个细节很多人根本没想到。3.5 借助示波器测量结果反推信号带宽上面提到示波器带宽要大于信号带宽但实际中还有一个反向用法——用已知带宽的示波器去测量信号上升沿然后推算信号本身的等效带宽。假设我们用一台带宽足够高的示波器比如2GHz去测量一个信号的上升沿测得的Tr_display 1ns。由于示波器自身上升时间只有0.175ns远小于信号上升沿所以可以近似认为信号真实上升沿就是1ns。那么这个信号的等效带宽约等于0.35 / 1ns 350MHz。这也是一种常用的信号完整性估算方法。比如你在PCB设计阶段想知道自己的驱动芯片输出信号的带宽范围就可以读取芯片数据手册中的上升沿指标然后用这个公式去估算信号带宽。以此作为传输线设计、信号滤波设计的参考依据。要注意这里算出来的是“等效带宽”不是信号唯一的频率描述但它对工程判断已经足够有指导意义。4. 从信号完整性看带宽为什么要关心上升沿带来的“高频能量”做高速数字设计的朋友对“信号完整性”这个词一定不陌生。信号完整性问题的根源往往不是基频而是上升沿产生的高频分量。所以这一节咱们跳出示波器从PCB设计和系统角度聊聊这个关系。4.1 方波信号的频谱到底延伸到多高很多人把“信号频率”等同于时钟频率这其实是片面的。一个100MHz的方波时钟它的频谱并不止于100MHz。由于上升沿的存在它的有效能量可以扩展到几百MHz甚至几GHz具体取决于上升沿的陡峭程度。工程上常用一个经验法则数字信号的“有效带宽”约为0.35/Tr与前面的一致也有些人用0.5/Tr来估算更高速信号的 -20dB 带宽。假设一个时钟信号上升沿为1ns那么它的有效带宽大约350MHz到500MHz。这意味着在PCB设计时你的走线、连接器、过孔等所有互连结构都要对这个频段的信号保持较好的传输特性否则上升沿就会被劣化。4.2 上升沿变缓、过冲和振铃带宽受限的直接后果当信号在传输路径上遇到带宽限制比如PCB走线的寄生电容、过孔的寄生电感、连接器的不连续阻抗高频分量会被衰减或反射。最直接的表现就是上升沿变缓同时可能在边沿处出现过冲、振铃等现象。这些都会影响接收端的电平判断时序严重时导致数据采样出错。从这个角度看“信号带宽与上升沿的关系”就不只是理论问题了它是信号完整性设计的日常。你要保证从驱动端、传输通道到接收端整个链路的带宽都足够支持信号的上升沿。否则哪怕你的芯片本身驱动能力很强经过一段劣化的PCB走线之后信号也会变“肉”。4.3 工程估算根据上升沿判断是否需要做阻抗匹配很多工程师在设计初期会问我这信号频率只有10MHz需不需要做阻抗控制我的回答一般是不要看频率要看上升沿。比如一个10MHz的信号如果上升沿只有2ns那么它的等效带宽大约175MHz。在这种情况下如果PCB走线长度超过了信号有效波长的一小部分经验法则是走线长度超过上升沿对应空间长度的1/6就需要考虑传输线效应做阻抗匹配和回流路径设计。怎么理解呢可以估算一下2ns上升沿在FR4板材中的空间传播距离大约为15cm约为光速的一半乘以时间。走线要是到了两三厘米以上反射效应就开始明显了。这个估算方法非常快速实用我每次画板之前都会大致算一下心里有数。4.4 驱动能力与上升沿的真实关系芯片的驱动能力直接决定输出上升沿。一般来说推挽输出级的上管导通电阻越小输出电流能力越强对负载电容的充放电越快上升沿就越陡峭。但是芯片厂商不会无限把上升沿做快因为过快的上升沿会带来更严重的EMI问题、串扰问题和反射问题。这就形成了一个工程上的平衡。你需要查看芯片数据手册里的上升沿指标计算它对应的等效带宽。如果你的系统对EMI比较敏感可以选择上升沿稍缓的器件如果你需要更陡峭的边沿来提高时序裕量就要确保PCB链路能支持这个带宽。4.5 滤波器设计中的带宽-上升沿权衡在模拟电路和电源设计中上升沿与带宽的关系同样重要。举个例子很多传感器信号需要经过低通滤波器来滤除高频噪声。如果滤波器带宽设置得太低虽然噪声被抑制了但有用信号中的快速变化即上升沿也会被拉缓影响系统对快速事件的响应能力。这就是一个经典的权衡滤波器的-3dB截止频率决定了系统能通过的最高频率分量也就是系统带宽。而系统带宽又决定了输出信号可以达到的最小上升时间。设计滤波器时要根据信号的有效带宽来选择截止频率既要滤掉噪声又要保证上升沿不过分退化。通常我会把滤波器截止频率设置在信号等效带宽的1.5到3倍左右具体看系统对噪声和响应速度的要求。5. 用单片机实测上升沿STM32CubeMX配置与代码实现理论讲完了咱们落地到实际。很多做嵌入式开发的朋友会遇到这样的需求测一个外部信号的脉宽、周期或者捕获一个信号的上升沿时刻。这个操作在STM32上很常见尤其是用CubeMX生成工程后配置定时器的输入捕获模式。最后这部分我就把整个流程拆开细讲包括配置要点和代码示例。5.1 输入捕获和外部中断选哪个单片机检测上升沿通常有两条路线一是用外部中断EXTI在上升沿触发中断服务函数在中断里用定时器读取当前计数值二是用定时器的输入捕获模式硬件自动检测边沿并记录定时器计数值同时触发中断。我的建议是如果只是简单触发并且对时间精度要求不高外部中断就够了。但如果要精确测量脉冲宽度、周期或者连续捕获多个上升沿之间的时间间隔一定要用定时器输入捕获。原因很简单外部中断进中断服务函数有延迟代码执行时间不确定会引入抖动而输入捕获是硬件行为在边沿到来的瞬间定时器计数器值被硬件锁存到捕获寄存器这个时刻是非常准确的。5.2 CubeMX配置流程一步步来做下面我们以STM32F103系列为例配置一个定时器的输入捕获通道。打开STM32CubeMX我做以下操作首先选择定时器TIM2将Channel 1设置为“Input Capture direct mode”也就是直接输入捕获模式这意味着PA0或者其他映射引脚作为捕获输入引脚。然后进入参数设置界面。预分频器(Prescaler)和计数器周期(Period)这里需要根据你要测量的信号频率范围来算。如果测一个大约1kHz的信号系统时钟72MHz要保证计数器不溢出至少计时周期要大于一个信号周期。粗算一下72MHz分频如果预分频设为71计数时钟就是1MHz计数器每微秒加1。如果计数器周期设为6553516位最大值那么最大计时65.535ms足够覆盖1kHz信号周期了。你可以根据实际信号频率调整这两个参数。关键的一步是把输入捕获的“Polarity Selection”设为“Rising Edge”即只在上升沿触发捕获。然后“Input Filter Value”这项可以根据需要配置如果信号有抖动可以设置一个较小的滤波值比如设为4或8相当于在上升沿后加了一个数字滤波窗口减少毛刺误触发。最后在NVIC设置里开启TIM2捕获中断。生成工程代码就基本成型了。5.3 代码逻辑与中断处理示例下面是我在实际项目中验证过的简化代码结构。在定时器捕获中断回调函数里读取触发上升沿时的计数器值并与上一次记录的计数值作差就能得到两个上升沿之间的时间间隔也就是信号周期。/* 在定时器中断回调中处理捕获 */ volatile uint32_t capture_prev 0; volatile uint32_t capture_diff 0; volatile uint8_t capture_flag 0; void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) { if (htim-Instance TIM2) { uint32_t capture_now HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1); /* 注意处理计数器回绕的情况 */ if (capture_now capture_prev) { capture_diff capture_now - capture_prev; } else { /* 计数器回绕需要加上计数周期 */ capture_diff capture_now (65535 - capture_prev); } capture_prev capture_now; capture_flag 1; } }这段代码的核心思想是连续捕捉上升沿每次中断时计算与上一次上升沿的差值。由于输入捕获是硬件锁存的所以得到的时间间隔非常准误差通常只有计数器时钟周期级别。在这里预分频为71时计数时钟是1MHz所以差值就是微秒数。主循环里你可以检查capture_flag一旦置位就读取capture_diff再根据定时器时钟频率换算成真实时间然后做平均滤波或者其他数字处理。这里要注意如果信号频率特别高中断间隔太短主循环来不及处理就要考虑用环形缓冲区存放多段数据或者提高预分频降低中断频率。但归根结底捕获本身是准的数据处理可以异步做。5.4 利用上升沿测量脉宽小心“边沿太慢”造成的影响这里要特别点名一个细节它和本文主题直接相关。用MCU捕获上升沿并不是只看“上升沿”三个字就行了。如果被测信号上升沿非常缓慢比如经过了RC滤波器上升时间长达几微秒那么输入引脚的电平在阈值附近会徘徊很久。这时候输入捕获模块检测边沿的时刻取决于施密特触发器或比较器的阈值电压而不是你心里想的“信号真正开始跳变的那个时刻”。不同环境下温度、电压变化可能使阈值点漂移导致捕获到的上升沿时刻抖动。解决办法有三个方向。第一保证输入信号上升沿足够陡峭必要时用比较器、施密特触发器芯片或者加一个74HC14之类的整形电路把缓变信号变成陡峭的方波再送入MCU。第二使用内部数字滤波器滤除毛刺但滤波值会引入固定的延时对周期测量影响不大对相位测量就要注意了。第三如果一个信号既要测上升沿又要测高电平时间可以配置同一个定时器的两个通道一个捕获上升沿另一个捕获下降沿这样可以得到精确的高电平脉宽。5.5 实测心得从捕获数据反推信号带宽我在做电机转速测量时就经常用到这个方法。电机霍尔传感器输出一个频率随转速变化的方波信号我需要精确测量它的周期。霍尔信号本身经过上拉电阻和电机转动产生的感应电压整形上升沿不算太陡但好在频率不高。实际上我通常会把霍尔信号先通过一个施密特触发器整形再送入单片机。这样捕获到的上升沿时刻非常稳定测量的转速误差可以控制在很小范围。这时候如果你想验证信号的带宽完全可以用前面讲的公式用示波器测出整形后的上升沿假设为20ns那么等效带宽约为0.35/20ns17.5MHz。对于这类信号普通的MCU引脚输入捕获毫无压力但如果信号上升沿达到了纳秒级你就要考虑引脚寄生电容和走线长度的影响了。5.6 常见问题速查CubeMX配置与捕获异常的排查在配置环路和调试过程中我整理了几个高频问题做成快速查找表。现象可能原因排查方向捕获中断不触发引脚映射错误或极性配置错误检查CubeMX引脚复用配置确认上升沿极性捕获值一直为0定时器未启动或预分频设置过大检查定时器时钟源及参数配置确认计数使能计算出的时间偏大或偏小预分频计算错误或时钟源不同确认系统时钟频率核对预分频器数值换算单位多次捕获抖动大输入信号上升沿太缓或带毛刺加施密特整形或增大数字滤波值但注意延时高速信号时丢捕获中断处理时间过长或计数器溢出降低中断频率、使用DMA或环形缓冲必要时用高分辨率定时器关于计数器回绕16位定时器核实时要注意。如果测量的信号周期接近65.535ms在1MHz计数时钟下就要换用32位定时器或者把预分频调大确保安全裕量。不要等到数据跳变才去查。5.7 进阶技巧用DMA方式捕获多个上升沿如果你需要连续测量多个上升沿的时间戳频繁进出中断会耗费CPU资源而且中断延迟可能带来时序抖动。STM32的定时器捕获还有一个高级玩法利用DMA把捕获寄存器的值自动搬移到内存数组里完全不占用CPU。配置方法也很直接在CubeMX中开启定时器输入捕获的同时在DMA设置里添加TIM_CH1的DMA请求方向设为“PeripheralToMemory”然后在代码里调用HAL_TIM_IC_Start_DMA()。这样做的好处是DMA会自动记录一系列上升沿的时间戳你可以在主循环中批量处理这些数据计算周期、频率、抖动等参数。这个方案在测量PWM信号的频率和脉宽时非常实用也是我调试电机控制算法时的常用手段。6. 总结几个我的实战建议这些内容写下来其实就是把“信号带宽与上升沿的关系”从理论到应用串了一条线。最后分享几点个人经验不算总结算是一些实在的提醒。第一在测量任何数字信号之前先算一下信号上升沿对应的等效带宽再倒推示波器和探头的带宽是否足够。不要因为信号频率低就掉以轻心。带宽不够测出来的上升沿不是信号的真实情况而是测量系统的响应。第二在PCB设计阶段把上升沿作为规划走线和阻抗控制的重要依据。判断是否需要端接、是否需要做阻抗匹配不要只看时钟频率还要看上升沿。一个上升沿很快的“低频信号”同样可能引发反射和振铃。这里要强调所谓“低频”往往只是基频低边沿对应的谐波分量一点也不低。第三用单片机捕获上升沿时先确认输入信号的边沿质量。如果边沿太缓误差会来自信号本身而不是MCU的捕获机制。必要时加整形电路这是最简单又最有效的方法。第四不要死记0.35这个数。明白它的推导过程知道它的假设条件是高斯响应系统适用范围是工程估算那么当你遇到0.4、0.45或者20%-80%定义时就不会觉得矛盾。工程里的常数都是有一个适用边界的。如果你把这几个点都吃透了再回头去看那些“上升沿太慢导致系统故障”的案例基本一眼就能看出症结所在。这也是我觉得这个看似基础的话题值得反复咀嚼的原因。它不只是教科书里的一个公式而是从示波器操作到高速PCB设计再到嵌入式采集贯穿整个硬件链路的核心问题。
返回列表