ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

峰岹FU68xx无感FOC方案包深度拆解:硬件架构、代码与调试要点

峰岹FU68xx无感FOC方案包深度拆解:硬件架构、代码与调试要点 简介峰岹FU68xx系列FOC正弦波方案资源包面向电机控制开发工程师、家电与电动工具研发人员覆盖滑板车、电动车、三轮车、风机、冰箱、空调、电钻、水泵、吸尘器等多类应用场景。内含完整代码、原理图与PCB文件并按波轮洗衣机、单相变频、三相风筒、无感FOC电钻、空调压缩机等具体项目组织便于按需查阅。压缩包共2000个文件以1155个h源码、723个c源码为主辅以46个pdf文档、55个txt说明、18个htm页面等可满足代码移植、硬件设计与调试参考需求整体大小约191.81MB。目前已有496人学习下载适合具备一定FOC基础、希望快速获取量产级方案参考的中高级工程师。从内容看各项目包含MotorControl、AddFunction等核心模块代码结构清晰能够帮助读者理解不同功率段下的正弦波控制实现缩短产品开发周期。1. 峰岹FU68xx方案包到底装了什么做电机驱动的工程师应该都遇到过这种尴尬手里拿到一颗新MCU规格书写得天花乱坠真到自己画板、写FOC算法的时候才发现坑全藏在细节里。这次拆解的峰岹FU68xx FOC正弦波方案包给的是能直接开工的完整工程——从FU6812、FU6813到FU6831、FU6861覆盖单相和三相无感FOC应用场景横跨波轮洗衣机、冰箱压缩机、空调室内机、低压风机、水泵、吸尘器、电钻、角磨机等二十多个细分项目。每个项目都不是空壳例程而是带着完整代码、原理图和PCB参考设计的生产级方案。先说结论这套方案最值钱的不是FOC算法本身而是峰岹针对不同负载特性调好的启动策略和堵转处理。电钻需要带载启动时的大扭矩输出吸尘器要的是高速区的弱磁扩展冰箱压缩机则对低频转矩脉动极其敏感——同一套硬件平台靠软件配置区分应用场景这就是方案包的真正价值。源码包里的AddFunction.c和MotorControl.c是核心工程文件前者处理外围逻辑和功能扩展后者是FOC控制主循环所在两个文件的配合关系后面会详细拆解。适合的读者很明确正在用或准备用FU68xx做电机控制的嵌入式工程师以及想了解国产电机驱动方案成熟度的硬件开发者。2. FU68xx硬件架构与FOC正弦波实现原理2.1 单电阻采样与三电阻采样的选型逻辑FU68xx系列内部集成了电机控制专用的硬件加速单元这也是它跟普通ARM Cortex-M内核MCU最大的区别所在。以FU6812为例这颗芯片内置了硬件乘法器和专门处理Park变换、Clarke变换的运算单元意味着FOC算法里的坐标变换不再占用CPU周期而是由硬件直接完成。对于无感FOC方案来说CPU算力可以完全让给速度环、电流环和观测器算法控制周期的抖动更小正弦波的质量也更有保障。采样方式是选型时首先需要确定的方案包里单相电机项目如风筒、卷发器和三相电机项目如冰箱压缩机、电钻的采样拓扑完全不同。单相FOC通常采用单电阻采样在PWM周期的特定时刻采集直流母线电流再利用三相电流之和为零的原理重构出相电流。// MotorControl.c中电流重构关键片段 // 单电阻采样需要根据PWM占空比窗口选择采样点 void Current_Sample_Init(void) { // ADC触发源选择PWM定时器周期匹配 PWM_TrigADC_Config(PWM_TRIGGER_POINT_CENTER); // 设置采样保持时间确保母线电流稳定 ADC_SampleTime_Config(ADC_SAMPLE_32CLK); } void FOC_Current_Reconstruct(void) { uint16_t adc_value; int16_t i_bus; int32_t i_a, i_b, i_c; adc_value ADC_GetConversionValue(); i_bus (int16_t)(adc_value - ADC_OFFSET); // 根据扇区判断当前可采样的两相电流 switch (sector) { case SECTOR_1: case SECTOR_6: i_a i_bus; // 母线采样为A相电流 i_b -i_a - i_c; // 通过KCL计算B相 break; case SECTOR_2: case SECTOR_3: i_b i_bus; i_c -i_a - i_b; break; default: i_c i_bus; i_a -i_b - i_c; break; } }这段代码里的ADC_OFFSET是母线电流为零时的ADC原始值通常在中点附近。单电阻采样的难点在于当PWM占空比接近0%或100%时采样窗口会变得极窄甚至消失这就是所谓的“不可采样区”。方案包的处理方式是采用移相PWM或者插入测量矢量本质上是牺牲一点电压利用率来换取完整的电流信息。三电阻采样则没有这个问题每个下桥臂串联一个采样电阻三相电流可以同时获取。但缺点也很明显成本高、PCB布局面积大、对地噪声敏感。方案包里大功率项目如空调压缩机、波轮洗衣机基本都是三电阻方案而小功率风机、吸尘器则用单电阻降低成本。2.2 无感FOC转子位置观测器的工作机制无感FOC的核心是转子位置估计FU68xx方案包采用的是基于反电动势的滑模观测器SMO加锁相环PLL的组合方案。中高速段用SMO估算反电动势再通过PLL提取转子角度和速度低速和零速段则依赖高频注入法或者开环强拉启动。滑模观测器的本质是一个变结构的电流观测器通过滑模面的切换使得观测电流逼近实际电流进而提取出反电动势信息。// AddFunction.c中SMO观测器实现 #define SMO_GAIN (0.512f) // 滑模增益过大会导致抖动过小则收敛慢 #define OBSERVER_POLE (0.985f) // 观测器极点影响带宽 typedef struct { float alpha_est; // 估计的alpha轴反电动势 float beta_est; // 估计的beta轴反电动势 float theta; // 转子角度 float speed; // 转子速度 } SMO_State_t; SMO_State_t smo {0}; void SMO_Update(float i_alpha, float i_beta, float v_alpha, float v_beta) { float e_alpha, e_beta; float err_alpha, err_beta; // 电流误差计算 err_alpha i_alpha - i_alpha_est; err_beta i_beta - i_beta_est; // 滑模面切换函数饱和函数代替符号函数减小抖动 e_alpha SMO_GAIN * Saturate(err_alpha, 1.0f, -1.0f); e_beta SMO_GAIN * Saturate(err_beta, 1.0f, -1.0f); // 反电动势观测方程 e_alpha e_alpha OBSERVER_POLE * (e_alpha - Ls * i_alpha); e_beta e_beta OBSERVER_POLE * (e_beta - Ls * i_beta); // 通过arctan计算转子角度 smo.theta atan2f(e_beta, e_alpha); smo.speed (smo.theta - theta_prev) * SAMPLE_FREQ; theta_prev smo.theta; }这段代码是SMO观测器的核心框架实际工程中还有归一化处理、滤波和角度补偿等环节。SMO的调参重点是滑模增益增益太小观测器无法收敛到滑模面增益太大会引起高频抖振在低速时尤其明显。方案包里针对不同电机给出的SMO参数差异很大根源在于电机的反电动势常数不同——高速风机反电动势大收敛容易电钻堵转时电流大但转速低需要额外的启动策略辅助。2.3 电压利用率与SVPWM过调制策略FOC正弦波驱动相比方波驱动的最大优势是转矩脉动小、噪声低但代价是电压利用率较低。标准SVPWM的线性调制区相电压峰值只有直流母线电压的0.577倍这意味着母线电压为310V时电机能获得的最高相电压有效值约为127V。对于很多应用来说这个电压不够用所以方案包里加入了过调制策略。过调制分为两个阶段第一阶段将电压矢量从内切圆扩展到六边形边界此时输出电压谐波开始增加第二阶段沿着六边形边界走电压利用率可以进一步提升到0.707倍。代价是电流谐波明显增大转矩脉动也跟着恶化。工程上通常的做法是低速和额定工况运行在线性区只有在需要高速输出的场景如吸尘器高速档才切入过调制。// MotorControl.c中过调制实现 float Overmodulation_Process(float alpha, float beta, float udc) { float v_max; float v_linear; float x, y; // 线性调制区最大电压 v_linear udc * 0.577f; v_max sqrtf(alpha * alpha beta * beta); if (v_max v_linear) { // 线性区内直接输出 return v_max; } else { // 过调制模式限制矢量在六边形内 x alpha - beta * 0.577f; y alpha beta * 0.577f; // 六边形边界限制逻辑 if (x udc * 0.333f) alpha udc * 0.333f beta * 0.577f; if (y udc * 0.333f) alpha udc * 0.333f - beta * 0.577f; // 返回修正后的电压矢量幅值 return sqrtf(alpha * alpha beta * beta); } }需要特别注意过调制会降低电流环的控制带宽因为PWM管脚能输出的电压波形已经畸变。如果在过调制区间电机出现电流失控或转速波动优先检查是否过调制深度过大其次检查电流环PI参数是否需要针对过调制区间做增益补偿。3. 原理图与PCB参考设计拆解3.1 功率级拓扑与栅极驱动电路设计打开方案包的原理图文件夹每个应用项目都有一份完整的原理图文件格式是OrCAD Capture的DSN文件部分配套PDF版本方便直接查看。以无感FOC电钻FU6861Q方案为例功率级拓扑是典型的三相全桥结构采用峰岹自家的FD6288栅极驱动芯片。这颗驱动芯片集成了自举二极管和死区时间控制简化了外围电路设计。母线电压范围12V到60V实际上电钻类应用通常工作在20V或40V的锂电池电压下。栅极驱动电路有几个关键参数需要关注自举电容容值决定了上管栅极驱动能力的持续性。容值太小高频PWM下自举电压会跌落容值太大自举充电时间太长启动时上管可能来不及完全导通。方案包里采用的容值是100nF并联1uF的组合100nF负责高频瞬态电流1uF负责维持稳态电压这个组合基本覆盖了10kHz到30kHz的PWM频率范围。栅极串联电阻的阻值也需要根据功率MOS管的栅极电荷Qg来调整常见做法的起始值是10Ω结合开关波形调整。3.2 三相逆变器PCB布局要点PCB文件的格式是Altium Designer的PcbDoc文件这个方案的LAYOUT水准相当高值得作为参考模板。PCB布局的第一优先级是功率环路的最小化输入电容、MOS管、采样电阻构成的高频电流环路必须紧凑环路面积直接决定了母线的寄生电感量。寄生电感跟di/dt叠加会产生尖峰电压这个尖峰不仅威胁MOS管的安全工作区也是EMI超标的主要来源。# 用Python工具快速检查PCB开短路需安装KiCad插件 python3 -m pip install kicad-pcb-tools python3 -c from kicad_pcb import KicadPcb pcb KicadPcb(FU6816_FOC_Ref.kicad_pcb) # 检查网络连接 for net in pcb.nets: if len(net.pads) 1: print(f单点网络: {net.name}) # 单点网络通常是悬空或测试点 elif len(net.pads) 20: print(f高扇出网络: {net.name}, {len(net.pads)} pads) 这段脚本能快速发现原理图导入PCB后常见的连接遗漏问题。对于三相逆变器需要重点检查三个半桥的驱动信号网络、电流采样网络和母线电容网络。方案包里某些PCB文件因为软件版本差异打开时会缺封装库解决方法是在Altium里设置全局搜索路径把方案自带的.LibPcb文件目录加入到库列表中。3.3 电流采样电路与信号调理电流采样电路的精度直接决定FOC控制的电流环带宽和转矩控制精度。方案包里使用了两种采样方式低端采样电阻加差分放大器或者直接用集成电流传感器。分压电阻的温漂和放大器的失调电压是采样误差的主要来源工程上常在软件里做过零点标定// AddFunction.c中进行ADC零点校准 void ADC_Offset_Calibration(void) { uint32_t sum 0; uint8_t i; // 采集64次取平均降低随机噪声影响 for (i 0; i 64; i) { sum ADC_GetConversionValue(); } adc_offset sum 6; // 右移6位相当于除以64 // 存入Flash下次上电直接读取 Flash_WriteWord(ADDR_OFFSET_SAVE, adc_offset); }校准的核心逻辑是将PWM输出关闭、电机静止状态下采集ADC值作为零点。需要注意这个零点包括了运放的失调电压和ADC本身的偏移环境温度变化会影响这个值所以高精度应用会在每次启动时快速校准一次。校准之后在软件里电流环的比例积分调节器参数Kp和Ki需要根据实际采样到的电流值做换算换算系数是采样电阻阻值、运放放大倍数和ADC参考电压共同决定的。4. MotorControl.c核心代码工程结构解析4.1 FOC主循环的时序安排与控制周期设定FOC控制的性能上限由控制周期决定。方案包里MotorControl.c的主循环采用PWM周期中断触发的方式PWM载波频率即FOC控制频率。FU68xx系列的主频虽然不算高但因为坐标变换由硬件单元完成做到16kHz的FOC控制周期仍然留有余量。下面是主中断的代码结构// MotorControl.c中PWM中断服务函数 __interrupt void PWM_ISR(void) { // 1. 采集相电流和母线电压ADC已由硬件触发 Curr_Adc_Value[0] ADC_Result[0]; Curr_Adc_Value[1] ADC_Result[1]; Volt_Adc_Value ADC_Result[2]; // 2. 电流重构单电阻采样需要特殊处理 FOC_Current_Reconstruct(); // 3. 电流环PI控制d轴和q轴 Id_PI_Controller(); Iq_PI_Controller(); // 4. 逆Park变换得到alpha-beta轴电压 InvPark_Transform(ud, uq, theta, u_alpha, u_beta); // 5. SVPWM调制并更新PWM比较寄存器 SVPWM_Generate(u_alpha, u_beta); // 6. 位置观测器更新低速段可切换高频注入 if (speed LOW_SPEED_THRESHOLD) { HFI_Observer_Update(); } else { SMO_Update(i_alpha, i_beta, v_alpha, v_beta); } // 7. 速度环计算每N个PWM周期执行一次降频处理 if (speed_loop_cnt SPEED_LOOP_DIVIDER) { speed_loop_cnt 0; Speed_PI_Controller(); } }这个中断函数体现了FOC控制的完整链路从ADC采样到SVPWM输出所有环节都在一个PWM周期内完成时序上不能有任何阻塞操作。需要特别留意的是速度环的降频策略——电流环16kHz速度环通常降到2kHz就够了因为速度的机械时间常数比电气时间常数慢得多。FunctionAdd.c中主要负责启动逻辑、故障保护、通信交互等非实时任务。比如转速指令的来源可能是ADC采集的电位器电压也可能是UART接收的串口命令或者I2C总线上主控芯片的指令。4.2 电机启动流程与开环强拉策略无感FOC最难的是零速启动因为电机静止时没有反电动势SMO观测器完全失效。方案包的启动策略是分段式开环强拉在启动第一阶段施加一个固定的电压矢量让转子转起来。需要根据负载特性选择合适的强拉角度和升频步进如果负载是静止的压缩机转子可能处于任意位置还需要额外的初始位置定位逻辑。// MotorControl.c中启动状态机 typedef enum { START_POSITION_ALIGN, // 转子预定位 START_OPEN_LOOP, // 开环强拉 START_CLOSED_LOOP, // 切换闭环 MOTOR_RUNNING // 正常运行 } Motor_State_t; void Motor_Start_Process(void) { switch (motor_state) { case START_POSITION_ALIGN: // 施加恒定电压矢量把转子拉到已知位置 Set_Voltage_Vector(ALIGN_VOLTAGE, ALIGN_ANGLE, 0); if (align_time_ms ALIGN_TIME_MS) { motor_state START_OPEN_LOOP; ramp_angle ALIGN_ANGLE; } break; case START_OPEN_LOOP: // 开环强拉电压幅值随频率上升 ramp_freq FREQ_RAMP_STEP; // 每秒增加固定步长 ramp_angle ramp_freq * T_ISR * 2 * PI; // 电压幅值按比例加保持V/F曲线合理性 voltage_amp V_F_BASE ramp_freq * V_F_SLOPE; Set_Voltage_Vector(voltage_amp, ramp_angle, ramp_freq); // 检测转子是否跟上给定速度 if (fabsf(smo.speed - ramp_freq) SYNC_THRESHOLD) { motor_state START_CLOSED_LOOP; } break; case START_CLOSED_LOOP: // 切换闭环SMO角度替代开环给定角度 Theta_ClosedLoop_Start(); if (speed RUNNING_THRESHOLD) { motor_state MOTOR_RUNNING; } break; } }预定位与强拉启动是大多数无感FOC方案的标准策略但不同负载类型对启动参数的要求差异很大——压缩机启动时带高压制冷剂负载需要足够的启动转矩风机类负载启动阻力小更注重平滑性。方案包里每个应用项目的启动参数都单独调过这是参考项目之所以宝贵的核心原因——如果从同一份FOC例程自己改参数适配不同负载这个调参过程通常需要数周时间。4.3 速度闭环与弱磁控制的深度调优策略在无感FOC进入稳定运行后速度环PI参数成为影响动态响应特性的核心因素。速度环的输出限幅值很关键它决定了q轴电流的给定上限也就是电机的最大转矩输出。方案包里对不同负载类型的速度环动态响应差异做了区分设置电动工具类如电钻和角磨机要求带载不掉速速度环Kp需要调大风机类、泵类负载对转速波动要求宽松但对效率要求较高Kp则要设置得保守些。进入高速区反电动势接近母线电压时必须启动弱磁控制策略。常规FOC的q轴电压受限于母线电压若电机反电动势过高电流环将失去控制能力。弱磁控制的原理是通过注入负的d轴电流来削弱转子磁场的有效强度// MotorControl.c弱磁控制 float Field_Weakening_Control(float ud_ref, float uq_ref) { float udc_half udc * 0.5f; float u_max udc_half * SQRT3_INV; // SVPWM线性区最大电压 float u_ref sqrtf(ud_ref * ud_ref uq_ref * uq_ref); float id_weak 0.0f; // 实时计算电压利用率 if (u_ref u_max) { // 超过最大电压计算所需的去磁电流 id_weak - (u_ref - u_max) * WEAK_GAIN_KP; // 限制弱磁电流的范围 if (id_weak -ID_MAX) id_weak -ID_MAX; // 限制电压误差积分防止振荡 weak_integrator WEAK_GAIN_KI * (u_ref - u_max); if (weak_integrator WEAK_INT_LIMIT) weak_integrator WEAK_INT_LIMIT; id_weak - weak_integrator; } return id_weak; }调试时需观察u_q是否持续顶在饱和限幅值上如果电压指令经常饱和就说明弱磁介入过晚。但弱磁也不是万能的它会引起效率下降和过温风险所以方案包里吸尘器这种需要高转速的应用母线电压设计得比电机反电动势高出20%至30%来降低弱磁深度。5. 各应用场景方案适配与启动参数对照5.1 风机类负载与压缩机类负载的参数差异方案包里覆盖了低压风机FU6831L、落地扇FU6831、空气净化器FU6831等风机类项目以及空调压缩机FU6813P、冰箱压缩机FU6812S等压缩机类项目。电机设计的出发点是负载特性的分野风机属于平方转矩负载——转矩与转速的平方成正比低速时负载转矩很小启动容易压缩机属于恒转矩负载——启动瞬间需要克服密封腔内高低压差造成的堵转转矩。从参数表对比可以更直观地看到差异参数项落地扇FU6831空调压缩机FU6813P启动方式开环强拉预定位开环强拉启动电流限制0.8A3.5A强拉加速度0.5Hz/ms2.2Hz/ms启动完成转速300rpm450rpm电流环Kp初始值12002600弱磁启动转速1600rpm2100rpm堵转保护时间500ms1500ms母线电容10uF/400V20uF/400V这个对照表中最重要的启示是启动加速度的设置。落地扇的叶片惯性小、风阻低如果设置过大的强拉加速度电流冲击会超过刹车片点的承受能力压缩机启动时面对的则是制冷剂压差加速度太慢会导致启动时间过长系统可能误判为堵转。初次移植方案时强烈建议先按参考项目参数烧录运行再用示波器抓取电机相电流波形根据波形形态微调启动加速度和电流限幅值。5.2 电动工具类方案的高负载起动配置电钻FU6861Q和角磨机FU6812L是方案包里负载最恶劣的项目。这两类负载的共同特点是电机静止时负载可能处于卡死或半卡死状态启动瞬间要求输出最大转矩去克服静摩擦和负载惯性。因此方案包里采用的策略是带堵转检测的扭矩递增式启动。// AddFunction.c电钻堵转检测与电流限制 void Drill_Start_Control(void) { uint16_t iq_meas; uint16_t iq_limit 1200; // ADC原始值对应4A // 逐步增加电流限制每次增加一小步 if (drill_start_timer 50ms iq_measured iq_limit) { iq_limit 50; drill_start_timer 0; } // 检测堵转给定速度与实际速度偏差过大 if (fabsf(speed_ref - speed_feedback) 300rpm) { stall_counter; if (stall_counter 10) // 持续堵转50ms { Motor_Stop(); Stall_Flag_Set(); } } else { stall_counter 0; } }递增式电流限制的用意在于如果负载确实卡死电流缓慢上升不会导致MOS管瞬间过热如果电机只是惯性较大这种策略能在不触发过流保护的前提下让电机转起来。实际测试时要注意堵转保护的触发阈值——阈值太低在重载启动时容易误判阈值太高则失去保护意义。方案包里的参考值按应用电机功率标定移植时不能照抄需要实测自己的电机确认电流与转矩的对应关系。5.3 吸尘器方案的高速弱磁区间调试无感FOC吸尘器是一个特殊项目对转速上限要求近乎极致——10万转级别需要多极对电机配合高达数千Hz的电频率。这意味着FOC控制周期必须短到能覆盖这类高频信号的采集和计算所以吸尘器项目方案中PWM频率也设置得比普通应用更高。方案包里吸尘器项目分为单相无感FU6818Q和三相有感FU6861Q两种单相无感方案里加入了一个非常实用的技巧在弱磁区间动态调整电流环PI参数。因为电机在高速弱磁区运行时电气时间常数会发生变化固定PI参数可能导致电流环振荡。// 弱磁区动态PI参数调整逻辑 void FOC_CurrentLoop_PI_Tune(void) { static float kp_base 1500.0f; static float ki_base 0.85f; float kp_actual, ki_actual; float speed_ratio; // 以基速为基准超过基速后按比例增加PI增益 speed_ratio speed_fbk / BASE_SPEED; if (speed_ratio 1.0f) { kp_actual kp_base * (1.0f 0.3f * (speed_ratio - 1.0f)); ki_actual ki_base * (1.0f 0.2f * (speed_ratio - 1.0f)); } else { kp_actual kp_base; ki_actual ki_base; } PI_UpdateGains(pi_id, kp_actual, ki_actual); PI_UpdateGains(pi_iq, kp_actual, ki_actual); }这个动态调整策略的思路是高速时电气时间常数变小电感感抗增加同一电压产生的电流减小需要更高的PI增益来维持带宽。但增益不能无限增大否则高频噪声会被放大到电流环输出上表现为电机啸叫和异常发热。5.4 方波与正弦波方案的取舍决策依据方案包中除了FOC正弦波方案还包含无感方波角磨机FU6812L项目。需要理解方波与正弦波的本质区别和适用场景的边界。方波驱动是简单的六步换相法每个电周期只有六次开关切换电机相电流接近梯形波。它的优点是算法简单、不需要高分辨率的角度信息对MCU算力要求低缺点是在换相点附近的转矩脉动大运行噪声明显尤其低速段。正弦波FOC则是连续调制PWM电机电流是标准的正弦波转矩输出均匀。方案包同时包含两种方案工程上的选型逻辑是成本导向和性能导向的博弈电池供电的角磨机、电钻这类工具低速段的转矩表现是用户的核心体验指标——正弦波起步更平滑手感也更好所以即便成本更高也更推荐而交流供电的固定转速场景如大功率风机、水泵方波即可满足需求整个方案的成本和可靠性都是更优先的考量因素。6. 基于FU68xx方案包的进阶应用方法这套方案包除了直接照抄做产品之外还有几个可以深度挖掘的方向。结合我接触过的一些项目这里分享三个比较有价值的二次开发方法。6.1 用方案包参数反推电机本体参数方案包的调试记录里蕴含了大量可反推的电机参数信息。通过启动电流限幅值、母线电压和转速曲线能够估算电机的反电动势常数。结合额定电流和弱磁区的电压升高量可以推算电机的d轴电感Ld。具体做法是在程序中增加一段参数辨识代码电机空载运行到额定转速后突然注入一个d轴电压脉冲观察q轴电流的响应。d轴和q轴电流的变化率与电感和电阻直接相关。// 电机参数辨识逻辑在MotorControl.c中添加调试段 void Motor_Parameter_ID(void) { float di_dt; float ri_drop; float Ls_est; float Rs_est; // 注入阶跃电压记录电流变化斜率 Apply_D_Voltage_Pulse(step_voltage, 1ms); di_dt (i_d_after - i_d_before) / 0.001f; // 根据电压方程估算 // v_d Rs * i_d Ls * di_dt Rs_est step_voltage / i_d_steady; Ls_est (step_voltage - Rs_est * i_d_before) / di_dt; printf(Rs %.3f Ohm, Ls %.3f mH\n, Rs_est, Ls_est * 1000); }这种方法测出来的参数不影响FOC算法的运行精度但能为新电机的选型和匹配提供参考数据。做电机控制器开发时掌握电机的实际参数比依赖供应商提供的spec更能做出合理判断。6.2 在FU68xx上叠加自定义保护逻辑方案包自带的保护逻辑只覆盖过流、过压、欠压、堵转等基础项目实际产品往往需要更细化的保护定制。比如水泵的空转保护——水泵在无水状态下运行会因缺少液体散热而烧毁而功率-转速特性与正常带载状态有明显差异。可以用电流绝对值加持续时间来辨识空转状态。空转时电流是稳定的低位值正常抽水时电流有明显波动叶片掠过出口的周期性扰动。通过FFT分析或时域窗口内电流方差计算就能安全区分空转和正常带载。// AddFunction.c空转保护示例 void Pump_DryRun_Protection(void) { static uint16_t current_buffer[64]; static uint8_t idx 0; uint32_t sum 0; uint32_t variance 0; uint8_t i; // 环形缓冲区记录电流采样值 current_buffer[idx] current_feedback; if (idx 64) idx 0; // 求平均值和方差 for (i 0; i 64; i) sum current_buffer[i]; sum / 64; for (i 0; i 64; i) variance (current_buffer[i] - sum) * (current_buffer[i] - sum); variance / 64; // 平均电流低且方差小判定为空转 if (sum DRY_CURRENT_LOW variance DRY_VARIANCE_LOW) { dry_run_counter; if (dry_run_counter 500) // 持续1.25秒 { Motor_Stop(); Fault_Set(FAULT_DRY_RUN); } } else { dry_run_counter 0; } }峰值电流的统计功能也值得加入方便产品售后时远程诊断电机的健康状态——当电流峰值异常升高而转速下降时可能是负载端的机械问题比如轴承磨损、风扇叶片变形。6.3 快速定位问题的方法如果一套方案在自己的板子上出现启动失败或运行抖动应该优先排查ADC采样波形。用示波器的触发模式捕捉PWM中心点的采样窗口检查实际的相电流波形是否存在尖峰。绝大多数问题都出在采样时间点的选取上——PWM开关管切换后的几分钟内会有振铃采样点如果落在振铃区间ADC采集到的就包含了开关噪声。参考设计里给出的ADCSampleTime是最佳实践值但换了不同型号的功率MOS管后振铃持续的时间会变需要重新确认采样窗口是否安全。另一个排查重点是控制板的接地点。三相逆变器的采样电阻地是功率地MCU的模拟地是信号地两者之间用磁珠或零点欧姆电阻单点连接。如果layout时图省事直接铺铜连接FOC控制就会出现频率等于PWM基频的周期性电流纹波。这类问题不看PCB原文件很难定位到根因而方案包里的PCB参考文件恰好提供了正确的layout范例对照自己的板子逐项排查往往能在半小时内找到问题所在。本文还有配套的精品资源点击获取
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进