资讯详情

STM32G474 HRTIM触发ADC中间时刻采样实战:避开PWM开关噪声

📅 2026/10/16 14:53:02 | 华诺云谱 👁 阅读
STM32G474 HRTIM触发ADC中间时刻采样实战:避开PWM开关噪声
简介基于STM32G474的HRTIM触发多路ADC采样工程包面向需要处理PWM开关噪声的嵌入式开发者。工程在NUCLEO-G474RE官方开发板上验证使用CubeIDE完成配置与调试实现HRTIM事件触发多路ADC、DMA自动搬运以及串口打印显示从而在PWM中间时刻完成采样有效避开开关噪声。资源共281个文件压缩包约15.64MB核心文件以C源码和H头文件为主另有CubeIDE工程配置、IOC图形化配置、链接脚本、启动文件、编译依赖及ELF调试文件目录结构清晰便于直接导入与二次修改。工程代码按HAL库模块划分定时器、ADC、DMA与串口外设相对独立适合对照参考手册精读帮助梳理外设间触发与传输关系已有1252人学习参考适合需要快速上手STM32G4高精度定时器的开发者借助该工程可理解采样时刻与PWM同步的关键细节也可作为电机控制、数字电源等高频开关场景下的实用起步模板。1. PWM 中间时刻采样为什么值得用 HRTIM 把 ADC“钉”在开关周期中点STM32G474 这类带高分辨率定时器的 MCU 在电机驱动、数字电源里最常见的用法就是把 PWM 输出、ADC 采样和 DMA 搬运连成一条硬件链路。只要你的控制环需要“在 PWM 开关噪声里捞回干净的模拟量”就绕不开这个组合HRTIM 产生中间时刻触发脉冲ADC 被这个事件拉起采样DMA 把转换结果搬走最终从串口打印出来。这篇文章把整条链路拆开讲清楚每个外设承担什么职责、参数怎么设以及最容易被忽略的时序坑。适合正在调电流环或电压环、发现采集值总是带毛刺的开发者也适合想从“定时器中断里采 ADC”升级到硬件触发链路的人。2. 采样时机的选择把开关噪声与有用信号按时间分开2.1 开关噪声为什么集中在 PWM 边沿而非导通区间PWM 驱动功率管时电流换向发生在输出电平翻转的瞬间也就是 PWM 的上升沿和下降沿。此时电压和电流变化率最高回路寄生电感会激发出高频振铃。如果 ADC 采样触发时刻落在边沿附近振铃分量就直接叠加到模拟输入上采集到的电压可能比实际值高出几十毫伏甚至更多。这在高带宽电流采样场景下尤其致命采样电阻上的信号本来就小振铃一叠进来控制环误以为真实电流发生了突变环路就容易啸叫或振荡。避开边沿的方式很多最简单也最划算的是“取中点”把采样时刻固定在 PWM 周期的一半离上升沿和下降沿都尽可能远。稳定占空比下中点时刻落在导通区间内部电流已经趋于平坦采样点离开关瞬变最远信噪比最好。这里有个容易被新手忽略的前提中点必须定义清楚。多数情况下我选定时器向上计数模式输出电平在计数到比较值时翻转这样“中间时刻”就是比较值等于周期计数值一半的位置。中心对齐计数模式下因为要先向上计数再向下计数PWM 输出翻转点往往出现在计数值等于比较值的前后两个位置中间点就不是简单地把比较值设成一半了。我在实际项目中更常用中心对齐模式做电机控制因为输出纹波更小但 ADC 触发又不能直接放在计数序列的顶端。所以关键问题是你要的是 PWM 输出中点还是计数值中点这两个不是一回事。输出中点对应的是“从上升沿到下降沿的中间点”它取决于占空比而计数值中点是固定的 T/2。标题里说的“PWM 中间时刻采样”我倾向于理解成计数值中点也就是当计数器的值走到周期一半时必定离两个边沿同样远与占空比无关。2.2 周期中点采样一个比较值就能决定采样窗口固定 PWM 周期后计数器的计数范围决定了周期。向上计数模式里计数器从 0 数到 period再回 0周期就是 (period1) 个计数时钟。中间点就在 period/2 附近。HRTIM 里的每个定时器子单元都配有一组比较寄存器把其中一个比较值设成这个中点计数器走到这里就会产生一个比较事件。这个事件既可以去触发 PWM 输出翻转也可以单独作为 ADC 的触发源。这里的设计点在于比较事件有多个资源去向配置时要把“输出到引脚”和“输出到内部触发矩阵”分开使能否则你会发现自己明明设好了比较值ADC 却毫无反应。计算方式并不复杂。假设 HRTIM 的定时器时钟是 H 赫兹PWM 频率是 F那么一个周期的时钟计数个数就是 H/F。这里我一般直接用整数运算避免浮点数在配置环节引入误差#define HRTIM_TIMER_CK_HZ 240000000UL // 定时器时钟 #define PWM_FREQ_HZ 50000UL // 20us 周期PWM 频率 50kHz uint32_t period_ticks HRTIM_TIMER_CK_HZ / PWM_FREQ_HZ; // 4800 tick uint32_t compare_mid period_ticks 1; // 2400 tick这段代码先把 PWM 频率换成了计数器里的周期跨度再右移一位取一半。注意这里没有减一因为在中间时刻比较值取“计数等于 2400”和“计数等于 2399”效果几乎一样差别只有一个计数时钟。对于固定频率固定占空比应用可以不做微调但对于后续要补偿 HRTIM 到 ADC 的触发延迟我会把比较值往前挪也就是把 2400 减掉一个延迟对应的 tick 数而不是直接挪触发时刻。如果你用的是中心对齐计数模式周期跨度是向上加向下的完整路程count-up 的中点就不是简单的 period/2。我在拆一个跨平台模拟项目时踩过一次把向上计数模式里验证好的比较值直接搬到中心对齐模式结果实际采样点偏离中断点约四分之一周期等发现时已经过去半天。后面章节会专门说这个坑。2.3 为什么不用高级定时器中断硬件直连和低延迟是硬指标另一个被反复问到的方案是用高级定时器更新中断在中断回调里启动 ADC 转换。这个方案能跑但有一个很难绕开的时序问题从比较事件产生到中断服务函数里执行 HAL_ADC_Start_IT中间要经历中断响应、现场保存、寄存器读写几百纳秒甚至上微秒都是正常的。而在高频 PWM 下半个周期可能只有一两微秒长中断延迟很容易吃掉大半的采样窗口而且延迟是波动的采样点在不同周期里会抖。HRTIM 直接触发 ADC 则完全绕开了软件介入比较事件经过内部触发矩阵完成映射延迟是固定的硬件路径延时。更重要的是多路 ADC 可以共享同一个比较事件所有通道都在同一个硬件时刻被触发多路采样的时间参考点完全一致。对“同时采样三相电流”这类需求来说这是中断方案永远做不到的中断里依次启动 ADC1、ADC2、ADC3即使中断服务里没有多余指令每启动一个转换之间也会差几十纳秒这几十纳秒在 PWM 开关周期里足以让你看到相位差。我一般会在项目方案阶段就确认“这路 ADC 采样是否属于环路控制的一部分”。如果是直接上硬件触发如果只是监控母线上电缓启动的电压趋势低频采样就行用普通定时器中断反而简单。但别用定时器中断去模仿高速采样因为中断响应时间本身就是个浮动黑匣子出了问题很难定位是任务调度导致的还是隔离栅极驱动导致的。触发链路的另一个隐藏好处是ADC 转换完成可以触发 DMADMA 传输完成又能触发中断通知 CPU。也就是说CPU 只负责中间处理数据采样时刻完全由硬件钉死这种设计让控制环的一致性和确定性都更容易保证。下面开始拆触发链路。3. STM32G474 触发链路HRTIM、ADC 与 DMA 的角色分工3.1 链路总览比较事件 → 触发脉冲 → ADC 启动 → DMA 搬走要理解这条路可以先把它看成一条有四个环节的流水线。HRTIM 的某个定时器子单元比如 TIMA计数器工作过程中比较寄存器与计数器相等时产生比较事件。这个事件经过触发路由变成 ADC 的外部触发脉冲。ADC 收到脉冲后按预先配置好的注入组或规则组序列执行转换。转换结果寄存器一旦更新位于数据寄存器后方的 DMA 通道就会把结果搬到内存缓冲区。后续串口只是个消费端把内存里的原始二进制数据换算成工程值再显示。多路 ADC 的含义在这里需要澄清。STM32G474 有多个独立 ADC 内核每个可以有自己的触发源也可以共享同一个触发源。如果你说的是“一个 ADC 连续采很多个通道”那是规则组/注入组序列如果你说的是“多个 ADC 各自采一个通道然后同时比较”那就要把它们的外部触发源都指向同一个 HRTIM 比较事件。这两种方案的时序差别很大单个 ADC 内多通道是排队转换通道 1 转完才轮到通道 2通道之间天然有时间偏移多个 ADC 同步触发则能保证同一时刻的多个电压点被同时采样。我用一个表格把常见组合列清楚方便你对照自己的硬件需求推荐组合时序特征三个电流采样点需同一时刻获取多 ADC 内核同一 HRTIM 事件同步触发硬件同步通道间偏移极小同一母线上多条电压监测单 ADC 规则组多通道 DMA顺序转换适合低频监控电流环 电压环同时跑HRTIM 多个子单元各自触发 ADC1/ADC2可人为错开采样点如果你要做的是高带宽电流环尽量选第一行把 ADC2、ADC3 的触发源都挂在 TIMA 的同一个比较事件上。3.2 HRTIM 侧配置把比较事件映射到 ADC 触发源HRTIM 的每个定时器子单元都能产生多个输出触发事件比如计数器相等、周期事件、复位事件。ADC 外部触发源选择正确后还需要在 HRTIM 内部把那个比较事件“推出去”。这一步最常见的问题是只配了比较值没使能输出触发导致事件被丢弃在内部。// hrtim_trigger.c - HRTIM TIMA 比较事件的触发输出使能 __HAL_HRTIM_SETPERIOD(hhrtim1, HRTIM_TIMERINDEX_TIMER_A, period_ticks - 1); __HAL_HRTIM_SETCOMPARE(hhrtim1, HRTIM_TIMERINDEX_TIMER_A, compare_mid); // 使能 TIMA 比较 1 事件作为对外触发脉冲 // 寄存器位名在不同代次芯片上有差异以数据手册的 ADCTrigger 描述为准 hhrtim1.Instance-sTimaRegs.ADCTrigger.OUTCMP1R | HRTIM_OUTCMP1R_CMP1;这段代码里前两步还是在设周期和比较值真正关键的是第三行操作的是 TIMA 子单元的输出触发寄存器把 CMP1 事件标记成可对外输出的触发源。如果你用的是 CubeMX 图形化配置等效操作是在 HRTIM1 的配置页面里找 “Output Trigger” 类似选项把某个比较事件勾选为触发源。这里我建议你打开芯片手册翻到 HRTIM ADC Trigger 那个小节把位域名对照一下因为不同系列的库封装会改写宏名直接搬代码容易踩到编译错。逻辑不复杂但顺序很重要先设比较值再使能触发输出最后在 ADC 侧选择外部触发源。如果顺序反了ADC 那边会一直等一个永远不会来的边沿表现就是采样数据完全不变或者只有软件触发能出数据。3.3 ADC 侧配置序列、通道与外部触发源的对应关系ADC 侧配置可以分为两块触发源选择以及转换序列组织。触发源选择在 ADC 初始化里完成STM32G474 的 ADC 外部触发源可以把 HRTIM 的触发信号映射过来。映射关系通常一组一组地写在手册的触发源表里比如规则组外部触发源可能是 HRTIM_TIMA_TRGO注入组则对应另一个触发名称。// adc1_init.c - 规则组外部触发配置要点 hadc1.Init.ExternalTrigConv ADC_EXTERNAL_TRIGCONV_HRTIM_TIMA_TRGO; hadc1.Init.ExternalTrigConvEdge ADC_EXTERNAL_TRIGCONVEDGE_RISING; hadc1.Init.ContinuousConvMode DISABLE; hadc1.Init.Overrun ADC_OVR_DATA_OVERWRITE;参数说明上ExternalTrigConvEdge 选择上升沿触发也就是 HRTIM 比较事件由低到高的瞬间开机。ContinuousConvMode 必须关掉否则 ADC 会自己连续不停地转硬件触发边沿就失去意义了。Overrun 我习惯设成覆盖这样即使 DMA 稍有延迟数据寄存器里至少是最新的结果不会保留陈旧值。转换序列组织这部分要结合“多路”场景看。多路同步采样时每个 ADC 都只承担一个通道序列可以短至 1 个转换多路顺序采样时一个 ADC 要把多个通道塞进序列DMA 搬运的顺序必须与序列顺序完全一致否则打印出来的数据会串位。我一般在代码里维护一个通道枚举与 DMA 缓冲下标一一对应这样后续加通道时不容易漏改。3.4 DMA 与串口数据从内存到串口显示的职责边界ADC 转换完成后结果放在 32 位的数据寄存器里实际有效数据是低 16 位。DMA 的任务就是把这块数据按固定节奏搬进内存。配置时需要注意数据源地址是 ADC 的数据寄存器地址目标是内存缓冲方向是外设到内存数据宽度设成半字。// dma_adc.c - ADC1 规则转换结果的 DMA 搬运 hDmaAdc.Init.Direction DMA_PERIPH_TO_MEMORY; hDmaAdc.Init.PeriphDataAlignment DMA_PDATAALIGN_HALFWORD; hDmaAdc.Init.MemDataAlignment DMA_MDATAALIGN_HALFWORD; hDmaAdc.Init.Mode DMA_CIRCULAR; __HAL_LINKDMA(hadc1, DMA_Handle, hDmaAdc);循环模式是这个链路里最重要的一个选择。规则组转换每次都放一帧数据循环模式让 DMA 始终跟踪 ADC 的输出不需要 CPU 反复重新启动 DMA采样的连续性由硬件保证。代价是缓冲区会被不断覆盖所以 CPU 必须在数据被覆盖前读完这就用到了 DMA 半传输中断和传输完成中断把缓冲区分成前后两半前半更新时 CPU 读后半后半更新时 CPU 读前半读写互不踩踏。串口在这个链路里只是输出端不参与实时性。数据由 DMA 搬进缓冲后在中断回调里或主循环中换算成电压值再通过串口打印。串口波特率不需要太高115200 甚至更低就行因为打印只是调试用。我见过有人为了看波形把串口波特率拉到 921600结果影响主循环节奏反而给控制环制造了额外抖动。调试通道只要能在几分钟内把足够多的采样点送出来就够了。4. 从零到可用的配置与代码照着填参数就能跑通4.1 时钟树与引脚先解决“ADC 和 HRTIM 是否同源”拿到一个新板子我习惯先打开时钟树页面确认 HRTIM 和 ADC 的时钟源是否在同一个频率体系下。HRTIM 的定时器时钟通常要求很高STM32G474 上常见配置是 PLL 输出给 HRTIMADC 时钟用 PCLK 分频得到。这里有一个容易被忽略的点如果 ADC 时钟和 HRTIM 时钟来自不同时钟链触发脉冲到达 ADC 时会存在相位不确定性宏观上表现为同一比较值下采样点轻微抖动很难用软件消除。所以第一步不是在 CubeMX 里拖引脚而是先把时钟链画出来。常见做法是让 PLL 产生一个统一的 170MHz 或 240MHz 内核时钟再让 HRTIM 时钟和 ADC 时钟都从这条链上取。如果必须用异步时钟至少要保证 ADC 时钟频率是 HRTIM 时钟频率的整数倍否则边沿采样位置会周期性地漂移一个 ADC 时钟周期。引脚规划上HRTIM 的 PWM 输出引脚和 ADC 采样引脚各自独立但采样点如果布在功率管栅极驱动附近噪声源就是高边驱动导致的 dv/dt。我一般把 ADC 采样引脚远离 PWM 输出引脚避免让数字信号翻转在模拟输入上耦合噪声。还有一点是参考电压多路 ADC 共用一个内部 VREF 没问题但要确认 VREF 引脚上的电容位置不能离 MCU 太远。4.2 HRTIM 周期与比较值PWM 中间时刻的计算假设你已经决定用向上计数、周期 T20us、定时器时钟 240MHz那么 period_ticks 4800中间时刻 compare_mid 2400。这个值只是理论值实际还要叠加触发延迟。HRTIM 比较事件出来到 ADC 真正开始采样中间隔着触发路由和 ADC 触发同步逻辑。ADC 是在外部触发边沿到来后经过一个可配的触发同步延迟后才开始转换有的型号允许你把这个延迟设成零到若干个 ADC 时钟周期。为了尽量保证“PWM 输出中点”和“ADC 采样保持中点”重合我会把 compare_mid 减去触发同步延迟的 tick 数。这里有个经验顺序// 触发同步延迟约为 1 个 HRTIM 时钟 1 个 ADC 时钟 uint32_t trigger_latency 1 (HRTIM_TIMER_CK_HZ / ADC_CLK_HZ); uint32_t compare_final compare_mid - trigger_latency;延迟量并不大在低频 PWM 下降数百纳秒根本看不出来但在 500kHz 以上的 PWM 下这已经是可感知的偏移。我习惯把它算成一个常量放到配置文件里方便后续用示波器对比实测再微调。还要说明的是如果 HRTIM 子单元同时负责产生 PWM 波形和触发采样那么比较寄存器会被 PWM 占空比占用。这种情况下要单独再开一个比较寄存器或者用另一路子单元专门生成触发事件两者相位严格对齐。千万不要把一个比较寄存器既当输出占空比又当 ADC 触发除非你真的只做 50% 占空比。4.3 ADC 与 DMA 缓冲多路采样时的缓冲对齐方式多 ADC 同步采样时每个 ADC 都有自己独立的 DMA 通道或 DMA 请求。缓冲区设计就变成了每个 ADC 各自的环形缓冲。这里常见做法是每个通道准备一个 2N 大小的数组N 要覆盖中断处理周期内能产生的采样帧数。例如控制循环是 10kHz每周期采一帧CPU 在 100us 内必须处理一次那么缓冲每半段至少能装下一帧数据#define ADC_SAMPLES_PER_FRAME 2 // 每个 ADC 一次转换的结果数 #define ADC_BUFFER_HALF_SIZE 8 // 半段缓冲能放 8 帧 static __ALIGNED(32) uint16_t dma_buf[ADC_BUFFER_HALF_SIZE * 2];对齐 32 字节是为了配合 DMA 四字节对齐访问避免某些总线交叉边界时的额外延迟。半传输中断触发时CPU 看到的是当前正在填写的半段已经填满而另一半是上一轮的稳定数据。这时在中断回调里处理数据的基地址要指向另一半也就是非当前 DMA 正在写的那一段。参数缓冲大小的选择有个边界太小中断处理跟不上数据会被 DMA 覆盖太大延迟变高控制环拿到的是早就过时的采样值。我一般让半段缓冲能容纳 4~16 帧具体取决于主循环或中断处理时间。4.4 串口打印与回调把 ADC 结果格式化输出串口打印这一步比较独立但代码写不好会引入隐藏 bug。最常见的问题是对 printf 的重定向不完整导致输出乱码或卡死。我用的是串口发送寄存器轮询方式重定向 fputcint fputc(int ch, FILE *f) { huart2.Instance-TDR (uint8_t)ch; while (!(huart2.Instance-ISR USART_ISR_TXE_TXFNF)); return ch; }这里没有使用 HAL_UART_Transmit因为每次调用函数带来的系统开销更大在中断回调里打印大量数据时会影响时序。轮询发送寄存器更直接缺点是会阻塞所以打印内容要控制长度不要每个采样点都打印一大串。多路采样数据打印时建议把每路数据换算成真实电压或电流工程值后再打印否则看原始 ADC 码值看不出问题。换算公式很简单void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc) { static uint8_t idx; uint16_t raw dma_buf[idx (ADC_BUFFER_HALF_SIZE - 1)]; float voltage raw * (3.3f / 4095.0f); printf(ch%d%ldmV\r\n, idx 1, (long)(voltage * 1000.0f)); idx; }回调里只做数据读取和打印不在其中启动任何转换。触发链路的启停由硬件完成CPU 干预越少采样时间越稳定。打印内容里有通道标识方便你在上位机里区分各路数据。5. 常见问题与避坑触发失效、采样点偏移、DMA 错位5.1 触发不生效ADC 只出零或不变值现象配置完 HRTIM 和 ADC 后串口打印一直是同一个数或者无限接近 0用调试器看 ADC 数据寄存器根本没更新。原因排查下来大多是两条链路只通了一条。要么是 HRTIM 的比较事件没有使能对外输出要么是 ADC 的外部触发源没有选到这个 HRTIM 事件。还有一个隐蔽情况使能了 ADC 的连续转换模式导致 ADC 根本不理会外部触发边沿。解决先关掉连续转换然后把 HRTIM 输出触发寄存器里对应的比较事件位打开再用调试器查看 ADC 触发源选择寄存器的位域是否指向 HRTIM。每改完一处用软件触发一次 ADC证明 ADC 本身正常再接回硬件触发链路形成逐段排除的节奏。不要一上来就怀疑硬件连线这链路里九成问题是寄存器配置不是电路板问题。5.2 采样点偏移噪声尖峰没躲开现象明明把比较值设在了周期中点打印出来的电压值仍然毛刺明显把 PWM 关掉后数据就变干净说明噪声确实是 PWM 开关导致的。原因比较事件到 ADC 真正开始采样之间有固定延迟。ADC 外部触发输入要先经过同步逻辑再经过可配置的触发延迟这中间会用掉几个 ADC 时钟周期。高频 PWM 下这几个周期叠加起来采样点就被推迟到了靠近边沿的位置。解决把整个链路的延迟用示波器抓出来。用 PWM 输出引脚作为示波器通道 A用触发信号作为通道 B直接看触发边沿相对 PWM 边沿的位置然后修正比较值。修正量可以放到参数宏里单独调参不影响其他逻辑。我一般会在代码里保留一个 TRIGGER_DELAY_ADJUST 参数范围从 0 到几十个 tick调试时扫描这个参数找到噪声尖峰消失的区间。5.3 DMA 数据错位打印出来的通道顺序乱跳现象本来缓冲区按通道顺序排列打印出来的第一路数据偶尔变成了第二路的值或者隔一段时间错一位。原因DMA 缓冲区大小和 ADC 序列长度不匹配。比如 ADC 序列配置了 2 个通道但 DMA 缓冲区只按 2 个半字配置那么 DMA 传输完成后就停在原地下一次触发到来时新旧数据边界对不上。还有一种情况是使用了循环模式但 CPU 在 DMA 传输完成中断里没有及时消费导致数据被下一次传输覆盖了一半。解决确认 DMA 缓冲半段能容纳的帧数是 ADC 转换次数的整数倍并且在中断回调里读取数据时要基于“当前 DMA 写到哪”来判断。我习惯用 DMA 的当前数据指针寄存器算出缓冲内有效数据位置而不是靠主观计数。如果要更稳可以给每个通道增加帧序号打印时校验序号连续性一旦乱序立刻停止避免把错位数据当成真实采样。5.4 首次数据异常启动瞬间出现一跳毛刺数据现象程序刚上电或复位后串口打印出的前几个点异常大或异常小之后恢复正常。看起来不像噪声因为后面所有数据都是稳的。原因DMA 在循环模式下刚开始搬运时缓冲区里是随机历史值第一次触发后只填充了部分数据CPU 却在传输完成中断里把整个半段都读了出来于是读到了未初始化区域的数据。这个现象在调试工具里极具迷惑性因为看起来像“上电冲击”。解决初始化时把整个 DMA 缓冲区清零或者在使能硬件触发前先做一次软件触发并让 DMA 跑起来产生一组参考数据再切到 HRTIM 触发。我这里常用第二个办法先软件转换一次确认 DMA 已经把缓冲填满再打开 HRTIM 比较触发。代码上就是在打开通道前调用一次 HAL_ADC_Start_DMA然后等待转换完成标志再使能 HRTIM。5.5 占空比突变时采样点被沿淹没现象固定占空比下采样数据很漂亮一旦控制环输出变化、占空比快速调整打印数据突然出现间歇性毛刺。原因比较值更新不及时。当配置里把比较值直接写入寄存器而没有使用预装载机制时新值会在当前计数器周期的某个中间时刻生效导致 PWM 输出边沿瞬间提前或延后采样点还固定在半周期处实际上已经被某个提前到来的边沿吞掉了。解决启用 HRTIM 比较寄存器的预装载功能让新比较值在周期边界统一更新。这样就保证每个周期内 PWM 沿位置稳定HRTIM 触发 ADC 的时刻也稳定。所有涉及占空比动态更新的项目我都强制走这一步。CubeMX 下可以在 HRTIM 定时器配置里找到影子寄存器或者预装载的开关打开它再把更新触发源设成周期事件。6. 验证采样点对没对用一组阶梯输入快速确认6.1 用固定电压与占空比组合验证采样点位置搭建验证环境时我从不直接接真实负载那样噪声太杂无法定位是采样点问题还是功率电路问题。常见做法是用一个可调直流电压比如 1.5V接到 ADC 输入让 PWM 继续跑但不要带功率负载。此时如果采样点落在干净区域读取到的电压应该接近 1.5V 的直流值纹波极小。如果采样点在边沿附近即使输入是干净直流也会看到叠加的振铃。接下来把占空比从 10% 扫到 90%每步停留几秒串口打印的结果应当基本恒定。如果在某个占空比区间出现跳变说明采样点与边沿距离越过了临界值。这种情况下不需要猜测直接用比较值的偏移量修正直到整个占空比范围内数据都稳定。这样验证的好处是从“数据层面”确认了触发时刻不需要每次都接示波器。6.2 把比较值偏移几十纳秒观察噪声尖峰变化如果你想更精细地确认采样点是否真的在“噪声谷底”可以在代码里做一次扫描。把 HRTIM 比较值从理论中点往前偏移 200ns再往后偏移 200ns每个偏移档位采集一组数据并观察峰峰值。理论上看到的数据会在某个中间偏移区间出现明显的峰峰值低谷这个区间就是最佳采样位置。我的习惯是先用示波器确认大位置再用这种扫描法做小数量的精调。精调增量可以设成 1 个 HRTIM 时钟 tick对 240MHz 时钟来说就是约 4ns。这个精度对大多数电流采样足够如果再高就要考虑模拟链路本身的建立时间。从那以后我每次搭这类采样链路都强制先画一条“触发时间线”把比较事件、触发延迟、采样保持时间这三个节点逐一标出来再动手配寄存器。希望帮到你。本文还有配套的精品资源点击获取
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑