当前位置: 首页 > article >正文

步进电机PID与编码器

电机PID闭环控制完整总结扩充版一、系统需要什么硬件层面组件作用推荐选择电机执行机构直流有刷 / 无刷电机传感器反馈位置/速度增量式编码器A/B两相MCU控制核心支持编码器模式QEI的定时器驱动模块功率放大L298N、TB6612、MOSFET驱动等选型结论精确定位 → 编码器每圈脉冲数 ≥ 400简单调速 → 霍尔传感器。二、编码器模式详解重点扩充2.1 编码器如何工作增量式编码器输出A相和B相两路脉冲相位差90°正转A相领先B相 90°反转A相滞后B相 90°2.2 编码器模式做了什么MCU将定时器配置为编码器模式后硬件自动完成功能说明自动计数每个脉冲边沿硬件自动增加或减少计数器自动鉴相根据A/B相位关系自动判断方向零CPU开销不需要中断不占用软件资源抗抖动硬件滤波比软件中断更可靠2.3 硬件计数器的真实状态关键认识硬件计数器本身是无符号的范围固定位数范围溢出点16位0 ~ 6553565535 → 032位0 ~ 4294967295最大值 → 02.4 有符号读取技巧核心硬件不存储符号符号是你解读的方式。c// 假设16位计数器当前硬件值为 65535 uint16_t raw TIM2-CNT; // raw 65535 // 不同的解读方式得到不同的意义 uint32_t pos_u raw; // 65535无符号 int32_t pos_s (int32_t)raw; // -1 有符号为什么这很重要因为当你从0开始反转电机时硬件0 → 65535 → 65534 → 65533 ...有符号解读0 → -1 → -2 → -3 ...你获得了一个可以无限延伸的、带方向的线性位置空间尽管硬件在循环。这就是编码器读取的魔法用有符号的眼光看无符号的硬件。2.5 标准读取代码c// 16位定时器 - 扩展到32位有符号 int32_t get_encoder_position(void) { return (int32_t)TIM2-CNT; } // 32位定时器 - 直接读取范围 ±21亿足够大多数应用 int32_t get_encoder_position(void) { return (int32_t)TIM2-CNT; // TIM2是32位定时器 } // 如果需要无限精度超长行程- 扩展为64位 int64_t get_encoder_position_64bit(void) { return (int64_t)(int32_t)TIM2-CNT high_bits; }编码器模式的“正反转”不需要你手动设置也不能通过一个开关来直接改变。它的核心逻辑是由硬件自动完成的根据A、B两相输入信号的相位关系谁领先谁90°硬件会自动决定计数器是递增正转还是递减反转。如果你发现读取到的计数值变化方向和电机的实际转动方向相反例如电机正转时读数在减小有两种常用的方法可以修正️ 方法一交换A、B相信号线硬件调整这是最直接、最可靠的方法。将连接到MCU定时器输入引脚的两根线A相和B相对调即可。这样原来A相领先B相90°变成了B相领先A相90°硬件判断的方向逻辑就会完全反转。⚙️ 方法二配置寄存器反转输入极性软件调整如果硬件接线不便可以通过软件来修正。配置与编码器相连的定时器的CCER寄存器对输入通道的极性进行“反相”设置。例如在STM32中通过设置TIM_CCER寄存器的CC1P位可以将TI1输入信号反相。这样硬件看到的相位关系就等同于A、B线被交换了从而在不改变接线的情况下实现对方向逻辑的翻转。一些集成的驱动器和MCU库也提供了类似的“编码器反向”参数选项。 代码中如何判断正反转在编码器模式下你不需要自己写代码去判断正反转因为硬件已经把这个信息直接体现在了计数器的值里。你只需要在代码中读取计数器的值它就会告诉你方向和位置计数值增加表示电机在一个方向通常视为正转上旋转。计数值减少表示电机在相反方向反转上旋转。三、如何得到当前转速位置差分法在定时中断中计算cstatic int32_t last_position 0; void speed_update(void) { // 每 10ms 调用一次 int32_t pos get_encoder_position(); int32_t delta pos - last_position; // 10ms 内的脉冲变化 float speed_rpm (float)delta * 60000.0 / (PULSE_PER_REV * INTERVAL_MS); // 例10ms变化40脉冲400线电机则转速 40*60000/(400*10)600 rpm last_position pos; }四、如何实现精确定位软件逻辑4.1 核心架构text┌────────────────────────────────────────────┐ │ 主循环 while(1) │ │ • 接收目标位置如 target 10000脉冲 │ │ • 串口/显示/其他任务 │ └────────────────────────────────────────────┘ ↓ ┌────────────────────────────────────────────┐ │ 定时器中断固定周期如 1~10ms │ │ ① current get_encoder_position() │ │ ② error target - current │ │ ③ output PID_Update(error) │ │ ④ set_pwm(output) │ │ ⑤ if (abs(error) DEADBAND) stop_motor() │ └────────────────────────────────────────────┘4.2 位置PID简化实现c// PID参数 float Kp 2.5; // 比例系数 float Ki 0.05; // 积分系数可选 float integral 0; float integral_limit 100; // 积分限幅 // 死区 #define DEADBAND 5 #define PWM_MAX 1000 int32_t position_pid(int32_t error) { // 死区判断 if (abs(error) DEADBAND) { integral 0; return 0; } // P项 float p_term Kp * error; // I项可选 integral error; if (integral integral_limit) integral integral_limit; if (integral -integral_limit) integral -integral_limit; float i_term Ki * integral; // 总输出 int32_t output (int32_t)(p_term i_term); // 限幅 if (output PWM_MAX) output PWM_MAX; if (output -PWM_MAX) output -PWM_MAX; return output; }4.3 电机控制接口cvoid set_motor_output(int32_t output) { if (output 0) { GPIO_WriteBit(MOTOR_DIR_PORT, MOTOR_DIR_PIN, Bit_SET); // 正转 TIM_SetCompare1(PWM_TIM, output); // 设置PWM } else if (output 0) { GPIO_WriteBit(MOTOR_DIR_PORT, MOTOR_DIR_PIN, Bit_RESET); // 反转 TIM_SetCompare1(PWM_TIM, -output); } else { TIM_SetCompare1(PWM_TIM, 0); // 停止 } }五、溢出处理当行程很长时5.1 问题说明16位定时器范围-32768 ~ 32767400线电机约转±41圈就溢出了32位定时器范围-21亿 ~ 21亿400线电机可转 ±137万圈通常够用5.2 如果需要无限行程64位扩展cvolatile int64_t high_bits 0; static int32_t last_value 0; void TIMx_IRQHandler(void) { // Update中断 int32_t now (int32_t)TIMx-CNT; int32_t delta now - last_value; // 检测跳变 半圈即为溢出 if (delta 32768) high_bits - 65536; if (delta -32768) high_bits 65536; last_value now; } int64_t get_64bit_position(void) { return high_bits (int32_t)TIMx-CNT; }六、常见问题排查现象可能原因解决方法读数始终为0编码器接线错误检查A/B相是否接对上拉电阻是否缺失正反转读数都增加编码器模式配置错误确认配置为TIM_EncoderMode_TI12双边沿数值突变未处理溢出用int32_t读取并处理Update中断到达目标后震荡死区太小或P太大增加死区5~10脉冲或减小Kp定位有静差缺少积分项加入Ki如0.01~0.1七、一句话速记硬件自动数脉冲并分辨方向用int32_t读取即可获得带符号的线性位置在固定周期的定时中断里用PID比较目标与当前位置的误差误差小于死区时停止——这就是编码器电机精确定位的全部秘密。八、实战检查清单步骤确认事项☐编码器A/B相正确连接到MCU定时器输入引脚☐定时器配置为编码器模式双边沿计数☐用(int32_t)CNT读取验证正转读数增加、反转读数减小☐设置一个独立的定时中断周期1-10ms☐在中断中实现位置PIDP死区可选I☐主循环可随时更新target_position☐处理溢出用32位定时器 或 16位溢出中断☐电机最终能精确停在目标位置误差≤几个脉冲如果这些都能做到你的电机就能实现“我要走N个脉冲就走N个脉冲”的精确位置控制了。

相关文章:

步进电机PID与编码器

电机PID闭环控制完整总结(扩充版)一、系统需要什么?(硬件层面)组件作用推荐选择电机执行机构直流有刷 / 无刷电机传感器反馈位置/速度增量式编码器(A/B两相)MCU控制核心支持编码器模式&#xff…...

别再为论文配图头秃了!国产生物医学绘图平台BioGDP,一站式解决素材、版权、效率三大难题

科研人谁懂啊!画论文机制图、流程图、综述图熬到大半夜,素材画风乱、细节不严谨、投稿还被问版权,简直是科研路上的 “拦路虎”!一款国产生物医学绘图平台BioGDP,在实际使用中表现突出,能够有效解决上述痛点…...

B站缓存视频合并工具:Android平台如何3步实现离线弹幕播放?

B站缓存视频合并工具:Android平台如何3步实现离线弹幕播放? 【免费下载链接】BilibiliCacheVideoMerge 🔥🔥Android上将bilibili缓存视频合并导出为mp4,支持安卓5.0 ~ 13,视频挂载弹幕播放(Android consoli…...

终极免费方案:让Windows电脑变身专业级AirPlay 2接收器

终极免费方案:让Windows电脑变身专业级AirPlay 2接收器 【免费下载链接】airplay2-win Airplay2 for windows 项目地址: https://gitcode.com/gh_mirrors/ai/airplay2-win 还在为Windows电脑无法接收iPhone或iPad的AirPlay投屏而困扰吗?Airplay2-…...

百万组内码永不重复:EV1527学习码编码芯片让遥控器更“聪明”

引言:遥控器的“身份危机”与学习码的诞生你有没有遇到过这样的尴尬:车库门遥控器不小心摔坏了,去配一个新的,结果发现原来的那个还能用,两个遥控器同时“打架”?或者,邻居家买了同款电动门&…...

postgresql 拼接字段

postgresql 文档表有两个字段,tag1和tag2,两个字段存储的都是标签,多个标签用逗号分隔。现在需要用逗号连接tag1和tag2,作为一个tag字段返回。在 PostgreSQL 中,直接拼接 tag1 || , || tag2 很容易产生多余逗号、首尾逗…...

Azure DevOps 中的权限问题:Docker镜像上传的误区与解决之道

在使用 Azure DevOps 进行持续集成和持续交付(CI/CD)时,常常会遇到一些文件权限相关的问题,尤其是在处理 Docker 镜像上传任务时。这些问题不仅影响工作流的效率,还可能导致构建失败。本文将通过一个具体的实例来探讨如何避免这些常见的问题,并提供解决方案。 背景介绍 …...

2026 AI搜索优化必备,免费GEO监测工具实测

摘要随着生成式AI搜索的普及,GEO(Generative Engine Optimization,生成式引擎优化)已成为企业数字营销的重要技术方向。本文对当前国内外主流的5款GEO优化工具进行了技术评测。评测维度包括功能完整性、AI模型支持、诊断能力和性价…...

确保REST API安全:Nonce的正确使用

在开发WordPress REST API时,安全性是我们必须高度关注的方面之一。特别是对于需要身份验证的请求,nonce(数字签名)是防止CSRF(跨站请求伪造)攻击的重要手段。本文将通过一个实例,展示如何在WordPress中正确使用nonce来保护API的安全。 什么是Nonce? Nonce是一个唯一…...

在TensorRT里给CenterNet加DCNv2插件:一份保姆级的自定义算子实战指南

在TensorRT中实现DCNv2自定义算子:从CUDA核函数到工程落地的深度实践 当目标检测模型CenterNet遇上可变形卷积DCNv2,算法工程师们往往会在模型部署阶段遭遇"最后一公里"难题——主流推理引擎对这类创新算子的支持滞后。本文将揭示如何通过Tens…...

别再被NumPy的(2,)形状坑了!手把手教你用reshape和newaxis搞定广播错误

NumPy形状陷阱全解析:从广播错误到高维操作实战 如果你曾经在NumPy中看到过ValueError: operands could not be broadcast together with shapes (2,) (3,)这样的错误,然后盯着屏幕百思不得其解,那么这篇文章就是为你准备的。NumPy的形状(sha…...

口碑好的中天光合叶绿素厂家

在农业种植领域,作物的生长状况和产量品质一直是农户们最为关心的问题。而叶片养护和光合作用效率的提升,更是其中的关键环节。不过,农户们在实际种植过程中,常常面临诸多痛点。许多作物在生长期间,会因土壤缺素&#…...

IgH EtherCAT 从入门到精通:第 25 章 添加新的邮箱协议

第 25 章 添加新的邮箱协议 导读摘要:当你需要支持一个新的 EtherCAT 邮箱协议时,IgH Master 提供了清晰的扩展框架。本章将以添加一个假想协议为例,讲解 FSM 实现、ioctl 接口扩展、命令行工具扩展和编译系统集成的完整流程。 25.1 邮箱协议扩展框架 回顾第 21 章的邮箱架…...

零基础极速上手教程:30分钟用AI建站工具做出第一个网站

如果你完全不懂技术,对HTML、CSS、服务器这些词一头雾水,但又急需一个拿得出手的网站,这篇教程就是为你准备的。我们将抛开复杂的理论,用一套通用、可复制的实操步骤,带你体验从零到一做出一个完整网站的全过程。无论你…...

Silicon Labs低成本蓝牙SoC BG22L/BG24L解析与选型指南

1. Silicon Labs发布低成本BG22L和BG24L蓝牙SoC:为物联网设备带来新选择作为一名长期关注低功耗无线通信技术的工程师,我对Silicon Labs最新发布的BG22L和BG24L SoC系列产生了浓厚兴趣。这两款芯片作为BG22和BG24的"Lite"版本,在保…...

RVC语音转换实战指南:8个核心问题的高效解决方案

RVC语音转换实战指南&#xff1a;8个核心问题的高效解决方案 【免费下载链接】Retrieval-based-Voice-Conversion-WebUI Easily train a good VC model with voice data < 10 mins! 项目地址: https://gitcode.com/GitHub_Trending/re/Retrieval-based-Voice-Conversion-W…...

5分钟快速上手3dsconv:解决3DS游戏安装难题的完整指南

5分钟快速上手3dsconv&#xff1a;解决3DS游戏安装难题的完整指南 【免费下载链接】3dsconv Python script to convert Nintendo 3DS CCI (".cci", ".3ds") files to the CIA format 项目地址: https://gitcode.com/gh_mirrors/3d/3dsconv 你是否遇…...

ContextAnyone:基于上下文感知的角色一致性视频生成技术

1. ContextAnyone技术解析&#xff1a;基于上下文感知的角色一致性视频生成在影视制作和数字内容创作领域&#xff0c;保持角色在多场景中的视觉一致性一直是个棘手问题。传统工作流程需要美术团队手动调整每一帧的角色细节&#xff0c;耗时耗力。ContextAnyone的出现&#xff…...

PhaseNO:基于神经算子的地震监测技术创新与应用

1. 地震监测技术演进与PhaseNO的创新价值地震监测技术在过去几十年经历了从人工到自动化的革命性转变。早期的地震学家需要像老练的侦探一样&#xff0c;在纸带记录仪上手工标记P波和S波的到达时间。这种传统方法不仅效率低下&#xff08;一个熟练的分析师每天最多只能处理几十…...

电磁 + 散热 + 电路全仿真,看懂新版 ANSYS 2025 详细下载安装教程附安装包

ANSYS Electronics 2025 R1 就是电子行业的 “全能仿真神器” &#xff0c;不管是做手机射频、汽车电机、电脑 PCB 板&#xff0c;还是芯片、5G 基站&#xff0c;只要涉及 “电磁、散热、电路” 相关的设计&#xff0c;用它就能提前模拟效果&#xff0c;不用反复做物理样机&…...

NVIDIA Profile Inspector完整指南:解锁隐藏显卡设置,彻底解决游戏性能问题

NVIDIA Profile Inspector完整指南&#xff1a;解锁隐藏显卡设置&#xff0c;彻底解决游戏性能问题 【免费下载链接】nvidiaProfileInspector 项目地址: https://gitcode.com/gh_mirrors/nv/nvidiaProfileInspector 你是否曾经在游戏中遇到画面撕裂、输入延迟过高或者帧…...

机器学习预备知识

目录 卡方检验 卡方检验的主要用途 卡方检验的基本原理 卡方统计量 卡方检验的statsmodels实现 配对卡方检验 相关分析&#xff08;关联性分析&#xff09;概述 什么是相关分析&#xff08;关联性分析&#xff09; 各种相关系数 统计图/统计表在相关分析中的重要性 相…...

基于MCP协议构建Java WHOIS查询服务器,无缝集成AI助手工作流

1. 项目概述&#xff1a;一个为AI助手打造的WHOIS查询工具最近在折腾AI编程助手&#xff0c;发现一个挺有意思的需求&#xff1a;当我在和Claude或者Cursor讨论一个网站项目时&#xff0c;经常会想顺手查一下这个域名的注册信息。比如&#xff0c;评估一个竞品网站&#xff0c;…...

Spyglass:开源Kubernetes集群监控与成本管理平台深度解析

1. Spyglass&#xff1a;一个开源Kubernetes集群监控与成本管理平台深度解析如果你正在管理一个或多个Kubernetes集群&#xff0c;那么下面这个场景你一定不陌生&#xff1a;为了搞清楚集群的健康状况&#xff0c;你得在Grafana里看性能图表&#xff1b;为了排查一个Pod的问题&…...

Godot资源解包终极指南:快速提取游戏资源的完整实践教程

Godot资源解包终极指南&#xff1a;快速提取游戏资源的完整实践教程 【免费下载链接】godot-unpacker godot .pck unpacker 项目地址: https://gitcode.com/gh_mirrors/go/godot-unpacker 在Godot游戏开发与资源分析领域&#xff0c;Godot资源解包工具是一款专门用于解包…...

基于SimAM无参数注意力机制的YOLOv10改进:提升目标检测性能的新范式

摘要 在计算机视觉领域,目标检测任务一直是研究的热点与难点。YOLOv10作为YOLO系列的最新成员,凭借其出色的实时性能和检测精度,已经在工业界和学术界获得了广泛应用。然而,如何在保持模型轻量化的同时进一步提升特征表达能力,仍然是一个值得深入探索的问题。本文提出了一…...

【2026年版|收藏级】RAG系统延迟优化实战:从链路拆解到面试通关,小白也能看懂

说实话&#xff0c;在2026年大模型落地常态化的今天&#xff0c;5秒的RAG系统首字响应时间&#xff0c;在C端产品里基本等于直接流失用户——用户不会耐心等待一个“反应迟钝”的AI&#xff0c;尤其是在对话式交互、智能问答等高频场景中。 不管是日常开发落地&#xff0c;还是…...

Linux 多进程多线程 学习笔记

进程是什么进程定义&#xff1a;进程是操作系统中的一次执行过程&#xff0c;它是操作系统进行资源分配和调度的基本单位&#xff1b;...

(学习笔记)4.2 逻辑设计和硬件控制语言HCL(4.2.1 逻辑门4.2.2 组合电路和HCL布尔表达式)

文章目录线索栏笔记栏1.硬件设计概述与HCL1&#xff09;数字系统三要素2&#xff09;HCL&#xff08;硬件控制语言&#xff09;的角色3&#xff09;设计方法的演进&#xff08;旁注&#xff09;2.逻辑门与组合电路1&#xff09;逻辑门2&#xff09;组合电路3.HCL vs. C 表达式&…...

AI Agent 记忆机制详解:程序员进阶大模型开发必备(收藏版)

AI Agent 记忆机制详解&#xff1a;程序员进阶大模型开发必备&#xff08;收藏版&#xff09; 本文详细解析了 AI Agent 的四层记忆机制&#xff08;感知记忆、短期记忆、长期记忆和实体记忆&#xff09;&#xff0c;并探讨了设计记忆模块时需要解决的三大核心问题&#xff08;…...