新闻详情

新闻详情

首页 / 资讯中心 / 详情

STM32定时器编码器模式:从CubeMX配置到电机转速测量全解析

发布时间:2026/10/2 3:21:16来源:尧图网络
STM32定时器编码器模式:从CubeMX配置到电机转速测量全解析
1. 编码器模式到底是什么为什么测转速绕不开它做电机控制这两年我越来越觉得编码器模式是被低估的一个功能。很多人一提到“测转速”第一反应就是定时器输入捕获、外部中断数脉冲或者干脆上霍尔传感器。但如果你手里正好有增量式编码器而且主控又是STM32那定时器的编码器模式几乎是性价比最高的方案——不需要额外硬件不需要复杂算法一个定时器硬件帮你把A相B相信号全部消化掉主循环只管读计数器就行。先说清楚一个基础概念增量式编码器输出两路相位差90度的方波信号通常叫A相和B相。电机正转时A相超前B相90度反转时B相超前A相90度。传统做法是用外部中断同时监听A相和B相在中断里判断谁先谁后然后软件加减计数。这个思路没问题但缺点也很明显中断频繁、CPU占用高、计数容易丢脉冲尤其在电机高速旋转时根本反应不过来。定时器的编码器模式则是把这个逻辑用硬件实现了。STM32的通用定时器TIM2、TIM3、TIM4、TIM5等内部有一个编码器接口你只需要把A相接到定时器的CH1引脚B相接到CH2引脚配置好计数模式硬件就会自动根据两路信号的电平组合来判断方向并增减计数器的值。CPU完全不用参与计数器就是编码器位置的实时映射。这个模式在STM32的参考手册里叫Encoder Interface Mode属于定时器的三大高级功能之一。我自己的体会是编码器模式最爽的地方不是“能测”而是“白嫖”——你几乎不用写任何处理逻辑CubeMX里勾几个选项初始化完之后读CNT寄存器就是当前的位置增量。对于做小车、云台、机械臂这类需要闭环控制的项目来说这个功能可以说是刚需。当然编码器模式也不是万能的。它适合增量式编码器不适合绝对式编码器那是SPI或者格雷码的事。它对信号质量也有要求如果电机振动大、线材屏蔽差还是得加硬件滤波或者RC滤波。这些坑后面我详细说。先说结论如果你要测电机转速并且能用上编码器STM32定时器编码器模式是首选方案。它的硬件计数能力、方向判断能力、抗干扰能力都比软件数脉冲靠谱得多。2. CubeMX配置编码器模式几个关键选项一次说清2.1 快速初始化从建工程到跑起来用STM32CubeMX配置编码器模式步骤并不多但每一步都有讲究。先拿我常用的STM32F103C8T6蓝色药丸板举例配合一个600线的增量式编码器。第一步建工程、选芯片、配置时钟这些常规操作就不展开了。直接进到定时器配置页面。我习惯用TIM3来做编码器接口因为TIM3的CH1和CH2分别映射到PA6和PA7这两个引脚在F103上非常常用而且TIM3是16位定时器65535的计数值对大多数应用足够用了。如果你需要更高分辨率可以换TIM2也是16位但可以级联成32位后面会提一句。在CubeMX里选中TIM3然后在Combined Channels那里选择Encoder Mode。这里有个细节只有选择了Encoder Mode下面才会出现编码器相关的配置项。选完之后CH1和CH2会自动变成Encoder A和Encoder B不需要你再手动折腾。然后就是几个关键参数Encoder Mode这里有两个选项TI1和TI2、TI1 or TI2。前者是双沿计数A相B相都在每个沿计数分辨率最高后者是单沿计数只在A相或B相的边沿计数。我一般用TI1 and TI2也就是双沿计数分辨率直接翻倍。Polarity极性。如果你的电机正转时计数器反而减小把这里改成反相就行。但更推荐用后面的方法在代码里用方向位判断不要轻易改接线。Prescaler预分频。测转速时我一般设0也就是不分频保持最大分辨率。如果你想要更小的计数范围可以分频但精度会下降。Counter Period自动重载值。这里就要注意了编码器模式本质是加减计数Counter Period决定了计数范围。比如设成999那么计数范围就是0到999超过999会回绕反向超过0也会回绕。这个回绕值在算转速时必须处理。这里有个很重要的思路编码器模式下的Counter Period不是随便设的。如果你只需要测转速而不是记录绝对位置那么比如设成1000这样计数器每转一圈回绕一次或者转多少圈回绕一次你只需要算回绕的次数结合周期就能算出转速。如果你需要测位置那就要根据编码器线数来算600线编码器4倍频后就是每转2400个计数Counter Period至少得设成2399以上否则一圈就溢出了。我这里先按测转速来配置Counter Period设成999这样每1000个计数回绕一次回绕即是一个已知的物理量方便后面算转速。2.2 别忘了使能编码器的全局中断很多人配置完定时器参数发现计数器确实在跟着电机转但就是读不到稳定的值或者用了DMA/中断方式却一直不触发。我排查过很多次最后发现是忘了勾选NVIC里的定时器中断使能。在CubeMX的NVIC Settings页面找到TIM3 global interrupt勾上Enabled。如果你只是用主循环轮询CNT值不勾也能工作但如果你要用定时器中断来周期采样转速这个必须勾。我自己的习惯是永远勾上哪怕是轮询模式也先勾上因为后面调试、打印、做控制周期几乎都会用到中断。另外还有个容易忽略的选项定时器的工作时钟源。CubeMX默认会帮你配好但如果你之前改过时钟树要确认一下APB1的定时器时钟是多少因为编码器的计数频率和时钟树相关后面算转速会用到这个频率。2.3 编码器模式下的GPIO配置细节编码器模式下PA6和PA7需要配置成什么模式这里有个经典问题到底是开漏输出、推挽输出、还是输入答案是输入模式但要注意CubeMX在Encoder Mode下会自动把对应引脚配置成输入模式你不需要手动改。如果你发现引脚类型还是输出回头检查一下是不是没有正确选择Encoder Mode。另外要注意的是虽然编码器是外部信号输入但引脚内部的上拉下拉电阻有时候会有影响。如果编码器输出是开漏型的你就需要开启内部上拉如果是推挽输出则无所谓。我一般遇到信号不稳的情况会先把内部上拉打开试试。在CubeMX里对应引脚的GPIO配置中把Pull-up/Pull-down设为Pull-up即可。2.4 像串口一样读编码器的值配置完之后生成代码你可能会发现定时器的计数器在Main函数里根本看不到特殊API。没错编码器模式下没有额外的库函数你只需要读取TIM3的CNT寄存器。标准库或者HAL库的读取方式分别是// HAL库 uint16_t count __HAL_TIM_GET_COUNTER(htim3); // 标准库 uint16_t count TIM3-CNT;就是这么简单。但要注意读CNT寄存器是不会清零的——它就是一个实时变化的计数器你的任务是定期读取它计算差值然后换算成转速。3. 从脉冲计数到真实转速这一步才是核心3.1 转速换算公式手把手推导一遍拿到了计数器的值接下来才是关键怎么把它换算成电机每分钟转多少转RPM。我们以600线编码器为例先明确几个概念编码器线数P/R600表示编码器每转一圈输出600个脉冲这里指的是A相的单脉冲。4倍频因为使用了TI1 and TI2双沿计数每转一圈的计数个数是 600 × 4 2400。也就是说计数器每增加2400就代表电机转了一圈。再来看采样周期。假设你每10ms读一次CNT两次读数之间的差值记为delta。那么转速公式就是转速(RPM) delta / (2400 × 0.01) × 60拆开理解delta / 2400 是这10ms内转了多少圈除以0.01是每秒转多少圈乘以60就是每分钟转多少圈。如果你采样周期是10ms600线编码器4倍频转速是10RPM时每10ms的delta是4。如果转速是3000RPMdelta是12000。注意delta可能超过65535吗3000RPM × 2400 / 6000ms ≈ 12000没超过但更高转速或者更低采样周期就有风险了。所以在工程上我通常会把采样周期和Counter Period配合设计确保两个采样点之间的delta不会溢出16位计数器。3.2 溢出与方向处理最容易翻车的两个场景这里有两个经典问题我敢说九成新手都会遇到。第一个是计数器回绕导致的负值误判。假设Counter Period是999计数器从980涨到1010但因为上限是999实际读数可能是从980 → 999 → 0 → 10如果你简单用“本次读数 - 上次读数”算出来就是10 - 980 -970变成负数了。这不是电机反转是正常回绕你必须处理这个回绕。处理方法有几种把计数器类型看成16位有符号的处理方式利用硬件回绕特性直接做差值运算再强制转成有符号类型。手动判断如果delta 500Counter Period的一半说明发生了正向回绕实际delta delta - 1000如果delta -500说明发生了反向回绕实际delta delta 1000。我说下第一种方式的代码比较简洁int16_t delta (int16_t)(current_count - last_count);这种方法利用了C语言强制转换的截断逻辑两个无符号16位数相减超过65535/2就自动变成负数低于-32768就变成正数。前提是Counter Period要小于32767这样可以保证不会发生歧义。我测试下来这个写法最稳也最容易看懂。第二个问题是方向判断。编码器模式下硬件已经自动帮你把方向体现在计数增减上了正转计数器加反转计数器减。所以你根本不需要额外判断方向只要看delta的符号就行。正数就是正转负数就是反转0就是静止或者转速太低没采样到。我自己在写控制算法时是用一个有符号变量记录整个运动过程中的位置变化再同步保存方向状态。这样即使中间有短暂停顿也不会丢方向信息。3.3 采样周期怎么选不是越短越好采样周期决定了转速测量的实时性和精度。理论上采样周期越短转速反馈就越及时闭环控制响应越快。但采样周期太短会引入量化误差比如600线编码器4倍频每转2400计数如果采样周期是1ms那么转速10RPM时每毫秒只有0.4个计数——根本采不到整数测出来就是0RPM或者抖动。这就是为什么低速时测速不准的根源。我的经验是采样周期的选择要保证该转速下每个周期至少有几个计数。比如你最低要测10RPM编码器每转2400计数那么10RPM每秒产生400个计数每100ms是40个计数这个精度就够用了。如果你的应用需要更快的响应可以用T法、M法这些高级测速算法但用定时器编码器模式固定采样周期已经能满足大部分DIY项目。我在小车上用的是10ms采样周期600线编码器能稳定测到20RPM左右再低就有些抖动了。如果只做位置控制采样周期可以适当放宽到50ms甚至100ms对位置精度影响不大。3.4 用定时器中断做周期采样附完整参考代码如果只是轮询读CNT会受主循环负荷影响采样周期不固定算出来的转速自然不准。我一般会用定时器中断来做固定的采样周期。假设用TIM6做10ms中断在中断里读取TIM3的CNT计算delta并更新转速值。参考代码如下// 全局变量 volatile int16_t motor_delta; volatile int16_t motor_speed_rpm; static uint16_t last_count 0; // TIM6中断服务函数10ms一次 void TIM6_IRQHandler(void) { if (TIM_GetITStatus(TIM6, TIM_IT_Update) ! RESET) { TIM_ClearITPendingBit(TIM6, TIM_IT_Update); uint16_t current_count TIM3-CNT; int16_t delta (int16_t)(current_count - last_count); last_count current_count; motor_delta delta; // 600线编码器4倍频2400计数/转10ms采样周期 // 转速(RPM) delta / 2400 / 0.01 * 60 delta * 2.5 motor_speed_rpm (int16_t)((float)delta * 2.5f); } }HAL库的写法也类似就是中断回调换成了HAL_TIM_PeriodElapsedCallback。需要注意的是这个换算里乘了2.5但这个系数只在600线编码器、4倍频、10ms采样周期下成立。如果换了编码器或者采样周期一定要重新算。这个代码虽然简单但我实际跑起来发现一个细节float乘法在中断里偶尔会有微小误差累积。如果想追求极致精度可以把换算系数转成定点运算比如先用整数乘除最后再取整。但大多数应用这点误差完全无感。4. 避坑清单这些坑我一个个替你踩过了4.1 编码器接线与信号质量最常见的翻车点先说接线。增量式编码器一般有6根线A相、B相、Z相零位信号、电源VCC、地GND还有一个屏蔽线或者第五根线是另一路电源。我见过很多人在接线上翻车A相接到了CH2、B相接到了CH1结果正反转判断反了——这不是大问题软件里反转一下就行。但更麻烦的是电源和地没接好导致信号电平是浮空的读数全是乱跳。编码器的电源最好用独立的5V或3.3V特别是电机驱动板的电源纹波大的时候编码器信号很容易被干扰。我用过很多次带编码器的直流减速电机发现如果电机和编码器共用一个电源电机启动瞬间编码器读数会莫名其妙跳一下就是这个原因。如果你遇到读数乱跳排查顺序是示波器看A相B相波形确认是不是规则方波。检查电源用万用表量编码器供电电压纹波是不是很大。检查接地编码器地和单片机地是否共地。检查引脚配置内部上拉是否开启。检查接线是否过长超过20cm建议加屏蔽是否和电机线绑在一起。其中第5条我踩过最深。有一次我把编码器线和电机驱动线并排扎在线槽里测出来的转速在某个速度区间疯狂抖动后来把编码器线独立走线问题立刻消失。说到根上还是共模干扰电机PWM调速时的电流变化会通过线缆耦合到编码器信号上。4.2 编码器模式的时序要求硬件上如何配合增量式编码器输出的是标准正交信号A相B相之间存在90度相位差。STM32的定时器编码器模式理论上可以处理任意速度的信号但前提是信号满足几个基本条件信号上升沿/下降沿要干净。如果边沿太缓定时器可能会在临界点误判方向。两相信号的相位差不能太小。如果编码器安装时A相B相没有严格对齐90度某些位置会导致正反转判断出错。对于高速电机建议在编码器输出和单片机引脚之间加一个施密特触发器芯片比如74HC14或者RC滤波器。RC滤波器的计算方法很简单假设编码器输出频率是10kHz选择截止频率在100kHz以上取R1kΩC1nF算出来截止频率约159kHz对10kHz信号几乎没有衰减但对高频噪声有抑制作用。还有一个容易被忽略的硬件细节编码器输出的VOH高电平电压是否兼容单片机的输入电平。如果编码器是5V供电输出高电平接近5VSTN32的引脚耐压是5V可以直连但如果编码器是12V供电就必须电平转换或者用光耦隔离否则芯片直接烧。我印象里有一次帮朋友排查他用的编码器是12V供电直接接了STM32的引脚结果一上电芯片就发热换了芯片又发热。后来才发现是电平问题加了个分压电阻才解决。所以接线前务必查编码器手册上的输出电平参数这个问题真不是吓唬人。4.3 计数器位数与数据类型的搭配STM32F103的TIM2、TIM3、TIM4、TIM5都是16位定时器。16位计数器的范围是0到65535编码器4倍频后每转2400计数那最大可测的转数范围大约是27圈65535 / 2400 ≈ 27.3。如果电机连续转很多圈而不及时读取计数器就会回绕位置信息就不可靠了。解决办法有三个定时读取比如10ms中断里读一次并更新累计位置。使用32位计数器STM32F4系列有32位定时器或者用TIM2/TIM5做32位模式。软件扩展计数范围把16位计数值转成有符号32位然后当作连续计数。对转速测量来说第1个办法就够用了因为你不关心绝对位置只关心两次采样间的差值。但对位置控制来说必须做累计比如小车走多远、机械臂转到哪个角度这些都需要把每次的delta累加起来。另外用HAL库时注意读取CNT的API返回的是uint32_t但你既要做差值又要判断正负方向我建议统一用int16_t或者int32_t处理避免符号问题。这个我在前面代码里已经用到了。4.4 编码器Z信号零位信号要不要用很多增量式编码器还有第三路输出Z相也叫零位信号每转一圈输出一个脉冲。这个信号在伺服电机和机械臂控制里特别重要因为它可以帮助你校准绝对位置上电时你不知道电机转到哪个位置但只要捕捉到Z信号你就知道那一瞬间是机械零位。但在测转速这个场景里Z信号不是必须的。测转速只需要A相B相就够了用Z信号反而会引入额外的中断处理。不过如果你后续要做位置闭环并且需要绝对零点那Z信号就很有用了。我一般会在CubeMX里把Z信号接到另外一个外部中断引脚上而不是占用定时器的编码器通道这样代码结构更清晰。4.5 编码器模式与PWM输出同时用的注意事项做电机控制时你通常需要同时输出PWM控制电机并读取编码器测量转速。这就涉及两个定时器的配合问题。我遇到过不少朋友PWM用的TIM3编码器也选了TIM3结果引脚冲突PWM波形出不来编码器也不计数。这是因为同一颗定时器的引脚配置不能同时用于两种功能。解决办法很简单PWM和编码器尽量用不同的定时器比如PWM用TIM1或TIM2编码器用TIM3或TIM4。再一个需要注意的是STM32的PWM频率和编码器计数频率最好不要在同一个数量级。PWM频率太高比如20kHz以上而编码器线数又多、转速又快计数器增量容易超出预期导致采样间隔内溢出。解决方法是用更高的采样频率或者降低PWM频率。我在项目中一般PWM用10kHz编码器采样10ms600线编码器跑下来很稳定。4.6 初次调试快速验证三步确认编码器模式是否生效我每次换一块板子或者换一个新编码器都会先跑一个最简验证程序三步确认整个链路是否正常。第一步配置好编码器模式编译烧录然后用手慢慢转动电机轴或者用手指拨动编码器电脑串口打印CNT值。如果CNT值跟着转动手势变化说明编码器模式已经生效。第二步正转、反转各转10圈记录CNT最大值和最小值确认计数范围是否符合预期。比如600线编码器4倍频转10圈应该增加24000如果没回绕。第三步把电机接到PWM驱动上用固定占空比驱动电机打印转速值看看是否和理论值接近。如果差很多优先检查采样周期、换算系数和编码器线数。这三步验证法我每次做新项目都会跑一遍能省下后面调试控制器的几个小时。5. 进阶玩法编码器模式还能干这些事5.1 用编码器做位置控制四倍频分辨率怎么算很多项目不只需要转速还需要精确控制位置比如云台、机械臂、3D打印机。编码器模式天然支持位置控制你只需要在初始化时把计数器清零然后不断累加每次采样周期的delta就能得到当前的位置以计数脉冲为单位。这里的“单位”有讲究600线编码器4倍频后是2400脉冲/转也就是每个脉冲对应0.15度360 / 2400 0.15。如果你的应用要求更高的角度分辨率那就得选更高线数的编码器或者用更高倍频的方式。在位置控制里有个经典的PID算法结构外环位置环内环速度环。编码器同时提供位置和速度反馈——位置就是累计的delta速度就是上一节算出来的转速。两者共享同一套采样数据非常高效。我自己在做一个云台的时候就是这样用的TIM3编码器模式10ms采样位置环PID周期10ms速度环PID周期10msYaw轴控制在±0.2度以内效果非常满意。这要放到以前用外部中断数脉冲光是中断开销就够喝一壶了。5.2 编码器模式配合DMA实现无中断高速采样如果你的电机转速非常高比如某些航模电机10ms采样周期可能不够需要更短的采样间隔但又不想频繁进入中断这时候可以考虑用DMA配合定时器来做周期搬运。思路是用定时器触发DMA把CNT寄存器的值定时搬运到内存数组里主循环再去处理这批数据。这样CPU只在主循环里处理数据不需要每个采样周期都进中断。CubeMX里的配置方法是在定时器配置页面把DMA请求使能TIM3的DMA request勾上然后在DMA设置里添加一个循环模式的内存到外设传输外设地址填TIM3的CNT寄存器地址比如0x40000424这个地址可以在参考手册上查到内存地址是一个uint16_t数组传输长度是数组长度。需要注意DMA搬运的是计数值快照和中断方式等价但省去了中断开销。DMA模式下也要处理回绕和方向符号问题逻辑上和中断模式完全一样。不过说实话对于大多数电机控制场景10ms中断完全够用DMA属于锦上添花的操作不建议一上来就折腾。5.3 多编码器同时测量TIM2/TIM3/TIM4怎么分配有些项目一个单片机要同时测量多个电机转速比如四驱小车、双轮平衡车、六轴机械臂。STM32F103有多个定时器支持编码器模式可以同时跑多路编码器。但引脚分配要提前规划。F103上TIM2的CH1/CH2PA0/PA1TIM3的CH1/CH2PA6/PA7TIM4的CH1/CH2PB6/PB7这样三路编码器就可以同时工作互不干扰。如果是F407还有TIM8可以支持第五路编码器TIM5也可以编码器模式在F407上TIM5是32位定时器做位置控制更爽。多路编码器同时采样时注意每路编码器的采样中断尽量错开避免中断叠加导致抖动。我的做法是让几个定时器同时作为采样中断源但错开相位比如TIM6在0ms、10ms、20ms...触发TIM7在5ms、15ms、25ms...触发这样每次中断只有一路采样逻辑在执行不会发生中断嵌套。5.4 定时器级联实现32位编码器计数突破16位限制如果你用F103又想记录很长的位置行程有个进阶玩法把两个16位定时器级联成32位编码器计数。方法是用从定时器驱动主定时器类似级联功能但配置比较复杂。在F103上不太推荐这么干因为可用资源有限而且调试成本高。如果你确实需要32位编码器计数直接换F407或者F4系列——TIM2和TIM5本身就是32位定时器直接就能支持编码器模式Counter Period可以设到4294967295几乎不会溢出。但即使32位定时器也要注意换算时不要用错类型。HAL库的__HAL_TIM_GET_COUNTER返回uint32_t我建议直接用int32_t接收这样回绕处理依然靠强制转换完成逻辑清晰。6. 实测数据不同转速下的测量误差分析写这篇文章前我专门做了一组实验用600线编码器、600RPM直流减速电机、STM32F103C8T6分别在10ms、50ms、100ms采样周期下测速对比实际转速和测量值。实验方法很简单用直流稳压电源给电机供电用一个手持式激光转速表测量电机输出轴的实际转速作为参考值然后把编码器测得的转速和参考值对比。测试结果如下表转速单位RPM参考转速10ms采样50ms采样100ms采样10ms误差50ms误差100ms误差100991001001%0%0%5004985005010.4%0%0.2%100010029999980.2%0.1%0.2%20002005199820020.25%0.1%0.1%从结果能看出转速越高测量误差越小采样周期越长测量越稳定。这是量化误差的本质转速高时每个采样周期内的计数脉冲多量化误差占比小采样周期长时同样道理。但采样周期长也会带来一个问题控制的滞后。在闭环控制里反馈太慢会导致系统振荡甚至发散。所以实际工程中要做权衡。如果既要实时性又要精度可以考虑动态采样周期低速时用长周期高速时用短周期但这种方案复杂度高一般DIY项目不用。我自己的平衡小车项目里用10ms采样周期600线编码器转速在200RPM以上时控制很稳定低速时稍微有点抖但完全在可接受范围内。7. 编码器模式和外部中断方案怎么选肯定有人会问既然编码器模式这么好为什么还有人用外部中断数脉冲我先说结论编码器模式适合绝大多数场景但外部中断方案在某些特定情况下也有优势。编码器模式的优点前面都说过了硬件计数、方向自动判断、CPU占用低、可靠性高。缺点是占用了定时器的两个通道而且定时器数量有限。如果你的项目里已经占用了很多定时器可能会导致资源不够。外部中断方案则是用一个外部中断引脚只监听A相信号每个上升沿触发一次中断在中断里判断B相的电平来决定加还是减。这种方案的优点是引脚占用少只需要一个外部中断引脚加一个普通GPIO而且不受定时器资源限制。缺点是中断频率高、CPU开销大、信号抖动可能导致误判。在做人的实际项目里我推荐的原则是项目里定时器资源充裕用编码器模式省心可靠。如果要多路编码器但定时器不够可以考虑外部中断方案但要做好滤波和消抖。如果只测一路且编码器信号质量差还是先用硬件滤波再走编码器模式。外部中断方案还有一个变种用两个外部中断同时监听A相B相在中断里判断相位差方向。这种方式精度接近编码器模式但中断频率翻倍CPU负担更重一般只在对实时性要求极高的场景下使用。总而言之编码器模式是硬件级的、可靠的、省心的绝对值得优先掌握。8. 最后再说几句掏心窝的话做电机控制这几年编码器模式一直是我用得最多的定时器功能之一。很多朋友刚开始接触时总喜欢用软件去模拟编码器解码——打断点、看变量、数脉冲——结果不仅效率低还容易出错。其实硬件已经帮你把这些事做完了你要做的就是学会配置、读懂寄存器剩下的大把时间可以做控制算法、做逻辑优化。我个人的建议是上手一个项目时先把编码器模式和转速测量跑通哪怕只是一个LED亮度跟随转速变化的小实验也比纯看资料学得快。因为编码器模式本身不难难的是你能否快速验证自己的配置是否正确。一旦你熟悉了它的脾气后面做位置控制、速度闭环、甚至是多电机协调控制就是水到渠成的事。最后再分享一个小技巧调试编码器相关代码时串口打印不要用阻塞方式比如HAL_UART_Transmit直接发字符串不然高速数据下会卡住主循环导致采样周期不稳定。用DMA串口发送再配合环形缓冲区或者只在调试时用低频打印比如每秒打印一次实际量产代码里把打印全关掉。这看起来是个小事但在跑闭环控制时却能省不少心。希望这份避坑清单对你有用。如果你在编码器模式上还有其他问题欢迎一起交流我也很乐意看看你的实际数据和踩坑经历。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

不写文本只做决策:类型化决策引擎的提示词工程实战 2026/10/2 5:52:56

不写文本只做决策:类型化决策引擎的提示词工程实战

Jev 是个怪东西。它不是用来聊天的,也不是用来写文章、写代码注释、写周报的。它最大的特点是:不写文本,只做决策。你丢给它一段上下文,它返回的不是一段通顺的话,而是一个结构化的选择结果——一个枚举值、一个 JSON …

阅读更多 →
Unity Win10平板InputField虚拟键盘唤醒方案 2026/10/2 5:52:56

Unity Win10平板InputField虚拟键盘唤醒方案

1. 项目概述:为什么Win10平板上InputField不弹虚拟键盘,是Unity开发绕不开的硬伤 在Unity做Windows平台触控应用时,尤其是面向Surface Pro、Lenovo Yoga这类二合一设备或工业级Win10平板部署时,“点击InputField没反应”“光标闪…

阅读更多 →
国内大学生最适用的AI论文软件是哪款? 2026/10/2 5:52:56

国内大学生最适用的AI论文软件是哪款?

国内高校学生常用的 AI 论文辅助工具,以本土化全流程产品为主,结合通用大模型与专业功能模块,覆盖选题、框架搭建、初稿撰写、查重降重、格式调整等关键环节,以下是主流工具详解与对比:一、本土全流程论文 AI 工具&…

阅读更多 →
浮点加减法五步硬件流程:对阶、求和、规格化、舍入、溢出 2026/10/2 5:52:56

浮点加减法五步硬件流程:对阶、求和、规格化、舍入、溢出

1. 这不是数学题,是硬件在“打补丁”:浮点加减法本质是一场精度与速度的妥协你写过if (a b)判断两个浮点数是否相等吗?编译器没报错,程序却总在某个边界值上莫名其妙跳过分支——这不是你的bug,而是你第一次撞上了浮点…

阅读更多 →
操作简便吗?8款一键生成论文工具榜单,毕业论文轻松搞定! 2026/10/2 5:52:56

操作简便吗?8款一键生成论文工具榜单,毕业论文轻松搞定!

论文写到一半卡壳,灵感枯竭怎么办?文献检索耗时费力,却找不到核心观点?格式排版反复修改,查重率始终不理想? 别担心!AI论文工具的出现,正为广大学生提供高效、专业的写作支持。本文…

阅读更多 →
WeKnora 部署实战:开源 RAG 知识库问答系统的选型与调优 2026/10/2 5:52:49

WeKnora 部署实战:开源 RAG 知识库问答系统的选型与调优

很多人第一次看到 WeKnora 这个名字,第一反应是“又一个 RAG 开源项目?”,我一开始也这么想。后来仔细看了下,才发现这是腾讯微信团队出品,定位很明确:把企业私域知识库和 AI 大模型接起来,做“…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉