面灵AI→

联合汽车电子嵌入式软件一面:FOC 时序、死区补偿与 FreeRTOS

轮次
一面
时间
2026-10
来源
牛客网

《面试题目》

  1. 电驱项目里电流环和速度环一般怎么分层?各层周期怎么定,接口怎么切?
  2. FOC 里为什么常把三相电流采样点卡在 PWM 中点附近?采样时机偏了会出现什么现象?
  3. 永磁同步电机怎么从编码器原始计数得到电角度?磁极对数起什么作用?
  4. SVPWM 为什么要加死区?死区会带来哪些电流畸变,软件上怎么补?
  5. 电机控制里 PWM 更新、ADC 完成、电流环计算,这三者的时序和优先级通常怎么排?
  6. FreeRTOS 里时间片轮转和抢占式优先级调度差在哪?Tick 中断里发生了什么,才可能让更高优先级任务马上跑起来?
  7. 为什么低优先级任务有时会比高优先级任务先跑?优先级反转怎么用互斥量协议缓解?

《参考解析》

环路分层与周期。 电流环贴近功率级,放在 PWM 周期中断或最高优先级任务里,典型周期是 PWM 周期(几十到一百微秒);速度/位置环在毫秒级,由电流环输出的转矩电流指令驱动。模块切分按信号流:采样与坐标变换(Clarke/Park)、电流调节器与反变换、SVPWM 与死区、观测器/编码器解算、速度环与限幅保护。接口要用结构化量(电角度、Id/Iq 反馈与指令、母线电压、故障位图),禁止上层直接改底层寄存器。周期由物理时间常数决定:电流环要远快于电气动态(通常带宽 1~2 kHz),速度环要覆盖机械惯性,且与任务调度、CAN 指令更新周期兼容。限幅、弱磁、过流保护应靠近电流环出口,避免上层算完被底层「悄悄削掉」导致环路失配。标定参数(Kp/Ki、电流限幅、死区补偿)集中到一张表,运行时只读。

为什么在 PWM 中点采样。 中心对齐 PWM 下,中点附近上下管占空相对稳定,相电流接近平均值;开关边沿附近有尖峰、振铃和二极管反向恢复,采样窗贴边会采到噪声,表现为 Iq 抖动、噪声啸叫、低速转矩波动。低占空或高占空时有效采样窗口变窄,需要最小脉宽限制,或改用两电阻重构、单电阻移相采样。工程上用定时器比较通道触发 ADC,与 PWM 中心对齐;必要时加采样延迟补偿,抵消 ADC 转换与 DMA 完成的相位滞后。只采两相时第三相由基尔霍夫求出,中性点漂移或漏电流大会引入误差,需要一致性校验。调试时用示波器同时看 PWM 与 ADC TRIG,确认触发落在平坦区。

编码器到电角度。 机械角由计数换算:θ_m = 2π × count / CPR(CPR 是考虑四倍频后的每转有效脉冲数);电角度 θ_e = p × θ_m,p 是极对数。FOC 的 Park/逆 Park 必须用电角度,用错极对数会失步或堵转发热。上电要找零:对齐索引脉冲(Z 信号)、强制拖到已知相位、或用高频注入/开环起动后再锁相,把机械零点映射到电角度零点。还要处理计数溢出、方向位、滤波与丢脉冲检测,否则高速时角度跳变会直接打坏电流环。用绝对式磁编码器(SPI/SSI)也要做安装偏置标定,并校验 CRC/超时,超时切安全力矩或停机。分辨率不足表现为低速转矩纹波,可结合观测器或插补,但要在带宽与噪声之间折中。

死区与补偿。 上下管不能同时导通,死区防止桥臂直通;硬件死区由定时器 BDTR 或栅极驱动产生。死区使实际电压矢量相对指令缩短或偏移,表现为零电流附近交叉畸变、低速转矩波动、谐波增大。补偿思路:按相电流极性判断续流二极管方向,把丢失的伏秒积加回占空比;电流过零附近要做死区或渐变,避免补偿方向抖振。补偿量与母线电压、死区时间、器件压降有关,常做成随 Vbus 缩放的表。死区过大安全但效率与线性度变差,过小在温升与器件离散下有直通风险,要按最坏传播延迟留裕量。验证看相电流 THD、低速转矩波动、以及补偿前后的温升对比。

PWM/ADC/电流环的时序。 典型链路:PWM 周期事件触发采样 → ADC/DMA 完成进中断 → 电流环计算 → 写下一周期比较寄存器(影子寄存器,下周期生效)。电流环 ISR 优先级应高于通信与日志,但要短;重计算可以拆到高优先级任务,ISR 只做采样交付与寄存器更新。若 ADC 完成晚于允许的计算窗口,会出现「算完赶不上本次更新」,表现为一拍延迟,需要降算法复杂度或提高主频/优化浮点。写比较值必须在更新事件前完成,并确认中心对齐模式下的加载点;错半拍会引入相位滞后,降低环路相位裕度。与 RTOS 共存时,关中断临界区要极短;用 GPIO 翻转或 trace 量 ISR 最坏执行时间,留足余量。

FreeRTOS 调度与 Tick。 抢占式优先级调度:就绪队列里永远跑当前最高优先级任务,同优先级才可能时间片轮转;时间片只解决同优先级的公平性,不同优先级之间仍是严格优先级。SysTick(或 tickless 补偿后的 tick)里处理延时到期、定时器回调、更新就绪位图;如果发现更高优先级就绪,置切换标志。真正的上下文切换发生在退出中断时的 PendSV:保存当前任务栈、恢复目标任务栈,保证中断尾部切换的原子性。任务调用 xQueueSend/vTaskDelay 等 API 也可能在退出临界区后触发调度,不必等下一个 tick;中断里要用 FromISR 接口并正确传出 pxHigherPriorityTaskWoken,否则会出现「信号已发但任务晚一拍」。

优先级反转与优先级继承。 高优先级任务在等一个被低优先级任务持有的互斥量,而中优先级任务抢占了持锁者,导致高优先级被间接阻塞,看起来像低优先级先跑。优先级继承:持锁任务临时提升到等待者中的最高优先级,放锁后恢复;FreeRTOS 的 Mutex 默认支持优先级继承(xSemaphoreCreateMutex),二值信号量不支持。优先级天花板是另一种解法:把锁的优先级设为其所有使用者的最高优先级。还要注意:中断里不能拿 Mutex(会阻塞),用临界区或 FromISR 版本;以及避免在持锁期间做长耗时操作,否则继承也救不了。