STM32 实现差分编码器4倍频计数的实战解析

光栅莫尔信号四倍频细分电路模块的设计与仿真研究 阅读详情

1. 差分编码器与4倍频技术解析

增量式编码器在电机控制、位置检测等领域应用广泛,但很多初学者对差分信号和4倍频技术的理解存在误区。今天我就结合自己多年的实战经验,用最直白的方式给大家讲明白这个技术。

编码器输出的信号通常有两种形式:一种是占空比50%的方波(A、B两相相位差90度),另一种是正弦波模拟信号。我们今天重点讨论方波信号,因为STM32的编码器接口就是为这种信号设计的。

所谓4倍频,就是把编码器的原始分辨率提高4倍。举个例子,如果你的编码器标称600PPR(每转600个脉冲),经过4倍频后实际可以获得2400个计数脉冲。这意味着最小分辨角度从原来的0.6度提升到了0.15度,精度大大提升。

实现原理其实很简单:普通计数只采集单个通道的上升沿,2倍频会同时采集上升沿和下降沿,而4倍频则同时采集两个通道的上升沿和下降沿。在实际项目中,我发现4倍频不仅能提高分辨率,还能有效抑制信号抖动,这点在高速电机控制中特别重要。

2. 硬件电路设计与连接

差分信号传输是工业现场的常见需求,但STM32的GPIO只能识别单端信号。这就需要用到差分接收芯片,我最常用的是TI的AM26C32,这款芯片稳定性很好,抗干扰能力强。

具体连接方式如下:将编码器的A+、A-接到AM26C32的1A和1B引脚,B+、B-接到2A和2B,Z相(零点信号)接到3A和3B。芯片的输出端1Y、2Y分别接到STM32定时器的CH1和CH2,3Y接到任意GPIO用作零点中断。

在实际布线时要注意几点:第一,差分信号线最好使用双绞线,长度不要超过1米;第二,在AM26C32的电源引脚附近记得加0.1uF的去耦电容;第三,如果环境干扰较强,可以在信号线上加RC滤波电路。我曾经在一个伺服项目中没有加滤波,结果电机高速运行时计数会出现跳变,后来加了22欧姆电阻和100pF电容就稳定了。

如果大家不想自己画板,可以直接用现成的差分转单端模块,比如RMLS-701模块就很不错,即插即用特别方便。

3. STM32编码器接口深度剖析

STM32的编码器功能其实是定时器的一个特殊工作模式,并不是所有定时器都支持。通常高级定时器TIM1、TIM8和通用定时器TIM2-TIM5才有这个功能。

理解编码器接口的关键在于看懂那个让人头疼的计数逻辑表。其实说白了就是根据两个通道的电平变化关系来判断方向和计数。TI1和TI2分别对应编码器的A相和B相,TI1FP1和TI2FP2是经过反相后的信号。

当配置为"仅在TI1计数"模式时,只在TI1的边沿计数,但同时会参考TI2的电平状态。如果TI1上升沿时TI2为低电平,则向上计数;TI1下降沿时TI2为高电平,也向上计数。这样就实现了2倍频。反过来如果旋转方向改变,就会向下计数。

4倍频模式(在TI1和TI2处均计数)则是同时检测两个通道的所有边沿。假设编码器正转:A相上升沿时B相为低电平(计数+1),B相上升沿时A相为高电平(计数+1),A相下降沿时B相为高电平(计数+1),B相下降沿时A相为低电平(计数+1)。这样一转就有4个计数脉冲。

我在多个项目实测中发现,STM32的编码器接口非常稳定,最高支持几十MHz的计数频率,完全满足大多数工业应用的需求。

4. CubeMX配置详解

使用STM32CubeMX配置编码器接口可以省去大量底层寄存器操作的时间。打开CubeMX后,选择对应的定时器(比如TIM3),在Mode中选择Encoder Mode。

关键参数配置如下:Encoder Mode选择"Encoder Mode TI1 and TI2",这就是4倍频模式。Polarity保持默认的"Rising Edge"即可。Counter Period(ARR寄存器)设置为65535(16位定时器的最大值),或者根据实际需要设置。

Prescaler(分频系数)设置为0,这样输入脉冲直接进入计数器。Filter值根据信号质量设置,如果信号干净就设为0,有抖动可以适当增加滤波值。我一般从3开始尝试,如果计数还有跳变就逐步增加。

记得开启定时器的中断(如果需要在计数溢出时处理),在NVIC Settings中使能定时器中断。生成代码时,建议选择"Generate peripheral initialization as a pair of '.c/.h' files per peripheral",这样代码结构更清晰。

配置完成后生成代码,CubeMX会自动帮我们生成定时器的初始化代码,包括GPIO配置、定时器模式设置等基础工作。

5. 编码器数据读取与处理

在生成的代码基础上,我们需要添加编码器的启动和数据读取逻辑。在main函数中,先启动编码器接口:

HAL_TIM_Encoder_Start(&htim3, TIM_CHANNEL_ALL);

读取计数值很简单,使用库函数即可:

int16_t count = __HAL_TIM_GET_COUNTER(&htim3);

但要注意的是,16位定时器的计数值范围是0-65535,超过这个范围就会溢出。处理溢出有两种方法:一种是开启溢出中断,在中断中记录溢出次数;另一种是使用32位变量组合成32位计数器。

我推荐第一种方法,因为更可靠。先开启溢出中断:

HAL_TIM_Base_Start_IT(&htim3);

然后在中断回调函数中处理溢出:

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if(htim->Instance == TIM3)
    {
        if(__HAL_TIM_IS_TIM_COUNTING_DOWN(&htim3))
            overflow_count--;
        else
            overflow_count++;
    }
}

获取完整32位计数值:

int32_t full_count = (overflow_count * 65536) + __HAL_TIM_GET_COUNTER(&htim3);

方向判断也很重要,可以通过这个函数获取当前旋转方向:

uint8_t direction = __HAL_TIM_IS_TIM_COUNTING_DOWN(&htim3);
// 返回0表示正向,1表示反向

在实际应用中,我建议每10-100ms读取一次计数值,并通过差分计算得到速度值。不要读取太频繁,否则会增加CPU负担。

6. 实战应用与优化技巧

在电机控制项目中,编码器数据主要用于位置环和速度环的控制。位置控制直接使用计数值即可,而速度计算则需要通过差分和滤波处理。

速度计算的基本公式是:速度 = (本次计数 - 上次计数) / 时间间隔。但这样计算出来的速度会有较大噪声,需要加入滤波处理。我通常使用一阶低通滤波:

current_speed = (current_count - last_count) / delta_time;
filtered_speed = 0.9 * filtered_speed + 0.1 * current_speed;

滤波系数需要根据实际应用调整,响应速度要求高的场合用0.5-0.7,要求平滑的场合用0.1-0.3。

另一个常见问题是计数溢出处理。当电机长时间单向旋转时,计数值会不断溢出。我上面提到的32位计数器方法可以解决这个问题,但要注意溢出次数的符号处理。

对于零点信号(Z相),建议使用外部中断来处理。当检测到Z相上升沿时,可以将计数器重置为0,这样可以实现绝对位置校准。但要注意的是,重置计数器时要同时重置溢出计数,保持数据一致性。

在高速应用场合,我发现输入滤波器的设置很关键。滤波值太大会丢失脉冲,太小又无法有效抑制噪声。最好的办法是用示波器观察编码器波形,根据实际噪声情况设置滤波值。

最后提醒大家,编码器接线要使用屏蔽线,并且屏蔽层要单端接地,这样可以有效减少电磁干扰。电源质量也很重要,最好使用LDO为AM26C32供电,而不是简单的DCDC转换器。

7. 常见问题与解决方案

在实际项目中,我遇到过各种编码器相关的问题,这里分享几个典型的案例和解决方法。

第一个问题是计数不准,偶尔会跳变。这通常是信号质量问题,可以用示波器观察波形是否有毛刺。解决方法包括:增加硬件滤波(在AM26C32输入脚加RC滤波)、调整STM32输入滤波参数、检查接地是否良好。

第二个问题是高速时丢失脉冲。可能的原因有:输入滤波设置过大、代码读取过于频繁、中断处理时间过长。建议优化代码结构,将速度计算等耗时操作放在低速循环中,避免在中断中做复杂运算。

第三个问题是零点信号不准。Z相信号通常每转只有一个脉冲,如果位置对不齐会影响绝对位置精度。解决方法是在系统初始化时让电机转动寻找Z相,找到后将计数器重置为中间值(比如32768),这样正反转都有足够的计数空间。

第四个问题是电源噪声影响。电机驱动器的开关噪声会耦合到编码器信号中,导致计数错误。解决方法包括:使用隔离电源为编码器供电、信号线远离功率线、增加共模扼流圈等。

最后一个常见问题是机械安装误差。编码器与轴不同心会导致信号抖动,特别是在低速时影响更明显。安装时要确保同心度在允许范围内,联轴器要有足够的柔性补偿能力。

调试时我习惯先用逻辑分析仪捕获编码器波形,确认硬件没问题后再调试软件。STM32的调试模式也很好用,可以实时监控计数器值的变化情况。

STM32 实现差分编码器4倍频采集的技术解析 本文详细解析了STM32如何通过AM26C32差分接收芯片将差分编码器信号转换为单端信号,并利用定时器的编码器接口实现4倍频采集。文章涵盖了硬件连接、信号转换、软件配置及常见问题解决方案,为电机控制和位置检测应用提供了完整的技术实现指南。 阅读详情

相关推荐

STM32 实现差分编码器高精度数据采集与倍频技术详解

本文详细解析了STM32实现差分编码器高精度数据采集与倍频技术的全过程。从差分编码器基础与硬件连接方案入手,深入探讨了STM32定时器的编码器模式、CubeMX配置与代码实战,以及抗干扰设计与精度提升技巧。通过实际案例和技术细节,帮助开发者掌握工业级编码器数据采集方法,提升电机控制和数控机床等应用中的测量精度。

weixin_28724661的博客 377

编码器四倍频

四倍频好处是什么? 用编码器时,用AB相的模式才可以设置脉冲倍频,A,B两相相差90度相(1/4T),这样,在0度相位角,90度,180度,270度相位角,这四个位置有上升沿和下降沿,这样,实际上在1/4T方波周期就可以有方向变化的判断,这样1/4的T周期就是最小测量步距,通过电路对于这些上升沿与下降沿的判断,可以4倍于PPR读取位移的变化,这就是方波的四倍频。这种判断,也可以用逻辑来做,0代表低,1代表高,A/B两相在一个周期内变化是0 0,0 1,1 1,1 0 。这种判断不仅可以4倍频,还可以判断移动

lihe的博客 2万+

从AM26C32到TIMx_CH:深入STM32编码器接口,搞懂4倍频与方向判断的硬件原理

本文深入解析STM32编码器接口的硬件原理,从差分信号转换到4倍频与方向判断的实现机制。通过AM26C32差分接收器将编码器信号转换为STM32可处理的单端信号,详细讲解定时器的编码器接口架构和4倍频计数时序,为工业自动化和机器人控制提供高精度编码器数据采集方案。

weixin_30772105的博客 411

电子脉搏计设计

一、设计任务与要求1. 实现在15 s 内测量1 min的脉搏数;2. 用数码管将测得的脉搏数用数字的形式显示;3. 测量误差小于±4次/min。脉搏测试仪是用来测量一个人心脏跳动次数的电子仪器,也是心电图的主要组成部分。它是用来测量频率较低的小信号。通过对信号的放大,显示,对身体脉搏进行模拟测试。电子脉搏计分成以下6部分:1 函数信号发生器——将脉搏跳动信号转换为与此相对应的电脉冲信号,通过正弦波模拟人体的脉搏跳动。2 放大整形电路——把传感器的微弱电流,微弱电压放大。

JK7942的博客 7578

STM32编码器接口实战:差分信号转单端电路设计与抗干扰指南

在电机控制与位置检测系统中,增量式编码器是关键的位置传感器,其输出的差分信号(如RS422标准)具有优异的抗共模干扰能力,适用于工业现场等复杂电磁环境。然而,STM32等微控制器的编码器接口通常只能识别单端TTL/CMOS电平信号,因此需要可靠的信号转换电路。差分接收芯片(如AM26LV32)通过高共模抑制比(CMRR)将A+、A-的电压差转换为干净的单端信号,这是实现精准计数的硬件基础。STM32的硬件编码器接口模式能自动处理A/B相正交脉冲,实现四倍频与方向识别,极大减轻CPU负担。本文将结合AM26L

weixin_30591551的博客 346

差分驱动芯片实战解析:从AM26LS31/32选型到典型应用避坑

本文深入解析了经典差分驱动芯片AM26LS31与接收器AM26LS32ACDR的实战应用。针对信号传输距离短、波形畸变、芯片发热等常见问题,从核心选型决策入手,详细剖析了驱动端上拉电阻计算、接收端阻抗匹配与输入保护等关键外围电路设计,并提供了典型故障的排查思路与解决方案,帮助工程师实现稳定可靠的远距离差分信号传输。

dapp9builder的博客 547

并行正交编码器接口计算说明书

对于并行差分编码器,采用的是差分总线接收器芯片AM26C32PM,支持TIA/EIA-422-B, TIA/EIA-423-B,由于编码器电路的电平为5V电平,采用SN74LVC14进行电平转换为3.3V电平。

qnmddwc的博客 2640

差分驱动芯片实战解析:从AM26LS31到AM26LS32ACDR的设计要点与避坑指南

本文深入解析了差分驱动芯片AM26LS31与接收芯片AM26LS32ACDR的实战应用与设计要点。针对驱动侧输出电平不足、芯片发热,以及接收侧信号不稳定等常见问题,提供了添加外部上拉电阻、优化输入偏置、进行终端匹配等具体解决方案与避坑指南,并强调了PCB布局布线和电源去耦的关键作用,旨在帮助工程师构建稳定可靠的差分信号传输系统。

weixin_29197051的博客 312

锁相环(PLL),倍频器、分频器原理

废话不多说,直接开干 锁相环原理 由一个基准频率振荡器(晶体振荡器),相位频率比较器,VCO(电压控制振荡器),回路滤波器组成。晶振产生频率为fr的时钟,与VCO产生的fo的时钟同时传入相位频率比较器中进行比较,产生比较结果以脉冲波的形式传入回路滤波器,回路滤波器通过低频将脉冲波转变为直流低压VR,传入VCO对fo进行控制,形成反馈控制电路。 当fr>fo时产生PD为正脉冲,VR变大,当fr<fo时,PD产生负脉冲波,VR减小,形成对fo的闭环控制,最终目的,是fo==fr。 倍频器 PLL

weixin_44859524的博客 2万+

Verilog实现PLL倍频器

本文介绍一种基于锁相环思想的纯数字倍频器设计,使用Verilog在无硬件PLL的条件下实现时钟倍频。通过相位累加器和反馈控制机制模拟PLL行为,适用于教学、原型验证等对时钟精度要求不高的场景,揭示全数字锁相环(ADPLL)的核心原理。

sun99的博客 632

四倍频细分电路

非常实用,让你的电路给家可靠,完美,有保证的处理信号。

STEVAL-CTM015V1开关磁阻电机驱动板配置指南:传感器接线与换相控制

开关磁阻电机(SRM)依靠磁阻最小原理产生转矩,转子无绕组无磁钢,必须依赖精确的转子位置才能实现换相控制。与无感方案相比,带位置传感器的SRM驱动在启动可靠性、角度优化和调试效率上具有明显优势,尤其适合零速启动和低速重载场景。意法半导体STEVAL-CTM015V1评估板为三相SRM驱动提供了完整的硬件与软件参考设计。从霍尔传感器与增量编码器的选型接线,到基于STM32CubeMX的定时器配置、换相表计算、电流环与速度环参数整定,再到开环验证与常见故障排查,本文记录了一次完整的板卡调试过程,为正在从事SRM

weixin_34072458的博客 436

光电码盘四倍频分析(原理图设计)

提高位置测量的精度 是提高电机定位精度的主要途径 作为当前常用转角位置传感器的增量式光电码盘 常采用四倍频的方法提高其测量精度 针对一 精度和稳定性不高的四倍频电路应用中造成的误差 详细分析了两种可应用于不同环境的四倍频电路 从原理上说明了电路的精度和稳定性其结论在实际应用中也得到了验证

差分驱动芯片使用总结

本文总结了差分驱动芯片AM26LS31的使用要点:1) 该芯片5V供电时输出约3.3V电平,需外接上拉才能达到VCC电压;2) 芯片工作时发热明显,可通过选用大封装或在前级添加限流电阻缓解;3) 输出信号可用于驱动光耦或连接差分接收芯片,使用时需注意在接收端添加匹配电阻(100-120Ω)防止信号反射,驱动光耦时还需加限流电阻和反向保护二极管。文中还通过内部电路图和输入输出逻辑图说明了芯片的工作原理,并指出AM26LS32差分接收芯片输出存在随机性问题。

weixin_41226265的博客 1万+

用Plecs搞定半桥LLC谐振变换器仿真:从开环模型搭建到闭环PI调参全流程

本文详细介绍了使用Plecs仿真工具进行半桥LLC谐振变换器从开环模型搭建到闭环PI调参的全流程操作。涵盖仿真环境准备、关键元件参数计算、波形异常排查、闭环控制实现及PI参数整定等核心内容,特别针对仿真中的收敛性问题提供实用解决方案,助力电力电子设计者高效完成LLC变换器仿真验证。

weixin_28455801的博客 572

ZYNQ平台AXI DMA传输避坑指南:如何快速定位‘errors:200‘等中断故障

本文详细解析了ZYNQ平台AXI DMA传输中常见的'errors:200'等中断故障,提供了从寄存器解析到压力测试的完整解决方案。通过深入分析XILINX_DMA中断机制、错误分类及五步排查法,帮助开发者快速定位并解决DMA传输问题,提升系统稳定性与性能。

weixin_29159613的博客 441

编码器差分转单端电路(含原理图),基于STM32编码器接口模式的程序设计及电路设计

市场上常见的增量式编码器大多都是A,B,Z相,但例如A+,A-,B+,B-,Z+,Z-这类的编码器其实就是所谓的差分编码,一般出现在有伺服驱动器的场景上用到,或者需要远距离传输时。因为带有对称负信号连接,电流对于电缆贡献的电磁场为0,衰减最小,抗干扰最佳,可传输较远的距离。那么问题来了,在使用定时器编码器模式时,该怎样去接线。这时候就需要用到差分转单端外围电路的实现。以三路编码接口AB相为实例(如果需要Z相,原理基本一样),附带原理图(亲测),需要封装库的话可以私信我。

涔涔的博客 1万+

ICNN实现入侵检测的思路与源码(CIC-IDS-2017)

基于ICNN实现入侵检测,可用于现实网络

t1274171989的博客 8415

通常的倍频原理

通常的倍频原理:需要倍频的信号通过非线性器件(如二极管,一个二极管也行。二个二极管甚至4个二极管),串联检波或并联钳位都行甚至平衡混频电路。然后带通滤波输出倍频信号。

gtkknd的专栏 9900

实战指南:R语言多组倾向评分逆概率加权(IPTW)建模与结果解读

本文详细介绍了如何使用R语言实现多组倾向评分逆概率加权(IPTW)建模,包括数据预处理、倾向评分估计、权重计算及结果解读。通过实战案例演示,帮助研究者掌握这一统计方法,有效平衡多组混杂因素,模拟随机对照试验效果,适用于医学、社会科学等领域的数据分析。

weixin_42528534的博客 399

国内免魔法接入Grok API,打造智能QQ机器人实战指南

大型语言模型(LLM)通过API接口为开发者提供了强大的自然语言处理能力,其核心原理是基于海量数据训练的深度神经网络,能够理解和生成类人文本。这一技术价值在于显著降低了AI应用开发门槛,使开发者无需从零训练模型即可快速集成智能对话、内容生成等功能。在即时通讯、智能客服、自动化工具等应用场景中,LLM API能有效提升交互体验与效率。本文聚焦于如何通过稳定的第三方API服务,绕开网络访问限制,将xAI推出的Grok模型接入国内网络环境,并结合NoneBot2框架与go-cqhttp,实现一个功能完整的智能QQ

weixin_30607125的博客 337

编码器学习记录

上一节提到了增量式编码器倍频技术可以扩展M法的测量范围,那么现在我们就来讲解下这个M法究竟是怎样测速的,以及简单介绍一些常用的编码器测速方法。对于电机转速的测量,可以把增量式编码器安装到电机上,用控制器对编码器脉冲进行计数,然后通过特定的方法求出电机转速,常用的编码器测速方法一般有三种:M法、T法和M/T法。M法:又叫做频率测量法。这种方法是在一个固定的定时时间内(以秒为单位),统计这段时间的编码器脉冲数,计算速度值。

bastarddd的博客 1124

图形学常见概念小结

前言:本文记录《unity shader入门精要》和openGL相关学习过程中一些学习要点; 文章目录PBR流程渲染管线细分着色器的底层实现,应用原理常见的色调映射算法openGl和Direct X的区别PBR流程和URP渲染管线Camera loop(剔除)MVP矩阵变换光线追踪前向渲染和延迟渲染shader和材质的区别bloom原理后处理的理解高斯模糊实现原理图像处理中的边缘检测算子 PBR流程 小结:一套基于自然界微平面理论、能量守恒、菲涅尔反射、线性空间等的科学理论所实现的基于物理的渲染系统,包含一

小谁的博客 1165

高频电子线路---倍频器与振荡器

简单原理 : 高频小信号时 , 我们的并联谐振网络主要是对基波成分进行筛选 , 但是倍频电路主要是对谐波成分也就是多次谐波成分进行筛选从而达到倍频的效果。输出振幅变大时 , 增益就会减小 , 由于增益为输出比上输入 , 所以输出就会减小 , 也就是自动回到Q点 , 当然了 , 当输出增幅减小的时候是同理的。极其微小的振荡 , 通过互感的反馈 , 三极管放大最后回来 , 信号就会从小到大逐渐放大 , 就能够起振.假设开关接到2的位置,那么此时有输入的信号 , 进过三极管的放大 ,为什么反馈系数设计得大呢?

将唐的博客 4885

SAP_SD模块深度解析SAP信用检查中的“未清数量”取值逻辑

确认数量 vs 订单数量:如果系统配置了可用性检查(ATP),并且订单只确认了部分数量,信用检查通常只占用已确认数量的额度(具体取决于信用组的配置)。在SAP中,未清订单数量的计算并非简单读取订单行项目的目标数量(VBAK-KWMENG),而是基于**计划行(Schedule Lines)**层级来汇总的。状态的转换点:当交货单创建(VL01N)并保存时,这部分数量对应订单的“未清订单数量”减少,“未清交货数量”增加。业务人员眼中的未清数量很简单:“我卖了100个,发了30个,未清就是70个”。

我小时候很黑的博客 315

手把手教你用Pytorch代码实现Transformer模型(超详细的代码解读)

本文整理了非常清楚的Transformer模型结构图,建议大家在看代码的时候能结合这个结构图来理解,这样理解起来会比较容易! 用Pytorch实现Transformer的完整代码

捡起一束光的博客 7万+
上一篇: 基于STM32CubeMX与Keil的HAL库流水灯高效开发实践
下一篇: 从汽车电子架构演进看CanNm:分布式网络管理的协同艺术
gitlab7runner
博客等级 码龄4年 78粉丝 1747原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值