首页 / 资讯中心 / 文章详情

STM32F1无FPU跑FOC:无刷电机矢量控制库实战解析

STM32F1无FPU跑FOC:无刷电机矢量控制库实战解析 ★ FEATURED ARTICLE
简介该压缩包是面向STM32F1平台永磁同步电机PMSM磁场定向控制开发者的完整资料适合有一定嵌入式基础并在学习或落地FOC算法的工程师。资源包含241个文件压缩包约2.39MB核心为中文用户手册与FOC固件库v2.0文件类型以h、c源文件为主另有icf链接配置、gpj工程文件、ewp/ewd等IAR/Keil工程辅助文件以及少量lib、a库文件和汇编启动文件覆盖从库配置到编译移植的完整链路。目前已有1114人参与学习浏览。借助手册里的理论说明、结构讲解和配置步骤配合经过验证的示例源码使用者能系统掌握电机模型、传感器接口、转子位置估算、电流控制等关键模块并结合实际电机参数进行针对性调整大幅缩短STM32F103项目开发周期。1. stm32f1 FOC库没有FPU的MCU照样跑矢量控制手里只有一颗 STM32F103没有 FPU没有 CORDIC 硬核外设也先不打算上带霍尔的驱动板想把无刷电机从「能转」变成「力矩可控」——这就是 stm32f1 FOC库 这一包资源真正解决的场景。它把磁场定向控制中最费时间的 Clarke/Park 变换、SVPWM、双闭环 PI 全部在 C 语言层面实现了配套的操作手册把每个宏定义、每个函数接口写清楚了示例源码能直接在 Keil 里编译上板。适合两类人一类是嵌入式开发做了两年、第一次碰矢量控制的工程师需要一份能对照手册逐行读的参考实现另一类是手头项目被无刷电机噪声和启停抖动折磨的开发者想过一遍 FOC 标定和整定流程。它不是玩具是一套可以拆开改、能真正闭环跑起来的 FOC 最小系统。2. 库结构与实现原理手册之外还要看懂的三件事2.1 资源包里的构成手册、算法层、硬件层、用户层解压这份库之后你会发现它并不是一个孤零零的源码文件而是按照嵌入式项目常规分层的目录结构。操作手册放在 Docs 目录下对应示例工程的每一个模块讲解Core 目录是纯算法层不依赖具体芯片的寄存器操作Clarke、Park、SVPWM、PI 控制器都在这里Hal 目录负责跟 STM32F1 打交道包括 PWM 输出、ADC 触发采样、编码器读取User 目录则是把上面两层串起来的主流程和参数配置也是你改得最多的部分。这种分层的价值在于算法层可以整体搬到其他 MCU 上硬件层才是针对 F1 定制的。手册里会看到大量「这个参数应在 User 层修改而非 Hal 层」的注释提醒这一条实际很重要。很多人在调库的过程中直接在 Hal 层改了 PWM 周期结果 ADC 触发时刻跟着变电流采样全乱了最后查了两天。所以拿到包以后第一件事应该是打开操作手册的目录页弄清楚三个层之间谁调用谁再动手改代码。目录文件类型你该做什么Docs操作手册 PDF通读一遍重点看参数配置章节Core算法源码 .c/.h理解即可通常不用改Hal外设驱动源码根据 PCB 改引脚和触发源User配置与主流程电机参数、PID 初值都在这里改这份库的文件划分逻辑和市面上多数 FOC 工程一致区别在于它把 F1 的硬件约束考虑得比较细比如 ADC 触发用的是注入组而非规则组因为注入组可以抢占规则组的转换适合在 PWM 中心点硬触发采样。这些细节都是一线调试里真正决定成败的点只看示例工程根目录的 main.c 是远远不够的。2.2 无 FPU 的 F1 怎么跑 FOC算力预算与查表法FOC 控制的核心数学模型是永磁同步电机的电压方程在旋转坐标系下的解耦表达。简单说就是把三相定子电流通过 Clarke 变换投影到 αβ 两相静止坐标系再通过 Park 变换转到跟随转子磁场的 d-q 旋转坐标系让 d 轴电流和 q 轴电流变成两个独立的直流控制量。控制目标定成 id 0iq 直接对应转矩输出这样就把交流电机当成直流电机来控了。这套运算在带 FPU 和 CORDIC 的 F4/H7 上毫无压力但 F1 是 Cortex-M3 内核主频 72MHz不光是浮点运算要靠软件模拟sin/cos 计算也没有硬件加速。算一笔账就清楚了电流环跑 10kHz每个 PWM 周期只有 72MHz / 10000 7200 个 CPU 周期而完整的电流环里包含两次坐标变换、两个 PI 调节器、一次 SVPWM 换算如果全用标准 libm 的浮点 sin/cos单次中断轻松吃掉四五千周期加上采样、保护逻辑、变量压栈紧得让人头皮发麻。这份库选择的做法是典型的 MCU 算力权衡转子角度和电角度只用整数查表角度表做 512 点配合定点化后的坐标变换运算SVPWM 输出也不走浮点反正切而是直接比较 v_alpha、v_beta 的象限和幅值关系算出扇区后查比较值表。手册里有明确的注释提醒角度表点数、PI 积分步长、中断优先级这三项是 F1 上能否稳定跑 10kHz 电流环的关键缺一不可。示例源码里还有一处容易被忽略的开关——把三角函数从查表切回 libm 的编译宏默认是关闭状态新手调试时千万别打开否则一次中断的时间直接翻倍电流环节奏全乱。2.3 电流环、速度环与 SVPWM 在库里的真实位置把库的闭环路径从头到尾走一遍顺序是速度环 PI 计算目标转速和实际转速的误差输出 iq_ref电流环里 d 轴目标恒为 0q 轴目标是 iq_ref各自 PI 输出 vd、vq再经逆 Park 变换得到 v_alpha、v_beta交给 SVPWM 生成三相占空比送到 TIM1 的六路互补 PWM 驱动逆变桥电机转动后ADC 在 PWM 中心时刻采样下桥臂电阻上的压降重构出 ia、ib回到 Clarke/Park 变换完成闭环。整个过程以 10kHz 周期性执行。在代码里看电流环集中在 Core 目录的一个函数里速度环是在同一中断里每隔 N 次调用一次比如 10 次电流环跑 1 次速度环也就是 1kHz 的速度环更新率。这个「电流环快、速度环慢」的结构是双闭环控制的典型做法因为电流环带宽需要做高以保证快速响应和过流保护而速度环受机械惯量限制更新太快反而容易引入噪声。你拿到示例源码后先在中断服务函数里定位FOC_CurrentLoopISR这个入口再从它往内部追整条链路就通了。往内部追的时候留意一个细节库在速度环和电流环之间加了一个一阶低通滤波滤波系数在 User 层配置。这个滤波器用来平滑 iq_ref 的突变但如果系数设得太小速度环的响应会被拖慢电机看起来肉得很加速总有半拍延迟。调参时如果发现怎么加 Kp 转速都跟不上先检查是不是这个滤波系数把变化率限死了而不是死磕 PI 增益。3. 把 FOC 库搬进工程一套能直接开转的配置流程3.1 目录布局与文件拷贝拿到资源包后先不要急着打开 Keil 工程文件直接编译。我习惯的做法是把库的三个层单独抽出来合并进自己现有的工程目录这样后续加自己的状态机、通信协议、上位机调试代码时不会跟库的源码混在一起。下面这组命令假设你已经把压缩包解压到 workspace 某个目录下。# 假设解压后目录结构如下 # FOC_Lib/ # ├── Core/ # 算法层clarke_park.c/h、svpwm.c/h、pi.c/h # ├── Hal/ # 外设层tim_pwm.c/h、adc_curr.c/h、encoder.c/h # ├── User/ # 配置foc_config.h、main.c # └── Docs/ # 操作手册 # 在自己的工程里建同样的三层目录 mkdir -p FOC_Demo/Core FOC_Demo/Hal FOC_Demo/User cp -r FOC_Lib/Core/* FOC_Demo/Core/ cp -r FOC_Lib/Hal/* FOC_Demo/Hal/ cp -r FOC_Lib/User/* FOC_Demo/User/复制完以后把foc_config.h和main.c保留在 User 层这两个文件是你会反复改的。Core 和 Hal 下面基本不用动除非你要换定时器通道或者改 ADC 引脚。这里要提醒一句不要把库的文件一股脑全塞进同一个文件夹Keil 工程文件组织虽然随意但算法层和硬件层混在一起后面升级库版本或者排查问题时你会非常痛苦。分层目录是几块钱成本但省下几天调试时间的决定。另一个容易忽略的点是 Keil 工程里的 Include Paths 路径要对应上这三层目录漏了 Core 就编不过漏了 User 就找不到配置头文件。示例工程里已经配好相对路径建议沿用它的目录命名别改成中文或者带空格的名字MDK 对路径里的空格处理一直不太友好老手也经常被这个绊住。3.2 定时器与 ADC 配置PWM 中心对齐是关键FOC 对 PWM 的要求和普通电机驱动不一样它需要六路互补输出带死区并且要在中心对齐模式下工作。中心对齐意味着计数器先增后减PWM 波形的中间点正好对应计数器的溢出时刻这个时刻上下桥臂的开关状态最稳定是电流采样的最佳窗口。TIM1 是 F103 上唯一能输出带死区的互补 PWM 的定时器所以这份库的 Hal 层默认锁定 TIM1。/* 72MHz 时钟中心对齐模式产生 10kHz PWM */ TIM_TimeBaseInitTypeDef tb; tb.TIM_Prescaler 0; tb.TIM_CounterMode TIM_CounterMode_CenterAligned1; tb.TIM_Period 3600 - 1; /* 72MHz / (3600*2) 10kHz */ tb.TIM_ClockDivision 0; tb.TIM_RepetitionCounter 0; TIM_TimeBaseInit(TIM1, tb);中心对齐模式下计数器从 0 加到 ARR 再从 ARR 减回 0一个完整的 PWM 周期需要两次计数溢出所以频率要把除以 2 算进去。TIM_Period填 3599 时周期是 3600 个计数脉冲对应频率正好 10kHz。如果改成 20kHz 电流环这个值要减半但注意 F1 的 ADC 采样时间和中断开销未必撑得住建议从 10kHz 起步。改频率时还要同步修改foc_config.h里的pwm_freq宏让库内部的时间基准跟着变否则速度环的积分时间常数全部算错。电流采样这一环示例源码用的是单电阻或双电阻采样。我按这份库的常见配置展开ADC1 的注入组通道接在两个下桥臂驱动电阻的放大输出端触发源选 TIM1 的 CC4 事件让采样时刻严格落在 PWM 中心点。这样做的目的是避开功率管开关瞬间的 dv/dt 噪声那个时刻采样电流最干净。/* ADC1 注入组由 TIM1_CC4 触发PWM 中心点采样 */ ADC_ExternalTrigConvCmd(ADC1, ENABLE); ADC_ExternalTrigConvConf(ADC1, ADC_ExternalTrigInjecConv_CC4); /* 注入组通道序列两个电流采样通道 母线电压通道 */ ADC_InjectedSequencerLengthConfig(ADC1, 3); ADC_InjectedChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_1Cycles5); ADC_InjectedChannelConfig(ADC1, ADC_Channel_2, 2, ADC_SampleTime_1Cycles5); ADC_InjectedChannelConfig(ADC1, ADC_Channel_3, 3, ADC_SampleTime_7Cycles5);注入组的采样时间设为 1.5 周期是为了让采样窗口尽量短集中在 PWM 中心的小窗口内。母线电压通道用 7.5 周期因为它对噪声不太敏感慢一点没关系。这里最容易犯的错是忘记使能外部触发导致 ADC 一直在自由运行模式采回来的电流和 PWM 动作完全不同步电流环看起来像在抽搐。上电后先用示波器量注入组转换完成的标志是否以 10kHz 节奏触发再往下走。3.3 初始化调用与中断接入库的使用方式不复杂核心是构造一个配置结构体填充电机参数后调用初始化然后在 TIM1 更新中断里喂给电流环。下面的初始化代码是示例工程里的典型写法FOC_ConfigTypeDef cfg; cfg.pwm_freq 10000; /* 电流环频率同 PWM */ cfg.bus_voltage_v 24.0f; /* 母线电压按分压比标定 */ cfg.motor_rs_ohm 0.6f; /* 相电阻见下方实测方法 */ cfg.motor_ls_h 0.00035f; /* 相电感 */ cfg.pole_pairs 4; /* 极对数 磁极数 / 2 */ cfg.iq_max_amp 2.0f; /* q 轴电流上限保护电机 */ cfg.encoder_offset 0.0f; /* 编码器零位偏移校准后回填 */ FOC_Init(cfg); FOC_SetSpeedTarget(0.0f); /* 先给 0 转速安全启动 */ FOC_Start();相电阻和相电感这两项直接影响电流环增益预估值填错了轻则电流震荡重则上电直接过流。如果没有 LCR 表可以用直流电源限流 1A 施加到电机任意两相之间测出线电阻后除以 2 就是相电阻星形绕组下电感用低频交流激励测压降差值估算但精度有限最好还是用库自带的参数辨识流程示例源码里通常有一个手动辨识模式会自动注入测试电压并辨识出 Rs、Ls、反电动势常数。上位机界面都省了直接看串口打印。中断接入是最后一步TIM1 更新中断对应电流环速度环在库内部自动分级调用不需要你再写一个中断void TIM1_UP_IRQHandler(void) { if (TIM_GetITStatus(TIM1, TIM_IT_Update) ! RESET) { FOC_CurrentLoopISR(); /* 库内部采样 - 变换 - PI - SVPWM */ TIM_ClearITPendingBit(TIM1, TIM_IT_Update); } }FOC_CurrentLoopISR内部完成了从读取 ADC 结果到更新 TIM1 比较寄存器的全部动作。你要做的只是保证这个中断不被其他中断长时间打断所以建议在工程里把 TIM1 更新中断优先级设到最高或者至少高于串口和普通外设中断。如果调试时喜欢在中断里打断点你会发现断点一停PWM 输出冻结电机立刻失去同步——这不是 bug是 FOC 的固有特性调试完全靠离线打印或在线变量观察不要停在电流环中断里单步。3.4 第一次上电的检查顺序不管示例工程能不能直接编译过第一次上电都别直接接电机。先空载检查母线电压采样值是否和万用表一致再看六路 PWM 波形有没有互补和死区最后用示波器确认 ADC 注入组转换节奏是 10kHz。这三步过了再带电机。我见过不止一次因为 MOS 管驱动芯片没焊接好PWM 一开就烧下桥的案例问题不在库而是硬件没验证就开始跑闭环。把检查顺序拆成下面五步每次都按这个清单走不装电机量母线电压采样校准分压比系数。不装电机测 TIM1 六路输出波形确认互补与死区。不装电机测 ADC 注入组转换完成频率应为 10kHz。装电机但速度环目标设为 0确认转子能被锁住不动。给 50RPM 小转速看电流波形是否平滑再逐步升速。这五步每步都有明确的失败判据波形不对就查硬件转换频率不对就查触发配置转子锁不住就查电流采样零点。用这套顺序排错比直接上高速然后炸管子的血泪经历要省心得多。提示第一次上电前先确认 MOS 驱动芯片供电正常、PWM 输入引脚没有接反。这两个问题在硬件上出错时软件里查不出结果会白白浪费一整天。4. 电流环与速度环参数整定先让电流稳下来再谈转速4.1 为什么电流环要先整定双闭环 FOC 里电流环是内环直接决定电机能不能稳定的力矩输出和过流保护是否及时速度环是外环输出给电流环作参考。内环带宽不够外环调得再花哨也没用速度环的 iq_ref 变化电流根本跟不上表现出来就是转速震荡、电机啸叫。所以整定的铁律是先把电流环调到在阶跃参考下有足够快的响应且不过冲再碰速度环。电流环的两个 PI 分别作用在 d 轴和 q 轴。d 轴目标恒为 0它的作用是消除耦合和维持磁场q 轴目标来自速度环直接对应转矩。F103 上没有硬件 FPU电流环中断里能分给 PI 运算的周期极其有限所以这份库的 PI 实现是整数定点化的比例和积分系数不是浮点而是在 User 层以 Q15 或 Q12 格式定义。手册里会给出换算公式实际 Kp 配置值 / 32768这个细节不看清直接用浮点 PID 思维配置整数系数参数会差几十倍。如果翻开 Core 层的 pi.c你会看到积分项并不是每次中断都累加而是在误差很小的时候暂停积分这就是防积分饱和的常规处理。定点化实现的积分上限尤其重要因为整数溢出是静默发生的不会报错只会在电流控制里表现为莫名其妙的累积偏差。我习惯在调试串口里把 PI 的输入、输出、积分项三个变量都打出来三者数量级对不上时立刻能定位是哪一项溢出。这个习惯救过我一次当时 Ki 给了 32767 的极限值积分项随时饱和翻转表现就是转速稳定几秒后突然猛跳一下。4.2 整定流程从阶跃响应到限幅确认我的习惯是用示波器或串口绘图观察 iq 的实际值然后按三步走。第一步断开速度环直接把 iq_ref 设为一个小值如 0.5A 的阶跃观察 iq 的跟随速度第二步逐步增大 Kp让 iq 上升沿变陡直到出现第一个振荡点就回调 30%第三步固定 Kp慢慢加 Ki目标是稳态误差消失且不出现低频振荡。整个过程电流环的输出幅值要限住q 轴电压给定不能超过逆变器能输出的最大相电压一般取母线电压的三分之根号三倍左右。这里有个容易被忽略的点PI 输出的限幅值不是随便填的。SVPWM 的输入电压 v_alpha、v_beta 的模长超过六步扇区线性区上限后输出会进入过调制区电流波形畸变随之而来。把 vd、vq 的限幅直接给成bus_voltage / 1.732f这个值对应 SVPWM 线性区的最大相电压可以保证不进入过调制。示例源码的 User 层文件里默认就是这三行改动前先想清楚自己在干什么。还有一类常见的干扰来自上位机显示数据时的串口中断。如果把串口打印放进电流环中断或者把串口中断优先级设得比 TIM1 更新中断还高电流环的周期抖动会直接反映到电流波形里。F1 只有 72MHz一次串口中断几十微秒看似不长但在 10kHz 电流环里相当于占掉好几个控制周期。解决方法是串口数据只在主循环里发电流环中断里用一个环形缓冲区暂存哪怕丢几帧调试数据也无关紧要。4.3 速度环整定与参数参考表电流环稳定之后速度环不需要太复杂的调法。先把速度环增益设成很小的值比如 Kp 给 0.01 量级Ki 给 0.1 量级然后给定 300RPM 阶跃看转速反馈的超调量和稳定时间。速度环带宽本来就低电机机械惯量又大Kp 稍微给大一点就会出现明显啸叫和来回摆动这时候往回退退到啸叫消失再留 30% 余量。环路Kp 初值范围Ki 初值范围响应目标电流环 d 轴0.5 ~ 2.050 ~ 200阶跃无超调上升沿 0.5ms 内电流环 q 轴0.5 ~ 2.050 ~ 200同 d 轴速度环0.005 ~ 0.020.05 ~ 0.2300RPM 阶跃超调小于 5%注意下表初值对应的电机功率是 200W 以下的小型无刷电机大功率电机的电流环增益初始值会明显不同参考方向相同具体数值必须重新整定。注意这张表里的数值是针对常见 2204/2208 航模电机和 24V 母线给的初值换电机后必须重新走整定流程。尤其是 q 轴电流环的 Ki给大了会在速度环给定突变时冲出限幅造成 iq 长时间饱和表现是电机加速猛但一减速度就顿挫。如果你在整定中发现怎么调都振回头检查是不是 Rs 和 Ls 填错了带库的参数辨识流程的话跑一遍比手动试参数快得多。PID 这块确实有点玄学但方向对了剩下的只是耐心调几个数。4.4 速度环输出限幅与斜坡速度环输出是 iq_ref它要限幅因为 iq 直接对应力矩不限幅就意味着电机可以输出额定十倍以上的电流直接把 MOS 管和电机绕组都烧穿。库里的默认做法是给一个iq_max_amp参数你在初始化结构体里配成电机额定电流的 1.5 到 2 倍即可。另外建议给转速给定加斜坡从 0 到目标转速分几百毫秒爬上去避免阶跃给定瞬间电流冲击。示例源码里有个简单的斜坡函数调用FOC_SetSpeedTarget前先经过它就两行代码的事但对寿命的影响很大。斜坡时间的设置同样有讲究设太短失去意义设太长会让操作者觉得系统迟钝。我一般按目标转速的千分之一设爬升时间比如 300RPM 用 300ms 爬升这个比例在绝大多数风机、泵、小型机器人轮毂电机上都成立。如果你发现爬升结束后 iq 有一个明显的下冲补偿说明斜坡时间比电流环的响应速度还快这个时候不是调 PI 能解决的把斜坡放慢一点更实际。5. 常见问题避坑实录五条把电机调废的真实记录这一章是我拆项目时攒下的教训。下面五条都是我实际见过或踩过的坑每条都按现象、原因、解决三层拆解。你照着库跑的时候遇到类似情况先对号入座不要盲目改 PID。5.1 电流采样相关的两个高频翻车点第一条电流波形在低速时全是毛刺速度环轻微震荡iq 显示值明显比实际偏大。原因是 ADC 采样时刻没有落在 PWM 中心或者采样窗口太长把功率管开关噪声采进来了。排查方法是看 PWM 中心对齐配置是否正确再用示波器对比 PWM 波形和 ADC 采保信号的时间关系。解决把 ADC 注入组触发源改成 TIM1 的 CC4 事件采样时间改到 1.5 周期并确认 ADC 转换完成中断优先级足够高。另一个隐藏问题如果 PWM 频率是 10kHz采样点只有一个低速时 SVPWM 的占空比极小单电阻采样窗口可能窄到采不到有效电流这就是低速转矩脉动的来源之一。解决方法是换成三电阻采样或者把采样点选在占空比更宽的扇区边界。这里没有捷径只能根据你 PCB 上采样电阻的布局来决定。第二条上电后母线电压采样值飘电流环标定后过一会又漂电机带着带着就开始嗡嗡响。原因是分压电阻的温漂或者采样放大器的零点没有校准。库的操作手册里通常专门有一节写电流零点校准流程上电后先不使能 PWM采一组 ADC 值当作零偏存进 flash以后再上电直接调用。这个步骤不要跳过很多项目就是零偏没校准id 在 0 附近漂磁链估算全部跑偏低速表现尤其差。解决在FOC_Init前调用校准函数把零偏写进phase_current_offset参数。校准完成后用一个小负载让电机产生恒定力矩观察 iq 是否平稳确认零偏真正消除再继续下一步调试。5.2 控制参数与保护相关的三个翻车点第三条换电机后没改 Rs 和 Ls电流环直接啸叫或过流跳闸。原因是库内部用 Rs、Ls 做电流环增益的预设和前馈补偿参数差了十倍PI 增益就离谱。解决每次换电机强制先跑一遍参数辨识流程测出 Rs、Ls、极对数再重新整定电流环。没有辨识流程的话至少用 LCR 表量出电感值再手动填。这里最忌讳的是觉得上个电机也是 2204参数差不多电感差 30% 就足以让电流环从临界阻尼变成振荡发散。我见过一个项目电机从 2204 换成 2804 只改了极对数上电三秒驱动板就冒烟换完参数再跑完全正常。第四条从开环切换闭环的瞬间电机乱跳甚至反转高速飞转。原因是转子初始角度没有对齐编码器零位偏移是错的Park 变换把错误的转子位置当成了真实位置。解决上电先做对齐动作——给 d 轴通一个固定的小电流让转子被拉到零位然后读取编码器值写入 flash以后每次上电先读偏移量再进闭环。如果用的是无感观测器初始角度来自开环强制换相角度对齐逻辑更复杂先跑对有感模式再谈无感。这个问题是 FOC 里最典型的黑匣子看起来是软件问题本质是转子位置状态没初始化。对齐完成后把转子手动转一圈确认编码器读数连续无跳变再进闭环才有意义。第五条电机堵转大电流不保护直到 MOS 管冒烟。原因是示例库默认只实现电流环和速度环堵转保护是电机应用层面的逻辑库不负责。解决在速度环那个 1kHz 的更新节拍里自己加一段堵转检测逻辑。下面这段是标准的实现方式/* 速度环 1kHz 节拍内调用 */ void Stall_Check(void) { /* 给定 30RPM 但反馈持续 30RPM判为堵转 */ if (fabsf(speed_ref) 30.0f fabsf(speed_fb) 30.0f) { stall_cnt; if (stall_cnt 500) /* 500ms 判堵转 */ { FOC_DisablePWM(); /* 立刻关断六路 PWM */ fault_code FAULT_STALL; } } else { stall_cnt 0; } }堵转检测的超时时间要跟实际机械负载匹配风扇和泵的堵转特性完全不同。设太短会在正常重载启动时误触发设太长则保护等于摆设。除了堵转还要给母线过压、欠压、相电流瞬时过流各留一个保护位示例源码里通常有FOC_DisablePWM这个接口就看你愿不愿意在主循环里把保护逻辑补全。我见过太多人跑通示例就以为大功告成结果项目现场因堵转或电网跌落烧板的这部分永远要当成产品功能来做不是调试辅助。需要留意的一点是重载启动时电机加速慢转速反馈可能长时间低于阈值这时候要结合电流环输出判断是堵转还是正常爬升不能一刀切看转速。我一般会在堵转检测里加一个条件电流环输出已经顶到限幅值且持续 300ms同时转速没起来才真正判定堵转。6. 闭环验证与离线检查清单别只看它转起来了有人调到电机空载转得顺滑就以为闭环完成了实际上空载顺滑只能证明电流环没崩证明不了速度环的鲁棒性。我的验证习惯是给电机带负载——最简单的是拿手捏住转子施加阻力或者装个小桨叶——然后看 iq 是否随着阻力增大而自动增大转速是否还能稳在目标值附近。如果 iq 明显增大而转速下跌明显说明速度环 Ki 不够或 iq 限幅太紧如果 iq 不增、转速大跌说明速度环还没真正接管可能仍然运行在某种开环的残余状态。另外一条重要验证是用串口把实时的 iq、id、电角度、目标转速打出来离线画成曲线。稳态时 id 应在 0 附近波动、iq 应平稳无毛刺动态过程中 iq 跟随速度环输出有自然的过冲回落。如果 id 不是 0 而是稳定偏在某个负值多半是电流采样零点偏了如果 id 和 iq 都高频抖动回头查电流环中断是否被其他中断频繁抢占。把这组数据存成 CSV用任意绘图工具就能看不需要昂贵的调试器。从那以后我每次拿到新电机都强制先走一遍零位校准、电流环阶跃、速度环阶跃三段流程记录三组曲线存档再谈产品化调优。这个习惯帮我拦下过不止一次参数错配导致的烧板事故。最后把下载入口放在这里这份 stm32f1 FOC库含操作手册与示例源码可以整套获取解压后按本文第 3 章的目录结构搬进自己的工程即可。实际调试时遇到手册和源码不一致的地方以 Core 层源码为准文档只作引导这套经验我沿用至今。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?
咨询建站