电机控制
文章平均质量分 80
在机器人领域,掌握无刷电机的控制相当于掌握机器人设计的“半壁江山”。
Wallace Zhang
博客初衷:
将学习到的知识分享给大家,一起学习,同时自己又能再一次提高对知识的理解(费曼定理)
2011年 - 2018年(电气工程师,研发自动化设备)
2018年 - 2021年(电气工程师 + 电子工程师,研发机器人)
2021年 - 至今(嵌入式MCU开发工程师,研发机器人)
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
SimpleFOC学习笔记汇总(2026.05.07更新)
在机器人领域,掌握无刷电机的控制相当于掌握机器人设计的“半壁江山”。这个年代,对个人来说学习一种新技术最好是通过开源项目了。通过开源项目快速将项目搭建起来,接着结合实践与理论才能真正掌握技术。未来的一段很长的时间里,将分享simpleFOC学习的笔记。通过分享笔记的方式,进一步提高自己对FOC的理解。大家互相学习,共同进步吧。原创 2025-01-14 23:56:44 · 12229 阅读 · 5 评论
-
SimpleFOC源码学习10(v2.3.2) - 电流传感器CurrentSense.cpp与CurrentSense.h
如果你在调模式时遇到电机一使能就发热、抖动,或者电流目标越给越不对劲,很多时候不要急着先调 PID。更值得优先确认的是:电流采样相序、方向、ADC 零点,以及三相电流到id/iq的变换链路有没有错。ia/ib/icCurrentSense.cpp 的核心任务,就是把底层 ADC 读到的 ia/ib/ic 三相电流,变成控制器能直接使用的 id/iq。是电流采样的。它并不继承Sensor,但设计思路很像:都用一个基类把不同硬件的差异收敛到统一接口,再把通用逻辑放到基类里复用。原创 2026-05-07 21:25:28 · 535 阅读 · 0 评论 -
SimpleFOC源码学习09(v2.3.2) - 磁编码器MagneticSensorSPI.cpp与MagneticSensorSPI.h
文章摘要: 本文解析了SimpleFOC库中MagneticSensorSPI的实现原理,重点对比了其与HallSensor的差异。磁编码器通过SPI协议读取专用芯片寄存器获取高精度位置信息,核心流程包括:1) 理解AMS芯片的16-bit帧结构及校验机制;2) 通过配置结构体参数化不同芯片的协议差异;3) 提供两种构造函数适配不同使用场景。该传感器将原始角度数据交由基类处理,实现连续角度和速度计算,体现了"高精度但协议复杂"的特点。分析涵盖硬件原理、协议配置和代码实现三个层面,揭示了S原创 2026-04-29 13:47:37 · 724 阅读 · 0 评论 -
SimpleFOC源码学习08(v2.3.2) - 霍尔编码器HallSensor.cpp与HallSensor.h,背后的状态机—6个扇区是怎么驱动 FOC 的?
本文是SimpleFOC源码学习系列第8篇。从正交编码器A/B信号的硬件原理出发,逐层拆解Encoder.cpp中的中断回调方向判断逻辑、noInterrupts()临界区保护、Index脉冲四舍五入校正、M/T混合测速法的dt修正公式,以及update()在ISR与主循环之间的桥接设计。适合有嵌入式基础、正在学习FOC或SimpleFOC移植的开发者。原创 2026-04-15 19:47:38 · 758 阅读 · 0 评论 -
SimpleFOC源码学习07(v2.3.2) - 增量式编码器Encoder.cpp与Encoder.h,从一对 A、B 信号,到速度、方向、绝对位置的完整解法
摘要 本文深入解析了增量式正交编码器在FOC电机控制中的应用,重点介绍了信号处理原理和Arduino-FOC库的实现细节。文章首先阐述了正交编码器的硬件原理,包括A/B信号的90°相位差如何实现方向判断以及4倍分辨率提升机制。随后分析了Encoder类的代码结构,包括硬件配置、中断共享变量、速度计算方法和Sensor基类契约的实现。特别强调了中断回调函数中方向判断的精妙算法和Index脉冲的误差校正逻辑。通过详细的代码解读和图表说明,揭示了正交编码器在电机控制中的核心作用,为解决电机转向异常和低速抖动问题提原创 2026-04-15 19:42:09 · 529 阅读 · 0 评论 -
SimpleFOC源码学习06:对比 Sensor 类源码,2.4.0 的 getVelocity() 为什么更稳了?
V2.4.0版本对Sensor::getVelocity()函数进行了三方面优化:1)浮点精度保护,通过分支处理避免大数相减导致的小数精度损失;2)静止优化,角度不变时跳过状态更新,防止时间窗口过小导致噪声放大;3)性能优化,将1e-6改为1e-6f避免隐式double转换。这些改动提升了多圈运行时的测量精度和静止状态下的抗噪能力,同时优化了嵌入式平台的运行效率。原创 2026-04-08 19:29:42 · 323 阅读 · 0 评论 -
SimpleFOC源码学习05(v2.3.2) - 传感器抽象基类Sensor.cpp与Sendsor.h,如何统一角度、圈数与速度计算?
摘要: Sensor是SimpleFOC中定义传感器通用接口的抽象基类,通过多态设计统一不同硬件传感器的使用方式。核心功能包括: 跨圈检测:通过0.8×2π阈值判断角度过零,自动更新圈数计数 速度计算:有限差分法结合圈数差和角度差,内置微秒溢出和采样间隔保护 无抖动启动:四次读取配合延迟消除初始噪声 统一接口:子类只需实现getSensorAngle(),其余功能由基类处理 该设计实现了硬件无关的传感器抽象层,为电机控制提供稳定可靠的角度和速度数据。原创 2026-04-08 19:25:17 · 576 阅读 · 0 评论 -
SimpleFOC源码学习04(v2.3.2) - 数学基础层foc_utils.cpp与foc_utils.h
摘要:foc_utils.cpp/h 是为嵌入式FOC控制设计的优化数学工具库,包含三大核心功能:1) 宏定义和电机信号结构体;2) 优化的近似数学函数,如基于LUT的_sin()(65元素第一象限查表+对称性扩展)、多项式近似的_atan2()和快速逆平方根变体的_sqrt();3) 角度处理工具。这些函数针对无FPU的MCU(如AVR)优化,将sin/cos计算从数百微秒缩短到50μs内,满足实时控制需求。库采用无状态设计,建议在STM32等带FPU的芯片中使用CMSIS-DSP库替代以获得更好性能。原创 2026-04-08 19:22:36 · 469 阅读 · 0 评论 -
SimpleFOC源码学习03(v2.3.2) - 时间工具模块time_utils.cpp与time_utils.h
在 SimpleFOC 的所有模块中,time_utils 是最轻量却最核心的一层——_micros() 和 _delay() 两个函数撑起了 PID 控制器、低通滤波器等模块的时间基础。本文结合 STM32 平台移植实践,逐行解析 .h 接口定义、.cpp 实现逻辑,并深入 pid.cpp 展示 _micros() 如何驱动 Ts 计算、梯形积分与斜率限制,适合有嵌入式基础、正在学习 FOC 源码的开发者。原创 2026-04-08 19:19:06 · 344 阅读 · 0 评论 -
SimpleFOC源码学习02(v2.3.2) - 低通滤波器lowpass_filter.cpp与lowpass_filter.h
本文介绍了低通滤波器在电机控制中的应用,重点解析了Arduino-FOC库中的LowPassFilter类实现。该滤波器通过时间常数Tf平滑传感器信号,Tf越大滤波效果越强但响应越慢。核心算法采用加权混合公式alpha = Tf/(Tf + dt),通过调整alpha值(推荐0.8-0.98)平衡平滑度和响应速度。文章详细说明了滤波器参数选择方法,强调电流环Tf必须远小于速度环周期以确保系统稳定性,并提供了典型参数设置示例(电流环0.5ms,速度环1ms)。原创 2026-04-08 19:14:29 · 661 阅读 · 0 评论 -
SimpleFOC源码学习01(v2.3.2) - PID控制器PID.cpp与PID.h
本文分析了Arduino-FOC库中的PID控制器实现。PIDController类通过构造函数初始化比例(P)、积分(I)、微分(D)增益参数及输出限制,核心计算函数operator()采用梯形法(Tustin变换)计算积分项,比矩形法更精确,同时包含防积分饱和和输出斜率限制功能。控制器记录误差、输出、积分值和时间戳等状态变量,在每次调用时计算时间间隔Ts,分别处理比例、积分和微分项后求和,最终对输出进行限幅和斜率约束,确保控制平稳。该实现兼顾了计算精度和系统安全性。原创 2026-04-07 21:16:30 · 967 阅读 · 0 评论 -
SimpleFOC源码学习00(v2.3.2) - 源码版本说明
本文基于SimpleFOC v2.3.2版本进行源码分析与学习,该版本仍在持续优化更新。作者正在使用此版本进行实际项目开发,并提供了GitHub项目地址(https://github.com/simplefoc/Arduino-FOC)和两张相关图片说明。文章主要介绍如何基于这一开源FOC(磁场定向控制)库开展嵌入式开发工作。原创 2026-04-07 21:08:13 · 404 阅读 · 0 评论 -
无刷电机控制 - 拆解三相无刷电机5550 + 霍尔传感器检测转子位置
本文通过拆解一台三相无刷电机,详细分析了其硬件结构。首先展示了转子与定子的拆解过程,指出该电机采用9槽绕组和6极转子结构(极对数为3)。重点解释了霍尔传感器的安装角度问题:虽然厂家标注120度电角度,但实际机械角度为40度,这是因为电角度等于机械角度乘以极对数。文章强调,随着电机极对数的增加,霍尔传感器的机械安装角度会相应减小,这一原理对理解无刷电机控制至关重要。原创 2025-10-28 14:29:06 · 1388 阅读 · 0 评论 -
无刷电机控制 - STM32F405+CubeMX+HAL库+SimpleFOC08,速度闭环控制(有电流环)
本文介绍了基于STM32F405、CubeMX和HAL库实现FOC电机速度闭环控制的方法。通过将TIM4回调周期从500us缩短至50us,优化了电流环执行频率,解决了电机运行卡顿问题。文章提供了完整的项目代码地址(Gitee和GitHub),并展示了关键代码实现,包括电流采样和速度闭环控制配置。实验结果表明,加入电流环控制后,电机扭矩性能得到显著提升,实现了真正的FOC控制。原创 2025-08-25 19:19:52 · 926 阅读 · 0 评论 -
无刷电机控制 - STM32F405+CubeMX+HAL库+SimpleFOC07,ADC采样相电流,频率20KHz(TIM1触发Injected Sampling+中断)
GenericCurrentSense(这个不清楚,暂时不管)InlineCurrentSense(采样电阻在上桥臂与下桥臂之间)LowsideCurrentSense(采样电阻在下桥臂下方且与GND连接。多数大功率且高电压的FOC驱动板使用这个方案如上所示,这块STM32F405-FOC控制板跟STM32F103的FOC板一样,都属于。所以,也是移植LowsideCurrentSense类的代码。项目地址:Gitee (国内)GitHub。原创 2025-08-07 20:21:08 · 2018 阅读 · 8 评论 -
无刷电机控制 - STM32F405+CubeMX+HAL库+SimpleFOC05,完成霍尔传感器的校准
本文介绍了基于STM32F405和HAL库的无刷电机FOC控制实验,重点讲解了霍尔传感器校准的实现。实验采用中空三相无刷电机和SimpleFOC开源框架,代码直接参考了之前STM32F103的实战项目。文章提供了项目在Gitee和GitHub的开源地址,展示了代码编译通过的截图和RTT Viewer调试界面,表明系统已成功运行。实验内容主要涉及电机控制板与霍尔传感器的集成应用,为后续的电机控制开发奠定了基础。原创 2025-08-05 20:16:21 · 666 阅读 · 0 评论 -
无刷电机控制 - STM32F405+CubeMX+HAL库+SimpleFOC06,速度闭环控制(没电流环)
本文介绍了基于STM32F103的无刷电机速度闭环控制实现。通过CubeMX和SimpleFOC08框架,设置目标转速为12.56弧度/秒,成功实现了电机速度闭环控制(不含电流环)。文章展示了J-LINK RTT与J-Scope的实时监控效果,并提供了完整的main.c代码截图。编译后的程序成功烧录到MCU,实现了电机启动和速度闭环控制,相关运行视频已上传展示。该方案为STM32平台的无刷电机控制提供了实用参考。原创 2025-08-05 20:08:10 · 908 阅读 · 1 评论 -
无刷电机控制 - 基于STM32F405+CubeMX+HAL库+SimpleFOC04,完成霍尔传感器的驱动代码
本文介绍了基于STM32F405和霍尔传感器的无刷电机FOC控制系统实现。主要内容包括:1)硬件电路设计,详细说明了霍尔传感器与STM32的接口连接;2)CubeMX配置GPIO和中断;3)从simpleFOC移植霍尔传感器代码并进行STM32 HAL库适配;4)代码实现细节,包括中断处理、传感器初始化和位置检测;5)系统调试过程。项目代码已开源在Gitee和GitHub平台,为开发者提供了完整的参考实现方案。该系统通过霍尔传感器实现了电机转子位置检测,为FOC控制提供了重要反馈信号。原创 2025-07-18 09:22:25 · 1525 阅读 · 0 评论 -
无刷电机控制 - 基于STM32F405+CubeMX+HAL库+SimpleFOC03,开环速度控制
摘要:本文介绍了基于STM32F405和SimpleFOC库实现对中空三相无刷电机的开环速度控制。实验采用21极对数的电机参数配置,通过BLDCDriver6PWM驱动模块成功驱动电机旋转。项目提供了完整的代码实现,包括电机对象实例化和参数设置,并开源在Gitee和GitHub平台,为无刷电机控制开发提供了参考实例。通过PWM信号控制实现了仅连接三相线即可驱动电机转动的效果。原创 2025-07-16 19:19:37 · 779 阅读 · 0 评论 -
无刷电机控制 - 基于STM32F405+CubeMX+HAL库+SimpleFOC02 ,完成三相半桥驱动程序BLDCDriver6PWM
如上所示,本次实验使用中空三相无刷电机 + STM32F405的FOC电机控制板。原创 2025-07-15 21:18:59 · 1967 阅读 · 0 评论 -
无刷电机控制 - 基于STM32F405+CubeMX+HAL库+SimpleFOC01 ,移植simpleFOC
STM32F405与STM32F103在FOC电机控制中的性能对比分析 本文对比了STM32F405和STM32F103在FOC电机控制应用中的核心差异。STM32F405凭借Cortex-M4内核、168MHz主频、硬件FPU和DSP指令集,在运算能力上显著优于72MHz的STM32F103(Cortex-M3)。具体差异体现在: 处理器性能:F405支持浮点运算和DSP指令 内存资源:F405具有112KB SRAM和512-1024KB Flash 外设支持:F405提供更快的ADC采样(2.4Msp原创 2025-07-07 19:36:16 · 2432 阅读 · 0 评论 -
SimpleFOC STM32教程13|基于STM32F103+HAL库,实战项目 - 挡块手感的实现
如上所示,实现思路参考灯哥开源: https://www.bilibili.com/video/BV1b64y1P7BK?如上所示, 右侧是红色部分是禁区,摆臂进入禁区后,会弹回来. 当摆臂在左侧时, 电机松轴, 完全没有力量.项目源码: https://github.com/q164129345/MCU_Develop/tree/main/simplefoc13_stm32f103_stopper_control。原创 2025-02-09 20:20:30 · 967 阅读 · 0 评论 -
SimpleFOC STM32教程12|基于STM32F103+HAL库,实战项目 - 棘轮手感的实现
参考灯哥开源的B站视频():相当于把原本连续的角度轨迹离散化, 从而使得电机只能停在固定的角度上. 本次实验离散化的角度数量是8个, 分别是A0~A7.项目源码: https://github.com/q164129345/MCU_Develop/tree/main/simplefoc12_stm32f103_Ratchet_Control。原创 2025-02-09 20:16:23 · 953 阅读 · 0 评论 -
SimpleFOC STM32教程11|基于STM32F103+HAL库,位置闭环控制(速度、电流闭环)
终于完成simpleFOC的三闭环控制. 如上所示, 增加最外环(位置环).原创 2025-02-09 20:05:09 · 2365 阅读 · 0 评论 -
SimpleFOC STM32教程10|基于STM32F103+HAL库,速度闭环控制(有电流环)
如上图所示, 增加了电流环.如上图所示,三相占空比依然是马鞍波。当我用手去给电机施加阻力时,PID要维持目标转速,将马鞍波变大,提高扭矩抵抗阻力。项目源码:https://github.com/q164129345/MCU_Develop/tree/main/simplefoc10_stm32f103_vel_close_with_current。原创 2025-01-27 21:53:11 · 2062 阅读 · 0 评论 -
SimpleFOC STM32教程09|基于STM32F103+HAL库,ADC采样相电流
GenericCurrentSense(这个不清楚,暂时不管)InlineCurrentSense(采样电阻在上桥臂与下桥臂之间)LowsideCurrentSense(采样电阻在下桥臂下方且与GND连接。多数大功率且高电压的FOC驱动板使用这个方案如上图所示,选择InlineCurrentSense的原因是电路板的采样电路设计。RTT Viewer。原创 2025-01-22 22:21:39 · 3551 阅读 · 0 评论 -
SimpleFOC STM32教程08|基于STM32F103+HAL库,速度闭环控制(没电流环)
如上所示,simpleFOC在没有电流环前提下的速度闭环控制框架。此时,闭环的关键是电机的编码器。其效果如下:。如上图所示,红色曲线是目标速度,蓝色曲线是反馈速度,两根曲线基本重合。当我用手握住电机时,蓝色曲线的反馈速度接近0。当我松开手后,蓝色曲线的反馈速度又跟红色曲线的目标速度重合。项目源码:https://github.com/q164129345/MCU_Develop/tree/main/simplefoc08_stm32f103_velocity_close。原创 2025-01-19 18:30:45 · 1437 阅读 · 5 评论 -
SimpleFOC STM32教程07 | 基于STM32F103+HAL库,位置闭环控制(位置、速度闭环、没电流环)
如上所示,simpleFOC在没有电流环前提下的位置闭环控制框架。此时,闭环的关键是电机的编码器。效果如下所示,电机总是能回到设置的目标位置。原创 2025-01-19 18:19:34 · 2830 阅读 · 0 评论 -
SimpleFOC STM32教程06|基于STM32F103+HAL库,编码器(位置传感器)的校准
上一章节《》完成三相无刷电机的开环速度控制。接下来,开始调试编码器(位置传感器)。为接下来的位置闭环控制,速度闭环控制做准备。项目源码:https://github.com/q164129345/MCU_Develop/tree/main/simplefoc06_stm32f103_encoder_align。原创 2025-01-19 18:08:06 · 4205 阅读 · 1 评论 -
SimpleFOC STM32教程05 | 基于STM32F103+HAL库,实现速度开环控制
效果如下,电机终于开始旋转起来了(视频正在审核):RTTViewer的打印,虽然是速度开环控制,也能比较接近期望的转速4rad/s:项目源码:https://github.com/q164129345/MCU_Develop/tree/main/simplefoc05_stm32f103_open_vel_ctrl。原创 2025-01-19 17:47:31 · 3686 阅读 · 4 评论 -
SimpleFOC STM32教程04 | 基于STM32F103+HAL库,完成三相半桥电路的驱动程序
在FOC(Field-OrientedControl)框架中,PowerInverter(电源逆变器)扮演着将直流电(DC)转换为交流电(AC)的关键角色。这个转换是必要的,因为电机通常需要交流电来运行,而系统中的电源可能提供的是直流电。在图中,逆变器接收来自SVPWM生成器的控制信号,并根据这些信号调整其输出,从而驱动PMSM电机按照预定的速度和转矩运行。通过这一过程,逆变器在FOC系统中起到了将控制算法的指令转化为实际电机驱动的桥梁作用。原创 2025-01-19 15:21:34 · 4306 阅读 · 4 评论 -
SimpleFOC STM32教程03|基于STM32F103+HAI库,通过AS5600编码器计算电机的转速
上一章节完成了电机角度的读取,接下来试一下读取电机的转速。如上图所示,本章节用到update()方法与方法。如上所示,左侧是RTT_Viewer,右侧是Jscope的数据曲线化。波形不平滑主要是因为电机是被我的手转动的,转速会波动比较大。如上图所示,通过上一章节与这一章节的实验,终于完成了FOC框图的上述模块Position Sensor Signal Processing。原创 2025-01-15 00:38:23 · 1901 阅读 · 0 评论 -
SimpleFOC STM32教程02|基于STM32F103+HAL库,通过AS5600编码器读取电机的角度
上一章节完成common代码的移植,下一步是完成位置编码器的角度读取。如上所示,通过方法可以获取电机的当前角度信息。如上所示,通过AS5600编码器获取云台电机的位置角度信息。如上所示,使用FOC开发板跟云台电机的编码器AS5600的接线。最终的效果如上。项目源码:https://github.com/q164129345/MCU_Develop/tree/main/simplefoc02_stm32f103。原创 2025-01-15 00:34:06 · 3301 阅读 · 7 评论 -
SimpleFOC STM32教程01|基于STM32F103+HAI库,移植核心的common代码
项目源码:https://github.com/q164129345/MCU_Develop/tree/main/simplefoc01_stm32f103。原创 2025-01-15 00:13:25 · 6687 阅读 · 9 评论 -
三相无刷电机控制|FOC理论04 - 克拉克变换 + 帕克变换的最终目标
它们是电机矢量控制(FOC)以及现代电力电子技术的基石,帮助我们用简单的数学模型描述和控制复杂的交流电机系统。旋转的角度θ,可以通过位置编码器获得。原创 2025-01-14 23:51:56 · 1027 阅读 · 0 评论 -
三相无刷电机控制| FOC理论03 - 帕克变换
帕克变换的核心思想是通过帕克变换,将时间变化的变量变成与旋转坐标系同步的变量。如上所示,左边的静止坐标系通过帕克变换,映射成右边的旋转坐标系,旋转的角度基于电角度θ。旋转的角度θ,可以通过位置编码器获得。原创 2025-01-14 23:49:33 · 1293 阅读 · 0 评论 -
三相无刷电机控制|FOC理论02 - 克拉克变换
克拉克变换的核心思想是将三相静止坐标(A、B、C)映射到两相静止坐标系(α-β),这个变换的目的是简化电机的控制模型,其数学表达如下:如下所示,iA、iB、iC三相电流相隔120度:MATLAB官网克拉克变换学习资料:https://ww2.mathworks.cn/help/mcb/ref/clarketransform.html。原创 2025-01-14 23:46:14 · 2639 阅读 · 0 评论 -
三相无刷电机控制|FOC理论01 - 坐标变换的简单梳理
值得注意的是,还需要电角度(位置编码器)才能进行帕克变换。如上图所示,向量iα(蓝色)与向量iβ(红色)是相隔90度的正弦波,同样能产生一个磁力F(天蓝色),这张图的磁力F跟上上图的磁力F是同一个F。如上图所示,向量iα(蓝色)与向量iβ(红色)是相隔90度的正弦波,同样能产生一个磁力F(天蓝色),这张图的磁力F跟上上图的磁力F是同一个F。如上图所示,向量iq与向量id是相隔90度的定值(不是正弦波了),同样能产生一个磁力F(天蓝色),这张图的磁力F跟上上图的磁力F是同一个F。的两相正弦波(iα、iβ)。原创 2025-01-14 23:36:19 · 2386 阅读 · 1 评论 -
STM32F405 + CubeMX - 产生互补PWM波,中心对齐模式1 + PWM模式2(FOC专用)
在FOC算法里,SVPWM用于产生三相PWM波给电机。为了生成SVPWM波形,STM32的高级定时器TIM使用互补PWM的中心对齐模式1可以很好地实现。如上图所示,按照后面的笔记来配置TIM1后,可以产生的互补PWM波形。原创 2024-12-16 23:45:39 · 10572 阅读 · 43 评论 -
STM32F407+CubeMX-使用TIM计算编码器的脉冲总数,并计算脉冲方向
文章目录一、前言二、本次实验的编码器三、编码器与STM32的连接四、CubeMX的配置4.1、RCC4.2、Clock Configuration4.3、TIM24.4、生成代码五、Keil5.1、Target5.2、C/C++5.3、Debug六、代码6.1、main.c七、DEBUG7.1、用手让步进电机逆时钟旋转约1圈7.2、用手让步进电机顺时钟旋转约1圈八、示波器九、细节补充9.1、Encoder Mode一、前言STM32工程:链接:https://pan.baidu.com/s/1o4l原创 2021-07-15 21:15:26 · 10113 阅读 · 14 评论
分享