公司动态

BLDC控制中机械频率、电频率与PWM频率的区别与配置

📅 2026/9/1 1:54:34
BLDC控制中机械频率、电频率与PWM频率的区别与配置
这次我们来把 BLDC 电机控制里最容易搞混的三个频率概念一次讲透机械频率、电频率、PWM 频率。做无刷电机驱动时很多人一开始会卡在一个问题上电机的转速明明叫“机械频率”为什么做 FOC 或六步换相时算出来的“电频率”完全不一样PWM 频率又应该设成多少是不是转速越高 PWM 频率也要跟着变先给结论机械频率是转子转一圈的频率电频率等于机械频率乘以极对数而 PWM 频率是逆变器开关管的开关频率它和电机转速没有绑定关系。三者当中电频率决定换相节奏PWM 频率决定电压调制精度。这篇文章会从定义、公式推导、控制策略、STM32 定时器配置到一个完整的计算验证流程把三者关系说清楚并给出可以直接套用的配置思路和排查清单。1. 核心概念速览先建一张速查表方便后面对照。这张表没有针对特定芯片但数值范围是 BLDC 驱动里最常见的工程取值。概念单位物理含义来源常见范围机械频率Hz转子每秒旋转的圈数转速 n 除以 60几 Hz 到几百 Hz转速 nrpm转子每分钟旋转的圈数电机铭牌或测速数百到数万极对数 p无永磁体 N/S 极组成的磁极对数电机结构决定1 到 8 不等电频率Hz定子磁场换相/电流交变的频率机械频率乘以极对数0 到几千 Hz换相频率Hz六步换相中功率管每秒钟切换的次数6 倍电频率电频率 × 6PWM 频率Hz功率管开关的载波频率人为配置10 kHz 到 100 kHz注意这里有个关键差异机械频率和电频率都与电机转速正相关但 PWM 频率是你可以独立配置的参数。三者不能直接等同。2. 适用场景与使用边界这篇内容面向的读者很明确正在做 BLDC 方波控制或 FOC 的嵌入式工程师、正在用 STM32/英飞凌 MCU 写电机控制的开发者、被“机械频率和电频率换算”困扰的入门者。它能解决三类工程问题已知电机转速和极对数怎么算电频率从而确定换相定时器的更新频率。怎么选择 PWM 频率让电流纹波、开关损耗、采样点数三者平衡。在 STM32 的 TIM1、HRTIM 以及 PWM 触发 ADC 采样场景里频率参数应该怎么配置和验证。使用边界也要说清楚这里讨论的是永磁同步电机/无刷直流电机BLDC/PMSM异步电机存在转差频率公式不同。本文以工程应用为主不推导磁场数学模型的完整方程只给结论和计算路径。所有公式是基于理想电机模型的通用式实际电机因为齿槽效应、绕组不对称、反电动势谐波会存在偏差需要以实测波形为准。涉及电机驱动实验时要做好功率级保护防止堵转、过流、过压损坏驱动板或电机。3. 机械频率与电频率的定义和换算3.1 机械频率机械频率描述的是转子这个物理部件的旋转速度。假设电机转速为 n单位 rpm那么机械频率f_m n / 60单位是 Hz。比如电机额定转速 3000 rpm机械频率就是 50 Hz也就是转子每秒转 50 圈。在测速时增量编码器每转输出的脉冲数、霍尔传感器每转改变的 6 个状态都是基于机械角度来计算的。3.2 电频率电频率描述的是定子绕组中感应电动势和电流交变的频率它由转子磁极对数决定。永磁同步电机转子上一共有 p 对磁极即 2p 个磁极转子每转过一对磁极定子绕组中的磁场变化就完成一个完整周期。所以电频率f_e p × f_m p × n / 60举例6 极电机对应 p 3转速 3000 rpm 时电频率f_e 3 × 3000 / 60 150 Hz也就是说虽然转子一秒只转 50 圈但定子磁场和反电动势一秒交变 150 次。3.3 极对数与换相周期极对数 p 是理解机械频率和电频率关系的核心。看电机铭牌上的“极数”时要除以 2 才是 p。2 极电机p 1机械转一圈电角度走 360°电频率 机械频率。4 极电机p 2机械转一圈电角度走 720°电频率是机械频率的 2 倍。8 极电机p 4机械转一圈电角度走 1440°电频率是机械频率的 4 倍。六步换相控制中每个电周期有 6 个换相点所以换相频率是f_commutate 6 × f_e还是用 6 极电机、3000 rpm 来算f_e 150 Hz换相频率 900 Hz也就是说功率管每秒要切换 900 次换相状态。如果需要高性能就要保证 MCU 的中断处理能力跟得上这个频率。工程判断如果你的霍尔传感器或反电动势过零检测中断频率远高于 MCU 中断处理能力就要考虑降低最高转速、增大极对数会加剧这种情况或者换更高主频的 MCU。3.4 计算示例用 Python 写一个快速换算脚本方便在实际调试中直接改参数def bldc_frequency_calc(rpm, pole_pairs): 计算 BLDC 的机械频率、电频率和六步换相频率。 rpm: 转速单位转每分钟 pole_pairs: 极对数 f_m rpm / 60.0 f_e f_m * pole_pairs f_comm 6.0 * f_e return { rpm: rpm, pole_pairs: pole_pairs, mechanical_hz: f_m, electrical_hz: f_e, commutation_hz: f_comm, electrical_period_us: 1e6 / f_e, commutation_period_us: 1e6 / f_comm, } if __name__ __main__: result bldc_frequency_calc(rpm3000, pole_pairs3) for key, value in result.items(): print(f{key:20s}: {value:.3f})输出rpm : 3000.000 pole_pairs : 3.000 mechanical_hz : 50.000 electrical_hz : 150.000 commutation_hz : 900.000 electrical_period_us: 6666.667 commutation_period_us: 1111.111这段脚本对做无感方波控制特别有用可以根据估算转速快速算出每个换相周期的时间配合定时器做换相延时或者判断反电动势过零检测窗口是否合理。4. PWM 频率的角色与选择4.1 PWM 在 BLDC 驱动中到底做什么电频率决定了什么时候该换相但真正把母线电压转成电机相电压平均值的是 PWM。BLDC 三相全桥逆变器通过上下桥臂功率管的开关把直流母线电压“斩”成等效的交流电压。PWM 频率就是功率管每秒开关的次数。PWM 频率越高电压波形越接近理想正弦电流纹波越小但开关损耗也越大PWM 频率越低开关损耗低但电流纹波大电机噪声也大。4.2 PWM 频率与电频率的关系PWM 频率和电频率不要求成整数倍关系但 PWM 频率必须远高于电频率才能在一个电周期内对电压进行足够多次调制。工程上常用一个指标叫“一个电周期内的 PWM 周期数”N f_pwm / f_e这个 N 越大控制的“分辨率”越高。举个例子6 极电机3000 rpmf_e 150 Hz。PWM 频率 20 kHzN 20000 / 150 ≈ 133 个 PWM 周期。如果电机转速拉到 12000 rpmf_e 600 HzN ≈ 33 个 PWM 周期。从 133 降到 33每个电周期内的 PWM 周期数大幅减少电流纹波和波形畸变会更明显。这时就要考虑提高 PWM 频率或优化算法。4.3 选择 PWM 频率的工程边界实际选 PWM 频率主要看四个维度开关损耗IGBT 通常工作在 10 kHz 以下更稳妥MOSFET 可以到 20 kHz 甚至更高。PWM 频率越高开关损耗越大驱动器和散热设计压力越大。电流纹波PWM 频率越高电感电流纹波越小相电流越平滑。噪声超过 20 kHz 后人耳感知的电机噪音会明显降低。这也是很多驱动器把 PWM 默认设在 20 kHz 左右的原因。ADC 采样窗口如果采用 PWM 触发 ADC 采样PWM 频率还决定了 ADC 的采样机会。PWM 频率越高同一时间内采样点越多电流重构越准确但 ADC 中断处理压力也越大。4.4 为什么 PWM 频率不等于电频率这是刚接触 BLDC 的人最容易问的问题。PWM 是“调制工具”它只是一个高频载波本身不携带电机转向和转速信息。电机转速由电频率决定也就是换相的快慢决定。换个说法电频率决定旋转磁场的角速度。PWM 频率决定这个旋转磁场波形被“切碎”的精细程度。两者不是一个层面的东西。即使 PWM 频率固定为 20 kHz电频率从 10 Hz 变到 500 Hz电机转速照样跟着电频率走。PWM 只是实现电压调节的手段。5. 三种频率在控制策略中的体现5.1 六步换相方波控制六步换相也叫梯形波控制是最经典的 BLDC 控制方式。它的特点是每个时刻只有两相导通第三相悬空或用于反电动势检测。在这种控制策略下电频率直接决定换相时序。每个电周期对应 6 个换相状态每个状态持续 60° 电角度。所以换相定时器的更新周期由电频率决定与 PWM 频率无关。工程中常见的做法是用霍尔传感器或反电动势过零检测得到转子位置。在过零事件触发后延时“30° 电角度”到达换相点。延时时间 电频率对应的周期 / 12。PWM 在这里的作用只是调节导通相的电压占空比实现调速。很多简单 BLDC 驱动就是把 PWM 占空比和换相状态组合在一起输出到三相全桥。5.2 FOC 控制FOC磁场定向控制中电频率直接参与 Park 变换和反 Park 变换的角度计算。转子位置通过编码器或观测器获得电角度 机械角度 × 极对数。FOC 里有个关键点角度计算要在一个完整的电气周期内从 0 到 2π 周期性递增。如果机械角度来自编码器则theta_e theta_m × p在代码中表现为float theta_e theta_m * (float)pole_pairs;其中 theta_m 是机械角度范围 0~2π。这个公式是 FOC 中电频率和机械频率关系的直接体现。FOC 的电流环通常会在每个 PWM 周期执行一次 PID 计算因此 PWM 频率直接决定电流环带宽。PWM 频率越高电流环可以做越高的采样率但 MCU 负载也随之上升。5.3 无感控制中的频率关系无感 BLDC 常见做法是检测悬空相的反电动势过零点用这个时间点推算换相时刻。反电动势的频率就是电频率。转速越高电频率越高反电动势在一个换相周期内变化越快。这要求 MCU 能在足够的精度内捕捉过零事件否则会换相超前或滞后。这里特别要注意PWM 开关会产生共模噪声叠加到反电动势检测信号上。所以无感方波控制通常会把检测点安排在 PWM 的特定相位比如中心对齐计数为零的时刻或者通过“PWM 触发 ADC 采样”的方式避开开关噪声。这也是热词里“pwm 触发 adc 采样”在 BLDC 驱动中的实际用途。6. STM32 实现中的 PWM 配置思路6.1 定时器 PWM 生成以 STM32F103C8T6 为例TIM1 是高级定时器可以输出带死区的互补 PWM非常适合驱动三相全桥。PWM 频率的计算公式PWM 频率 定时器时钟 / ((PSC 1) × (ARR 1))如果定时器时钟为 72 MHz想得到 20 kHz PWM可以配置 PSC 0ARR 359972000000 / (1 × 3600) 20000 Hz基于 STM32CubeMX 和 HAL 库的初始化核心代码如下TIM_HandleTypeDef htim1; TIM_OC_InitTypeDef sConfigOC; TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig; void MX_TIM1_PWM_Init(void) { htim1.Instance TIM1; htim1.Init.Prescaler 0; // PSC 0 htim1.Init.CounterMode TIM_COUNTERMODE_CENTER; // 中心对齐 htim1.Init.Period 3599; // ARR htim1.Init.ClockDivision TIM_CLOCKDIVISION_DIV1; htim1.Init.RepetitionCounter 0; htim1.Init.AutoReloadPreload TIM_AUTORELOAD_PRELOAD_ENABLE; HAL_TIM_PWM_Init(htim1); sConfigOC.OCMode TIM_OCMODE_PWM1; sConfigOC.Pulse 0; // 占空比初值 sConfigOC.OCPolarity TIM_OCPOLARITY_HIGH; sConfigOC.OCNPolarity TIM_OCNPOLARITY_HIGH; sConfigOC.OCFastMode TIM_OCFAST_DISABLE; sConfigOC.OCIdleState 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); sBreakDeadTimeConfig.OffStateRunMode TIM_OSSR_DISABLE; sBreakDeadTimeConfig.OffStateIDLEMode TIM_OSSI_DISABLE; sBreakDeadTimeConfig.LockLevel TIM_LOCKLEVEL_OFF; sBreakDeadTimeConfig.DeadTime 100; // 死区时间配置具体值按驱动器和功率管调整 sBreakDeadTimeConfig.BreakState TIM_BREAK_ENABLE; sBreakDeadTimeConfig.BreakPolarity TIM_BREAKPOLARITY_HIGH; sBreakDeadTimeConfig.BreakFilter 0; sBreakDeadTimeConfig.AutomaticOutput TIM_AUTOMATICOUTPUT_ENABLE; HAL_TIMEx_ConfigBreakDeadTime(htim1, sBreakDeadTimeConfig); 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_TIM_SET_COMPARE(htim1, TIM_CHANNEL_1, duty_cycle);需要说明的是死区时间设置没有通用值必须根据功率管栅极电荷和驱动器特性计算过大的死区会增加波形畸变过小会直通短路。首次上电建议先用很保守的大死区做测试。6.2 PWM 触发 ADC 采样热词里“pwm 触发 adc 采样”是 BLDC 驱动中一个很关键的细节。目的有两个避开 PWM 开关瞬间的振荡和噪声。使采样点相对 PWM 周期固定保证电流重构相位一致。在 STM32 中可以通过 TIM1 的触发输出TRGO连接 ADC 的外部触发。配置思路TIM1 选择更新事件或 OCx 事件作为 TRGO。ADC 选择对应的外部触发源。触发时刻可以设在定时器从 0 开始计数的边沿即 PWM 周期起始点。以下是基于 HAL 的简化配置具体参数需要按芯片型号调整ADC_HandleTypeDef hadc1; ADC_ChannelConfTypeDef sConfig {0}; void MX_ADC1_Init(void) { hadc1.Instance ADC1; hadc1.Init.ScanConvMode ADC_SCAN_DISABLE; hadc1.Init.ContinuousConvMode DISABLE; // 由 PWM 触发 hadc1.Init.DiscontinuousConvMode DISABLE; hadc1.Init.ExternalTrigConv ADC_EXTERNALTRIGCONV_T1_TRGO; hadc1.Init.DataAlign ADC_DATAALIGN_RIGHT; hadc1.Init.NbrOfConversion 1; HAL_ADC_Init(hadc1); sConfig.Channel ADC_CHANNEL_0; sConfig.Rank ADC_REGULAR_RANK_1; sConfig.SamplingTime ADC_SAMPLETIME_239CYCLES_5; HAL_ADC_ConfigChannel(hadc1, sConfig); }实际调试中需要把采样时刻和 PWM 开关边沿拉开一点距离。中心对齐模式里PWM 更新时刻通常在计数值达到 ARR 或 0 的时刻ADC 采样建议放在计数值接近中点但避开边沿的位置。6.3 HRTIM 与高分辨率 PWMSTM32F334 的高分辨率定时器 HRTIM 是另一个经常被提到的方向。它适合需要更高时间分辨率的电机控制场景比如高频 PWM、高频电流环、PFC 或数字电源。HRTIM 的优势在于定时器时钟可达 144 MHz 甚至更高PWM 周期分辨率更快。支持多个定时器单元适合三相逆变器的复杂波形生成。可以直接配置互补输出、死区、相位偏移、触发 ADC。如果你在 STM32CubeMX 里用 HRTIM 输出一对互补 PWM配置步骤会比 TIM1 复杂一些但基本思路相同先确定频率和占空比再配死区然后选择触发事件输出到 ADC。适合对开关频率有更高要求的场景。6.4 CCU6 与软件 PWM热词里还出现了“ccu6 pwm”这是英飞凌 AURIX/XC2000 系列 MCU 的比较捕获单元功能类似 STM32 的高级定时器支持三相 PWM 输出、死区产生和 ADC 同步触发。设计思路一样只是寄存器名称和配置工具不同。“软件 PWM”则适合低成本的简单控制比如舵机控制、风扇调速。软件 PWM 用 GPIO 翻转模拟 PWM频率不能太高MCU 负担大不适合三相 BLDC 连续调制。在 BLDC 实验里软件 PWM 通常只用于低速测试或教学验证不建议用于正式驱动。7. 频率设计与验证流程7.1 第一步确定电机参数先拿到电机的极对数和额定转速。多数电机铭牌会写极数比如“8 极”则 p 4。如果没有铭牌可以用测转速的方式反推拖到已知转速测反电动势频率再反推极对数。7.2 第二步计算电频率和换相频率用第三节的公式f_e n × p / 60 f_commutate 6 × f_e这一步决定换相定时器、位置中断的处理速度要求。7.3 第三步选择 PWM 频率根据驱动功率管类型、散热条件、噪音要求和 MCU 能力在 10 kHz 到 100 kHz 之间选。入门建议从 20 kHz 开始这是多数 BLDC 驱动器的常见工作点。7.4 第四步仿真验证有条件的话先搭仿真模型再上实机。MATLAB/Simulink 中可以用 PMSM 模型验证不同 PWM 频率下的电流波形质量。模型里设置的参数就是第三步选的 PWM 频率和极对数。仿真时注意观察相电流纹波是否在可接受范围。一个电周期内有几个 PWM 周期。换相点时刻是否正确。不同 PWM 频率下电流 THD 变化。7.5 第五步实机测量实机测试时重点抓几个信号相电流波形用电流探头看 PWM 频率是否过低导致明显纹波。反电动势波形确认电频率是否和理论计算一致。换相点逻辑分析仪看霍尔信号或换相 PWM 状态切换时序。相电压波形看 PWM 周期数和死区是否正常。一个常见排查流程是电机能转但电流噪声大先降低 PWM 频率观察纹波变化同时测量功率管温度判断开关损耗。8. 常见问题与排查方法问题现象可能原因排查方式解决方案电机转速不准电频率参数计算错误用示波器测反电动势频率核对极对数和额定转速重算 f_e换相噪声大PWM 频率偏低测相电流纹波提高 PWM 频率或增加相电感功率管过热PWM 频率过高开关损耗大测功率管壳温适当降低 PWM 频率或增大散热电机堵转启动时序不对电频率跟踪失败检查启动阶段的换相逻辑优化开环启动到闭环切换条件电流采样不准ADC 采样点靠近 PWM 开关沿用示波器看采样时间点调整 PWM 触发 ADC 的相位无感控制中反电动势检测失败PWM 噪声叠加到反电动势信号检查检测窗口时序把检测点放到 PWM 中心对齐时刻或加入滤波霍尔信号跳变抖动机械安装位置不准或霍尔信号未滤波逻辑分析仪抓霍尔边沿增加软件消抖或重新定位霍尔传感器FOC 角度跳变极对数配置错误低速旋转时打印电角度确认 p 值计算是否正确PWM 启动后无输出高级定时器主输出未使能检查 MOE 位调用 HAL_TIMEx_PWMN_Start 并确认 BRK 引脚状态死区过大导致波形畸变死区时间配置过长观察互补 PWM 波形按功率管要求调整死区9. 最佳实践与使用建议做 BLDC 频率设计和调试时下面这些建议可以直接落地。先在草稿纸上手算一遍机械频率、电频率、换相频率。调试时遇到异常回到这三个数去排查比盲目调参数快很多。板子第一次上电Duty 从 0 开始慢慢加。不要一上来就给大占空比电机起动电流冲击很容易烧驱动板。PWM 频率尽量定一个固定值不要随转速调节。改变 PWM 频率意味着 ADC 采样频率、电流环执行频率都会变除非有明确需要否则保持恒定能减少变量。使用 PWM 触发 ADC 采样时先用示波器确认采样点与 PWM 开关边沿的间隔。采样点离得太近采到的电流会带上开关噪声尖峰。死区时间要用示波器实测。不同电压等级、不同功率管死区取值差异很大不能照抄别人的配置。速率变换器最好把机械频率、电频率、PWM 频率三个变量打印在调试界面上方便快速定位问题。无感控制中电频率越高反电动势过零检测窗口越窄。如果高转速下换相失败优先关注 PWM 触发 ADC 的采样窗口而不是盲目调 PID。版权和合规方面如果是驱动别人设计的电机或驱动板要确认硬件原理图和授权范围涉及产品量产时频率参数要以实测和认证为准。10. 总结与下一步BLDC 控制里的三个频率本质上是一个物理量在不同层面的映射机械频率转子每秒转几圈。电频率磁场每秒交变几次由机械频率乘以极对数得到。PWM 频率功率管每秒开关几次是人可配置的工作参数。这篇文章从定义出发把三者关系和工程选择讲清楚了。接下来建议你先做两件事拿手头电机用第七节的 Python 脚本算一遍机械频率、电频率、换相频率确认和示波器实测一致。在 STM32 的 TIM1 上把 PWM 频率配到 20 kHz用 PWM 触发 ADC 采样验证电流波形再把结果和仿真对比。最容易踩的坑是电频率和 PWM 频率混为一谈。记住电频率决定了电机“转多快”PWM 频率决定了“调制得多精细”。把这两条理清后面做 FOC、无感控制、新硬件移植都会顺很多。