STM32定时器捕获模式实战:从方波时间差到相位差精准测量

stm32 检测相位差 并简单实现两个单片机的通信 红叶何时落水 校赛第二部分 详见 http://t.csdn.cn/50yJu 利用定时器的输入捕获模式来测量相位差 通过 (两路波形上升沿的时间差 / 波形周期)* 360°来实现相位差的测量 deg = (360 - (((TIM2CH1_CAPTURE_VAL3 * 360) / (TIM2CH1_CAPTURE_VAL)) + chart)) % 180; 其中chart为线性补偿,可以通过按键改变其值,以此实现不同电路的测量 可以利用相位差来计算相应的频率与峰峰值 难点在于C 阅读详情

1. 为什么需要测量相位差?从电机控制到电源检测的实战场景

大家好,我是老张,一个在嵌入式领域摸爬滚打了十多年的工程师。今天咱们不聊那些虚头巴脑的理论,直接上干货,说说怎么用STM32的定时器,精准地测量两路方波信号之间的相位差。这玩意儿听起来有点专业,但其实在咱们的日常项目里,应用场景多得很。

比如说,你在做无刷电机控制(BLDC)或者永磁同步电机(PMSM)的驱动,是不是需要检测转子位置?其中一个经典方法就是通过反电动势(BEMF)过零点来推算。这时候,你从三相电中取出的信号,经过比较器变成方波,它们之间的相位关系就直接反映了转子的实时角度。再比如,在开关电源或者UPS(不间断电源)里,你需要监测输入和输出电压的同步性,或者多路PWM之间的相位差,以确保系统高效、稳定地工作,避免环流损坏器件。还有在通信、超声波测距等场合,测量发射信号和接收信号之间的时间差(本质上也是相位差的一种体现)更是核心需求。

所以,掌握相位差测量,绝不是为了炫技,而是解决实际工程问题的硬核技能。原始文章里给出了一个很棒的起点,用TIM5的两个通道抓上升沿,算时间差,再套公式。但说实话,在实际项目中直接这么用,你可能会踩到几个坑:比如信号有毛刺怎么办?定时器溢出了怎么处理?测量结果跳动太大如何滤波?今天,我就结合自己踩过的那些坑,带大家从寄存器配置开始,一步步搭建一个更健壮、更实用的相位差测量方案。咱们的目标是:看完就能用,用了就见效。

2. 核心原理拆解:时间差如何变成相位差?

在动手写代码之前,咱们必须把脑子里的“原理图”画清楚。很多朋友一上来就抄代码,结果出了问题根本不知道从哪儿查起。测量相位差的核心思想其实非常直观,我把它比喻成“田径赛跑的计时”。

想象一下,有两名运动员(两路同频率的方波信号)在环形跑道(一个完整的360度周期)上跑步。他们的步频(信号频率F)是完全一致的。我们现在要测量的,不是他们跑得多快,而是其中一个人相对于另一个人是领先还是落后,领先了多少米。在电信号的世界里,这个“领先的距离”就是相位差,单位是度。

那么怎么测呢?我们就在跑道起点(信号的上升沿)各放一块秒表(定时器的捕获通道)。当运动员A经过时,秒表A记录下时刻T1;当运动员B经过时,秒表B记录下时刻T2。这两个时刻的差值 Δt = |T1 - T2|,就是时间差。现在我们知道他们跑一圈需要的时间是周期 T = 1/F。那么,时间差占整个周期的比例,就是相位差占360度的比例。于是就有了原始文章里那个核心公式:

相位差(度) = 360° × 频率F × 时间差Δt

这里有个关键点,时间差Δt的单位必须是秒。如果你的定时器时钟源是1MHz(每计数一次代表1微秒),那么捕获到的计数值差值直接就是微秒数,你需要除以1,000,000转换成秒。公式就变成了:相位差 = 360 * F * (计数值差值) / 1000000,这和原始代码里的计算是一致的。

所以,整个任务就清晰了:1. 精准地捕获两个上升沿到来的瞬间时刻。2. 将两个时刻做差。3. 结合已知频率,按比例换算成角度。 听起来很简单,对吧?但魔鬼都在细节里,STM32的定时器怎么配置才能精准捕获?中断里怎么写才能不漏掉、不搞错?这就是我们接下来要深入的地方。

3. 定时器与输入捕获模式深度配置指南

好了,原理通了,咱们挽起袖子开始配置STM32的定时器。这里我以STM32F1系列的通用定时器TIM5为例,因为它功能齐全,路子比较野的TIM2、TIM3、TIM4也大同小异。我会把每个配置参数掰开了、揉碎了讲,让你知道为什么这么配。

3.1 定时器时基单元:搭建我们的“时间标尺”

定时器时基就像是我们的主时钟,它决定了时间测量的最小刻度(分辨率)。配置主要关注三个参数:预分频器(PSC)、自动重装载值(ARR)和计数模式。

TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_TimeBaseStructInit(&TIM_TimeBaseInitStructure); // 先全部复位,好习惯
TIM_TimeBaseInitStructure.TIM_Period = 65535;        // ARR,最大值
TIM_TimeBaseInitStructure.TIM_Prescaler = 71;        // PSC
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; // 时钟分频,与滤波相关,通常DIV1
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数模式
TIM_TimeBaseInit(TIM5, &TIM_TimeBaseInitStructure);

重点解释一下:

  • TIM_Prescaler (PSC): 71。假设你的系统主频是72MHz(APB1定时器时钟)。预分频71,意味着定时器的实际计数时钟是 72MHz / (71+1) = 1MHz
STM32输入捕获模式实战(下篇):PWM信号测量与双通道协同 本文深入解析了STM32输入捕获模式在PWM信号测量中的实战应用,重点阐述了如何利用定时器的双通道协同工作,通过配置从模式复位机制,实现高精度、低延迟的频率与占空比同步测量。文章提供了详细的寄存器配置、代码实现及调试技巧,帮助开发者掌握这一嵌入式开发中的核心技能。 阅读详情

相关推荐

STM32 LL库输入捕获:从原理到实战,精准测量脉冲与频率

在嵌入式系统开发中,时间测量是基础且关键的技术,广泛应用于脉冲宽度测量、频率计算和事件捕捉等场景。其核心原理依赖于定时器的输入捕获功能,通过硬件在特定信号边沿瞬间记录计数器值,实现高精度时间戳获取。这项技术的价值在于能够以微秒级甚至纳秒级分辨率对外部事件进行精确计时,为超声波测距、电机控制、通信协议解析等应用提供可靠的时间基准。使用STM32的LL库进行配置,可以更贴近硬件寄存器层,实现对计数器时钟源、边沿检测、数字滤波器和溢出处理等关键参数的精细控制。本文以STM32F1系列为例,详细解析如何配置输入捕获

keke1314520的博客 404

STM32输入捕获底层原理与实战调优

输入捕获是嵌入式系统中高精度时间测量的核心技术,其本质是硬件触发的计数器快照,而非软件轮询读取电平。它依赖于定时器时钟源稳定性、APB总线分频链路、输入滤波器配置及中断响应实时性四大要素。在STM32平台(如F103系列)上,PA0/PA6等引脚的复用特性、BOOT0隐性干扰、ADC与TIM资源冲突等硬件约束,直接影响捕获精度与可靠性。结合OLED动态刷新、双缓冲机制与示波器级时序验证,可将PWM脉宽测量误差压缩至±25ns以内,支撑电机控制、编码器解码、谐波分析等工业级应用。本文聚焦STM32输入捕获的物

weixin_33859231的博客 367

STM32H723ZGT6-使用方波调制法测量信号的幅值,相位

方波调制法是在被测信号的频率已知的情况下,通过方波调制,测量信号的幅值和相位。

2301_78985220的博客 195

STM32F4输入捕获 测量方波相位差

通过STM32F4输入捕获功能测量方波相位差,正点原子探索者系列,高频信号不适用。从PA0上升沿到PA2的上升沿的时间

STM32任意角度移相全桥PWM

利用STM32两个定时器输出4路PWM驱动全桥电路,两路为一组互补PWM,两组之间可以实现任意角度的移相,周期和占空比可任意调节

4通道90°相位差方波_STM32F103_4通道90°相位差方波_

4通道90°相位差方波

UA-DETRAC数据集转YOLO格式

UA-DETRAC转YOLO

lafsca5的博客 9101

滑模控制算法——基本原理(附MATLAB程序)

选择一个滑模面和是设计参数。是滑模面函数,通常我们希望系统状态在的面上滑动。我们以一个简单的二阶系统作为示例,其状态空间方程为:是系统矩阵是输入矩阵是输出矩阵假设我们的系统如下:滑模控制算法的核心在于设计合适的滑模面和控制律,并分析系统在滑模面上的稳定性。通过上述公式和步骤,可以有效地设计滑模控制器,以处理具有非线性和不确定性的动态系统。总的来说,滑模控制算法因其鲁棒性和灵活性在处理复杂控制问题中表现出色,但在实际应用中需要精心设计以克服抖振现象和其他潜在问题。BuxuABDC。

qq_35623594的博客 2万+

手把手教你用Zynq-7100 FPGA实现100Mbps OOK信号定时同步(含完整Verilog代码)

本文详细介绍了如何在Zynq-7100 FPGA平台上实现100Mbps OOK信号的定时同步,涵盖插值算法、Gardner定时误差检测等关键技术。通过完整的Verilog代码和优化技巧,解决了50MHz外部时钟条件下的400MHz采样率同步挑战,为无线通信系统设计提供实用解决方案。

weixin_42522374的博客 299

Contest 226 - C - Martial artist

from atcoder Problem Statement Time Limit: 2 sec / Memory Limit: 1024 MB Score :300300points Takahashi is a martial artist. There areNNmoves that a martial artist can learn, called Move11,22,\ldots…,NN. For each1 \leq i \leq N1≤i≤N, it takes...

m0_54674275的博客 1017

告别环境配置噩梦:用Docker Desktop + WSL2在Windows上5分钟搞定vLLM运行环境

本文详细介绍了如何在Windows系统上使用Docker Desktop和WSL2快速搭建vLLM开发环境,5分钟内完成配置。通过容器化技术解决传统环境配置中的依赖冲突、环境污染等问题,提供一键复用的高效方案,特别适合AI开发者快速部署和测试vLLM框架。

weixin_28728495的博客 495

【GAN实战】基于pytorch-CycleGAN与pix2pix的自定义数据集训练全攻略

本文详细解析了基于PyTorch的CycleGAN与pix2pix模型在自定义数据集上的完整训练流程。核心在于根据数据是否成对来正确选择模型:pix2pix适用于严格配对的“孪生”数据,而CycleGAN则擅长处理非配对的“散装”数据集。文章从数据准备、配置训练到测试应用,提供了全链路实战指南与关键参数调优心得,帮助开发者高效实现图像到图像的风格转换。

x2y3z4a5b的博客 701

S7-1200中通过MODBUS TCP客户端在一次请求中实现从服务器读写一个或多个保持性寄存器的具体方法

S7-1200中通过MODBUS TCP客户端在一次请求中实现从服务器读写一个或多个保持性寄存器的具体方法

Robot_PLC_HMI_Automation 4220

大聪明教你学Java | Seata 2.5 从下载到运行:全流程编译部署教程

Seata 2.5 版本带来了不少特性优化,但实际部署时却发现一个尴尬问题:全网找不到一篇完整覆盖「Git 源码下载→本地编译→环境配置→启动验证」的实操教程。作为一名踩遍无数坑才成功跑通的开发者,我深知这个过程的煎熬:Git 拉取源码后编译失败、依赖版本冲突、配置文件参数混乱、启动时端口占用或连接报错… 每一个坑都能耗费数小时排查。为了让后续开发者少走弯路,我将自己从0到1的完整实操经验整理成文,跟着步骤走即可成功运行 Seata 2.5.

不肯过江东丶 2066

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

上一篇: 从棱镜阵列到聚光神器:用LightTools还原菲涅尔透镜设计本质
下一篇: HDLBits(0)入门指南:从零开始掌握Verilog刷题技巧
kappa
博客等级 码龄26年 30粉丝 1318原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值