尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

STM32F103极坐标FOC驱动PMSM电机:从零搭建简易磁场定向控制

STM32F103极坐标FOC驱动PMSM电机:从零搭建简易磁场定向控制 在 FOC磁场定向控制被广泛用于无人机、电动工具和家电电机的今天STM32F103C8T6 仍然是很多业余项目和学习者接触最多的入门芯片。这篇文章要讨论的开源项目核心是在一块不到十元的最小系统板上用极坐标形式的电压矢量控制驱动从洗衣机拆下来的永磁同步电机PMSM/BLDC。它没有使用昂贵的开发板也没有一开始就引入完整的 Clark/Park 变换和 SVPWM 扇区判断而是把 FOC 控制器需要处理的“电流多大、磁场角度在哪、PWM 怎么给”三个问题用更直观的方式在 C 语言里实现出来。这篇内容面向具备基础 STM32 HAL 库使用经验、想从“点灯”跨到“电机控制”的开发者。读完你可以理解 FOC 控制的基本链路知道为什么极坐标表达能降低实现门槛能在一张标准的最小系统板上搭建可复现的硬件接线和软件框架也能在电机不转、抖动、过流、烧管子这些典型故障出现时按照日志和波形缩小排查范围。文章给出的代码是简化的核心片段用于说明控制思路实际落地时需要结合你自己的电机参数、驱动板原理图和工程结构调整。1. 为什么选 STM32F103C8T6 和极坐标 FOC 这条路线1.1 FOC 控制器到底在干什么FOC 的全称是 Field Oriented Control也就是磁场定向控制。它的核心目标不是简单地把三相电源接给电机而是让定子产生的磁场方向始终和转子磁极保持接近 90 度的夹角就像直流电机那样可控地产生转矩。更直白地说三相电机内部有三个绕组任意时刻给三相桥臂施加不同的 PWM 占空比就能合成一个电压矢量。这个矢量的大小决定电流大小方向决定磁场方向。FOC 要做的就是实时知道转子磁极现在在哪里、需要把电压矢量送到哪个角度、送多大强度然后持续更新三相 PWM 输出。标准 FOC 的做法是先把三相电流采样回来做 Clark 变换从 a/b/c 三相转到 α/β 两相再做 Park 变换从静止坐标转到和转子一起旋转的 d/q 坐标。在 d/q 坐标下电流的 d 轴分量控制磁场强度q 轴分量控制转矩两个 PI 环分别调节。最后再通过逆 Park 变换和 SVPWM 算法生成三相桥臂占空比。整套流程计算量大三角函数和坐标变换代码也比较多。1.2 极坐标 FOC 与直角坐标 FOC 的区别极坐标 FOC 的思路是定子电流或电压矢量同样可以用大小和方向两个量描述。直角坐标用 x、y 两个分量表示矢量极坐标则用幅值 r 和角度 θ 表示。标准 FOC 内层控制的是 d/q 两个电流分量也就是直角坐标极坐标 FOC 则直接控制电流矢量的幅值和角度。对学习型项目来说这样做有几个实际好处不需要频繁调用 sin/cos 计算 d/q 轴电流转子角度可以直接用霍尔换相表或反电动势过零事件来逼近。不需要写 SVPWM 的扇区判断和矢量作用时间推导三相占空比可以直接由电压幅值和角度通过查表生成。控制变量变成“推多大力”和“往哪个方向推”方便通过串口观察也方便手动调试。代价是控制动态性能和转矩线性度通常不如完整 FOC。极坐标形式更适合速度控制场景比如风机、水泵、洗衣机电机这类不需要极高动态响应的负载。对比项标准 FOC极坐标 FOC电流控制量d/q 轴分量幅值 r 与角度 θ坐标变换Clark Park 逆 Park少量变换或查表调制方式SVPWM查表生成三相占空比计算开销较高较低动态响应好一般适合学习者有数学门槛直观、易调试1.3 这套方案适合什么场景用 STM32F103C8T6 做极坐标 FOC不是要证明芯片能跑多快的控制环而是为了降低理解门槛。F103 的主频只有 72 MHzFlash 也只有 64 KBRAM 20 KB运行完整高性能 FOC 会比较紧张但运行一个 10 kHz 到 20 kHz 左右的极坐标控制环是可行的。这里要特别注意洗衣机拆机电机参数差异非常大有些是低压无刷直流电机有些是高压 PMSM额定电压、极对数、相电阻、相电感完全不同。项目标题中的“简易”就体现在这里——先让电机转起来再谈精度。正确做法是先确认电机额定电压再用万用表和电感表测量相电阻、相电感最后决定母线电压和电流采样电阻的参数。2. 硬件清单、引脚规划与接线检查2.1 需要准备的器件项目之所以适合复现是因为大部分器件可以直接买到不需要专门画板。完整清单见下表。器件作用说明STM32F103C8T6 最小系统板主控蓝色 pill 板即可注意最小系统板与驱动板共地三相全桥驱动板功率放大常见 DRV8301、EG2134、IR2101 方案需支持低压侧电流采样采样电阻和运放电路电流采集至少采集两相电流第三相由基尔霍夫定律计算洗衣机拆机永磁电机被控对象先测量额定电压和相电阻再决定母线电压24V 开关电源低压调试供电学习阶段先用低压不要直接上 220VST-Link 或串口工具下载和调试串口至少留一路用于打印角度、电流和错误码霍尔传感器或编码器转子角度项目以霍尔方案为主无感方案需要额外反电动势检测电路示波器或逻辑分析仪观测 PWM 和电流如果没有也可以用串口波形输出替代2.2 引脚分配要避开调试口和 ADC 冲突STM32F103C8T6 是 48 脚封装可用引脚不多。一个容易踩的坑是 PWM 输出、串口、ADC 和 SWD 调试口互相抢占。下面是一组参考分配实际项目要以你自己的最小系统板原理图为准。功能引脚说明TIM1_CH1PA8三相桥上桥臂 ATIM1_CH1NPB13三相桥下桥臂 ATIM1_CH2PA9三相桥上桥臂 BTIM1_CH2NPB14三相桥下桥臂 BTIM1_CH3PA10三相桥上桥臂 CTIM1_CH3NPB15三相桥下桥臂 CADC1_IN0PA0相电流采样 1ADC1_IN1PA1相电流采样 2USART2_TXPA2调试串口输出USART2_RXPA3调试串口输入霍尔 A/B/CPB4/PB6/PB7根据手头霍尔排列调整避开 SWD 和 ADC这里不建议把调试串口放在 USART1因为 PA9 和 PA10 已经用于 TIM1_CH2 和 TIM1_CH3。霍尔引脚要避开 PB3/PB4 的默认 JTAG 功能如果非要用这两个引脚需要先关闭 JTAG 复用功能但这会影响 ST-Link 调试一般不建议。2.3 电流采样与驱动板接线要点极坐标 FOC 同样需要相电流反馈否则角度修正和幅值控制没有依据。常见低压驱动板使用三电阻采样或两电阻采样在 PWM 周期的特定时刻读取采样电阻上的电压还原相电流。接线时最需要注意的是地线。控制板、驱动板、电源、采样运放的地必须可靠连接否则 ADC 读数会跳动电机甚至会在启动瞬间失控。推荐顺序是先把控制板与驱动板信号地接好再接入母线电源最后才连接电机三相线。驱动板逻辑电源通常和控制板共用 3.3V 或 5V但同一颗稳压芯片可能无法同时给 MCU 和驱动芯片提供足够电流。建议给最小系统板单独供电驱动板逻辑侧单独供电但要保证两者共地。如果驱动板功率地和信号地是分开的要按照驱动板原理图在合适位置单点连接不要随意短接。2.4 必须先做的上电安全检查任何功率电子项目上电前检查都值得养成习惯。调试阶段建议按以下顺序验证不接电机只给控制板供电用示波器确认 TIM1 六路 PWM 存在死区时间设置正确。给驱动板通低压母线电不接电机确认母线电压没有异常跌落驱动芯片没有发烫。用示波器看三相输出对地波形确认上管和下管没有同时导通。断开母线电源等待母线电容放电后再接电机三相线。首次上电建议在母线上串联一个限流电阻或灯泡限制故障电流。不建议在没有任何输出保护的情况下直接上 220V 交流经整流的母线电压。学习阶段先用 24V 或 48V 低压直流安全性和故障排查效率都会高很多。3. 用 STM32CubeMX 生成工程先解决 PWM 和 ADC 同步3.1 时钟与外设配置工程基于 STM32CubeMX 和 HAL 库生成时钟配置为 HSE 外部晶振或 HSI 内部时钟。F103 的 ADC 最高支持 14 MHz 时钟而 APB2 总线是 72 MHz所以 ADC 预分频至少要除以 6。PWM 频率建议设置在 10 kHz 到 20 kHz 之间太低会有噪音太高会受限于定时器分辨率和 MOSFET 开关损耗。在 CubeMX 中需要开启的外设如下RCC外部晶振或者内部时钟根据板子跳线决定。TIM1选择 PWM Generation CH1/CH2/CH3并启用 CH1N/CH2N/CH3N 互补输出。ADC1开启两个通道扫描模式或注入模式。USART2异步串口波特率 115200。GPIO霍尔输入引脚配置为输入模式可以开启上拉。时钟树建议保持 72 MHz 主频APB1 36 MHzAPB2 72 MHz。TIM1 挂在 APB2 上ADC1 也挂在 APB2 上。3.2 TIM1 中心对齐 PWM 配置电机控制中TIM1 通常配置为中心对齐模式也就是计数从 0 加到 ARR再从 ARR 减到 0。这样 PWM 波形关于周期中心对称电流纹波更小而且中心点对应计数最大值或最小值时刻正好适合 ADC 采样。TIM_OC_InitTypeDef sConfigOC {0}; sConfigOC.OCMode TIM_OCMODE_PWM1; sConfigOC.Pulse 0; sConfigOC.OCPolarity TIM_OCPOLARITY_HIGH; sConfigOC.OCNPolarity TIM_OCNPOLARITY_HIGH; sConfigOC.OCFastMode TIM_OCFAST_DISABLE; sConfigOC.IdleState TIM_OCIDLESTATE_RESET; sConfigOC.OCNIdleState TIM_OCNIDLESTATE_RESET; HAL_TIM_PWM_ConfigChannel(htim1, sConfigOC, TIM_CHANNEL_1); HAL_TIM_PWM_ConfigChannel(htim1, sConfigOC, TIM_CHANNEL_2); HAL_TIM_PWM_ConfigChannel(htim1, sConfigOC, TIM_CHANNEL_3); HAL_TIM_PWM_Start(htim1, TIM_CHANNEL_1); HAL_TIM_PWM_Start(htim1, TIM_CHANNEL_2); HAL_TIM_PWM_Start(htim1, TIM_CHANNEL_3); HAL_TIMEx_PWMN_Start(htim1, TIM_CHANNEL_1); HAL_TIMEx_PWMN_Start(htim1, TIM_CHANNEL_2); HAL_TIMEx_PWMN_Start(htim1, TIM_CHANNEL_3);这段代码里有两个关键点。第一个是互补输出必须使用HAL_TIMEx_PWMN_Start只启动普通 PWM 函数不会输出下管波形。第二个是OCMode选择TIM_OCMODE_PWM1后在中心对齐模式下计数向上时比较值控制输出翻转具体输出电平由极性决定。死区时间在HAL_TIMEx_ConfigBreakDeadTime中配置全桥电路的死区不可以省略否则上下管直通会烧 MOSFET。3.3 用 TIM1 TRGO 触发 ADC采样点要对齐相电流采样必须发生在 PWM 周期的确定时刻。因为电流采样电阻上的电压只在特定开关状态下才能正确反映相电流比如三电阻采样通常在下管全部导通时读取。使用 TIM1 的 TRGO 触发 ADC可以让采样时刻自动和 PWM 周期对齐避免在主循环中随机采样。HAL_TIMEx_MasterConfigSynchronization(htim1, TIM_TRGO_UPDATE); ADC_ChannelConfTypeDef sConfig {0}; sConfig.Channel ADC_CHANNEL_0; sConfig.Rank 1; sConfig.SamplingTime ADC_SAMPLETIME_239CYCLES_5; HAL_ADC_ConfigChannel(hadc1, sConfig);配置完成后需要把 ADC 的触发方式设置为外部触发。F103 的 ADC1 可以响应 TIM1 的 TRGO 信号。选择更新事件作为 TRGO对应中心对齐模式下的计数值过零时刻。这个时刻三相桥臂开关状态相对确定适合读取采样电阻电压。实际项目中还要注意 ADC 采样保持时间。如果采样时间太短采样电容没有充到稳定值换算出的电流会偏小或抖动。F103 的采样时间最多可配置到 239.5 个 ADC 时钟周期以 12 MHz ADC 时钟计算大约是 20 微秒对 10 kHz 的 PWM 周期来说足够用。3.4 工程目录与代码分层即使是一个学习项目也应该把代码分成几个文件否则 PWM、ADC、控制算法混在 main.c 里后面根本没法排查。推荐目录结构如下Core/ Inc/ main.h foc_ctrl.h hall.h current_sense.h Src/ main.c foc_ctrl.c hall.c current_sense.c Drivers/ STM32F1xx_HAL_Driver/分层原则是main.c 只负责初始化和周期循环foc_ctrl.c 存放极坐标 FOC 算法hall.c 读取霍尔并估算角度current_sense.c 处理 ADC 数据并转换成电流值。这样后续把霍尔方案换成无感方案时只需要替换 hall.c 或新增观测器文件不需要重写控制主框架。4. 极坐标 FOC 控制器的核心算法与代码4.1 角度来源霍尔估算与开环启动极坐标 FOC 的角度信息决定电压矢量应该指向哪里。最简单的做法是使用霍尔传感器。洗衣机电机通常带有三个霍尔在一个电角度周期内会输出 6 种组合每个区间占 60 度。霍尔信号变化时就可以确定转子磁极所在的扇区。#define HALL_ANGLE_TABLE 6 const uint16_t hall_angle[6] { 0, // 霍尔组合 1 1024, // 60 度对应 1024/4096 * 360 2048, // 120 度 3072, // 180 度 4096, // 240 度 5120 // 300 度 };这里使用 12 位查表角度0 到 4095 对应 0 到 360 度避免全程使用浮点三角函数。霍尔换相只能提供 60 度分辨率直接使用会造成明显转矩脉动。改进方法是在两次霍尔跳变之间用定时器测量时间并线性插值角度代码里再对角度做低通滤波和限幅。启动阶段角度不可靠时可以先采用开环启动不依赖电流反馈直接给一个固定幅值的电压矢量让角度从 0 开始以斜坡方式增加把转子拖到同步转速后再切换成霍尔反馈的闭环运行。这是一个非常实用的学习技巧能够避开“没有角度反馈就转不起来”的死循环。4.2 三相电流采样与重构FOC 至少要拿到两相电流。第三相可以通过三相电流之和为零计算得到float ia current_sense_get_phase_a(); float ib current_sense_get_phase_b(); float ic -(ia ib);ADC 读到的原始值是采样电阻上的电压需要先换算成电流。换算公式是电流 电压 / 采样电阻阻值电压 ADC 原始值 / 4095 * 参考电压。如果采样信号经过运放放大还要除以放大倍数。采样电阻阻值和运放增益必须和硬件原理图一致这一步骤也是电流环参数整定的基础。电流采样最常见的坑是 ADC 转换结果出现明显的偏移和毛刺。偏移来自运放零漂和采样时刻选择不正确毛刺来自开关噪声。软件上可以加滑动平均滤波或一阶低通滤波但更有效的办法是调整采样时刻避开开关管刚动作的瞬态噪声。4.3 电压矢量用极坐标生成得到转子角度 theta 后控制器的任务变成根据转速误差计算电压幅值 amplitude根据电流角度误差修正电压角度然后生成三相占空比。极坐标输出与传统 SVPWM 的差异就在这里。传统方案要通过扇区判断和矢量分解计算占空比而极坐标方案可以预先制作一张正弦表根据期望电压矢量的电角度直接查表得到三相分量。uint16_t sin_table[256]; void foc_generate_voltage(uint16_t angle_12bit, uint16_t amplitude, uint16_t *duty_a, uint16_t *duty_b, uint16_t *duty_c) { uint16_t angle_idx angle_12bit 4; int32_t sin_a sin_table[angle_idx]; int32_t sin_b sin_table[(angle_idx 85) 0xFF]; int32_t sin_c sin_table[(angle_idx 171) 0xFF]; *duty_a (uint16_t)(TIM1_ARR / 2 (int32_t)amplitude * sin_a / 1024); *duty_b (uint16_t)(TIM1_ARR / 2 (int32_t)amplitude * sin_b / 1024); *duty_c (uint16_t)(TIM1_ARR / 2 (int32_t)amplitude * sin_c / 1024); }这段代码的核心是给三个 PWM 通道同时叠加一个直流中点和三相互差 120 度的正弦分量。amplitude 是电压幅值决定力矩大小angle_12bit 是转子的电气角度决定磁场方向。使用查表而不是调用 sin 库函数是因为 F103 的软件浮点运算能力有限在 10 kHz 中断里反复调用三角函数会占用大量 CPU 时间。中点偏置值是TIM1_ARR / 2如果 ARR 是 7200那么占空比围绕 3600 上下变化最大不超过 7200。amplitude 上限需要留出死区时间和电压裕量不能达到理论最大值否则 PWM 波形畸变电流会出现明显毛刺。4.4 主循环与中断框架控制环必须在定时中断中执行不能在 main 循环中延时等待。常用方案是用 TIM1 更新事件触发 ADC再由 ADC 转换完成中断启动控制算法。这样 PWM、电流采样、角度更新和控制计算全部对齐不会互相干扰。void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc) { if (hadc-Instance ADC1) { foc_current_sample(); foc_angle_update(); foc_control_loop(); } } int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_TIM1_Init(); MX_ADC1_Init(); MX_USART2_Init(); foc_init(); HAL_ADC_Start_DMA(hadc1, (uint32_t *)adc_buf, 2); HAL_TIM_PWM_Start(htim1, TIM_CHANNEL_1); HAL_TIM_PWM_Start(htim1, TIM_CHANNEL_2); HAL_TIM_PWM_Start(htim1, TIM_CHANNEL_3); while (1) { foc_uart_report(10); // 每 10 个周期打印一次调试信息 HAL_Delay(1); } }注意 HAL_ADC_ConvCpltCallback 里的代码要保持精简。PI 计算、查表、占空比装载都应该避免使用阻塞延时和调试打印串口打印放在 main 循环里低频执行。中断里不要调用HAL_UART_Transmit这种阻塞接口否则会严重影响控制环周期。5. 运行调试先让电机转起来再谈精度5.1 调试顺序要分四步走第一步烧写程序后不接电机用示波器看 PWM 波形。重点确认通道 1 和通道 1N 之间没有同时导通死区时间存在。第二步接入霍尔信号在低速手动旋转电机通过串口观察霍尔组合值和估算角度是否平滑变化。这一步能排除霍尔接线错误。第三步开环运行。设置一个较小的固定电压幅值和斜坡角度电机如果接线正常应该会开始缓慢旋转。这一步先确认相序不要运行在闭环状态。第四步闭环运行。霍尔角度稳定后加入电流环和速度环逐渐加大目标转速观察电流波形和转速波动。调试阶段目标关注信号通过标准PWM 输出检查确认死区和极性六路 PWM 波形无上下管同通角度检查确认霍尔接线霍尔组合、估算角度角度平滑变化开环启动确认相序电机转向和声音转向一致、无啸叫闭环带载验证控制环电流、转速、PI 输出电流平稳、转速稳定5.2 串口观测量与启动参数调试阶段建议在串口输出以下数据霍尔角度原始值经过插值和滤波后的电气角度三相电流中的两相值电压幅值和角度修正量目标转速和当前估算转速错误标志位每 10 到 20 个控制周期输出一次即可频率太高会占用大量时间。数据格式可以简单采用逗号分隔值方便用串口助手或 Python 脚本保存后绘图。首次启动参数建议如下PWM 频率 10 kHz开环电压幅值初始为最大值的 15%角度斜坡速度对应 1 Hz 到 5 Hz 电频率。如果电机抖动优先减小电压幅值而不是加大 PI 参数。很多初学者一看到电机不动就猛加比例系数结果导致过流和 MOS 管烧毁。5.3 调参顺序先电流环再速度环极坐标 FOC 同样有电流环和速度环的分层。由于极坐标形式下电流反馈是幅值和角度调参顺序要跟着控制结构走。先调电流幅值环。让电机在开环状态下用恒定角度旋转给定固定电流幅值目标观察采样电流是否和给定值接近响应是否快速超调是否严重。调节时先加大比例系数 P如果出现高频抖动说明 P 过大再加入积分 I用来消除稳态误差。再调角度修正环。霍尔插值角度在轻载和低速时误差不大高速和带载时实际磁场滞后会变大。角度修正环的输出限制在正负 15 度以内不要给太大权限否则系统会进入正反馈表现为转速越高电流越大、电机啸叫。最后速度环放在最外层输出作为电流幅值环的给定。速度环的 PI 参数不要一次给太激进每次修改后都要观察电流波形是否超限。5.4 正常现象和异常现象对比现象判断下一步动作电机静止时有轻微嗡声但不转可能是开环电压太小或角度反向加大电压幅值或交换三相线电机转起来但声音很尖PWM 频率太低或死区设置不对提高 PWM 频率重查死区转速不稳定电流周期性跳动霍尔角度不准确或电流采样毛刺大查霍尔接线调整采样时刻电机发热严重电流偏大或电压矢量角度偏查相序减小电流环目标高速时突然堵转角度修正环正反馈限制角度修正范围检查霍尔插值6. 常见问题排查从烧功率管到转速抖动6.1 上电无反应、电源异常现象是最小系统板指示灯亮但驱动板没有输出或者一上电就复位。先检查控制板和驱动板是否共地。这是最容易被忽略的问题信号地不共PWM 电平没有参考点驱动芯片可能一直处在上管导通状态。再用万用表测驱动板逻辑电源。驱动芯片的 VDD 和 MCU 的 3.3V 不能直接并联在同一个低压差稳压器上电机启动瞬间的电流会拉低电压导致 MCU 复位。建议分开供电只让两个电源的地相连。6.2 电机不转、有嗡嗡声、堵转嗡嗡声说明 PWM 有输出电机也通电了但合成磁场方向和转子位置不对转子被卡在某个固定位置振荡。可能是相序不对比如三相线接反了。排查方法是保持霍尔不动交换任意两相电机线观察是否改善。可能是电压幅值太小。转子从静止到同步需要克服静摩擦和齿槽转矩开环电压幅值至少要达到让电机能自行启动的程度。也可能是角度方向错误。霍尔组合对应的角度表写反了电机磁场方向总是拉转子往错误方向走。此时可以用串口打印的角度推算手动旋转电机时角度应该上升如果下降则交换霍尔接线或者重新分配霍尔角度表。6.3 电流采样跳变、数值漂移电流采样跳变会直接影响极坐标 FOC 的幅值控制通常表现为电机抖动或者用示波器能看到电流波形畸变。先看 ADC 采样时刻。如果使用普通软件延时触发 ADC而不是 TIM1 TRGO 触发采样点可能落在开关管动作瞬间采样电阻上噪声非常大。建议改为硬件触发。再看采样时间。F103 ADC 采样时间如果设置为 1.5 周期或 7.5 周期在采样电容较大时可能采不准。配置为 239.5 周期后观察是否改善。最后检查运放偏置。如果采样电路是双极性电流运放输出通常会叠加一个 1.65V 或 2.5V 的偏置电压。软件里要把这个偏置减掉并且做零电流校准。上电不接电机时记录的 ADC 值作为零偏基准之后再从这个基准上计算电流。6.4 角度突变导致反转和过流霍尔换相天然有 60 度跳变如果没有插值滤波角度每次跳变都会让电压矢量瞬间改变方向电流尖峰很大严重时会烧管子。需要在霍尔跳变时重新记录起点角度和定时器时间在下一个跳变前线性插值。代码里可以这样处理uint32_t hall_pulse_time; uint16_t hall_start_angle; uint16_t hall_end_angle; void hall_isr_callback(void) { uint32_t now TIM2-CNT; uint32_t dt now - hall_pulse_time; hall_pulse_time now; hall_start_angle hall_end_angle; hall_end_angle hall_angle[hall_read()]; }插值后的角度仍然需要在每个控制周期做限幅。如果霍尔信号本身因为机械安装问题出现毛刺角度可能突然反向限幅会避免控制系统把这种毛刺当成真实转向变化。角度突变还有一种原因是霍尔传感器供电不稳。霍尔通常需要稳定的 5V 或 3.3V 电源如果霍尔电源和电机功率电源混合走线大电流切换时霍尔电源跌落会产生错误换相信号。霍尔电源建议单独滤波靠近霍尔器件放 0.1uF 去耦电容。7. 从“手搓”到工程化开源项目的下一步7.1 先补齐保护与安全功能学习项目可以只跑通转速闭环但开源出去给别人复现或者用在非实验室环境时保护功能就必须补上。最基础的保护包括母线过流保护、母线欠压保护、过温保护和堵转检测。F103 的 ADC 除了采样相电流还应该留一路采样母线电压一路采样 NTC 温度。任何一路超过阈值立即关闭 TIM1 六路 PWM 输出并进入错误状态。void foc_fault_check(void) { if (current_peak CURRENT_LIMIT) { foc_fault_flag | FAULT_OVERCURRENT; HAL_TIM_PWM_Stop(htim1, TIM_CHANNEL_1); HAL_TIMEx_PWMN_Stop(htim1, TIM_CHANNEL_1); // 同样关闭另外两路 } if (foc_fault_flag ! 0) { foc_control_enable 0; } }错误状态需要保持不能自动恢复。要解除错误需要明确的外部复位信号比如按键或串口命令。这样能避免故障现场被覆盖也方便排查根因。7.2 学习环境与生产环境的差距学习环境里用面包板、杜邦线、稳压电源就能跑通这没问题。但面向生产场景差距体现在几个方面。第一是 PCB 布局。采样电阻到运放的走线过长会产生噪声PWM 信号和采样信号并行走线会引入耦合干扰。开源项目如果只是学习面包板可以接受如果要做小批量需要重新设计驱动板控制板和功率板分层。第二是启动策略。学习项目用简单开环斜坡启动就能转起来但在带载和低温环境中开环启动可能失败。工程上常用注入高频信号、预定位、闭环逐步切换等策略。第三是控制性能。极坐标 FOC 的开环启动和简单霍尔插值在空载风机上够用但如果带负载突变动态响应不足。工程上需要完整的闭环 FOC 和无感观测器或者至少是电流内环闭环运行。7.3 复现清单开源项目发布前建议检查如果要把这个项目发布到开源社区建议先过一遍以下清单很多“读者下载代码后跑不起来”的问题都出在细节上。检查项说明引脚分配表是否完整每个外设引脚必须和 CubeMX 工程一致电机参数是否需要标定至少说明测量相电阻、电感的方法死区和 PWM 频率是否明确不同驱动板死区要求不同采样电阻阻值和运放增益必须写出换算公式和软件调整位置串口输出格式说明需要提供解析方式或绘图脚本母线电压适用范围说明哪些情况下会过压或过流已知问题和边界条件坦诚写出极坐标方案的限制7.4 可扩展方向从霍尔极坐标 FOC 走向完整 FOC这个项目跑通之后下一步有两条比较自然的方向。一条是做无感 FOC。把霍尔角度估算换成基于反电动势的滑模观测器或龙伯格观测器这样就不需要传感器只用电流采样就能估算转子角度。这会让代码复杂度上一个台阶但也是目前最常用的低成本电机控制方案。另一条是优化电流环。极坐标形式下角度修正环只是一个简单比例调节如果改成完整 Park 变换后的 d/q 轴电流 PI 控制动态性能会明显提升。此时可以保留现有霍尔角度只是把控制量从幅值/角度切换成 d/q 电压分量。对刚接触电机控制的开发者来说这个极坐标 FOC 项目的最大价值不是算法有多先进而是它用最少的数学和最小的系统板把 PWM 三相桥、电流采样、转子角度、PI 调参这几件事串成了一个完整闭环。真正动手跑过一遍、烧过一次管子、用串口和示波器看过波形再去看标准 FOC 的资料理解速度会比直接啃公式快很多。
返回列表