MCPWM 操作器:组装输出级
操作器位于定时器与生成器之间,管理比较器、生成器动作、制动、死区路由和载波调制。一个定时器可驱动同组的多个操作器,而一个操作器只连接一个定时器。
如果把定时器看成时钟源,操作器就是一套输出级的资源容器。它让多个输出共享同一时间基准,同时把保护、死区和载波这类功率级特性收拢到一个地方管理。
连接基本模块
操作器必须与定时器在同一组。先通过 mcpwm_operator_connect_timer() 创建并连接操作器;连接前,生成器不能使用定时器事件。
mcpwm_oper_handle_t oper = NULL;
mcpwm_operator_config_t oper_config = {
.group_id = 0,
.flags.update_gen_action_on_tez = true,
.flags.update_dead_time_on_tez = true,
};
ESP_ERROR_CHECK(mcpwm_new_operator(&oper_config, &oper));
ESP_ERROR_CHECK(mcpwm_operator_connect_timer(oper, timer));
操作器配置很小,但有两个字段没有出现在示例中:
group_id— 操作器从哪个 MCPWM 组分配。它必须与定时器所在组一致,因为操作器只能连接同组内的定时器。intr_priority— 制动事件回调使用的中断优先级。不设置(0)时由驱动选择较低优先级;当制动通知需要抢占其他中断时可适当提高。
flags 用于选择新的生成器动作和死区配置在何时生效。默认全部关闭,改动会立即生效——可能在 PWM 周期中间:
update_gen_action_on_tez、update_gen_action_on_tep和update_gen_action_on_sync— 将生成器动作的改动缓冲到计数归零、峰值或同步事件时。update_dead_time_on_tez、update_dead_time_on_tep和update_dead_time_on_sync— 死区改动同样缓冲,更新点规则见 死区。
对于运行中的功率级,应使用归零(tez)、峰值(tep)或同步点更新,以避免部分周期。
一个定时器,多个操作器
同一定时器可驱动多个操作器,每个操作器产生不同的波形。这适用于多相逆变器或多个同频但独立占空比的电机。
反过来,一个操作器只能连接一个定时器,因此该操作器下的所有比较器和生成器天然共享同一时间基准。这正是同相、互补或成对输出容易实现的原因。
mcpwm_oper_handle_t oper_b = NULL;
mcpwm_operator_config_t oper_config_b = {
.group_id = 0,
.flags.update_gen_action_on_tez = true,
};
ESP_ERROR_CHECK(mcpwm_new_operator(&oper_config_b, &oper_b));
ESP_ERROR_CHECK(mcpwm_operator_connect_timer(oper_b, timer));
// 在 oper_b 下创建独立的比较器和生成器。
制动与安全输出
操作器将 故障 转换为制动动作。应在启动 PWM 前配置生成器的制动状态,使故障路径完全由硬件驱动,避免软件延迟。
恢复策略
CBC(逐周期): 故障有效期间制动,并在配置的定时器归零或峰值处恢复,适合瞬态限流。
OST(单次): 故障消失后仍保持制动,必须由软件显式恢复,适合互锁或严重过流。
对于 CBC,设置 cbc_recover_on_tez 或 cbc_recover_on_tep,选择已清除故障后释放输出的边界。在边界恢复可避免在 PWM 周期中间重新导通开关。
警告
不要同时启用 cbc_recover_on_tez 和 cbc_recover_on_tep;应选择与波形和栅极驱动时序相匹配的边界。
故障连接
将故障连接到操作器,然后为每个生成器指定制动模式下的状态。此例在两个计数方向将原始生成器置低,使用 OST 制动:
ESP_ERROR_CHECK(mcpwm_operator_set_brake_on_fault(oper,
&(mcpwm_brake_config_t) {
.fault = fault,
.brake_mode = MCPWM_OPER_BRAKE_MODE_OST,
}));
ESP_ERROR_CHECK(mcpwm_generator_set_action_on_brake_event(
generator, MCPWM_GEN_BRAKE_EVENT_ACTION(
MCPWM_TIMER_DIRECTION_UP, MCPWM_OPER_BRAKE_MODE_OST,
MCPWM_GEN_ACTION_LOW)));
ESP_ERROR_CHECK(mcpwm_generator_set_action_on_brake_event(
generator, MCPWM_GEN_BRAKE_EVENT_ACTION(
MCPWM_TIMER_DIRECTION_DOWN, MCPWM_OPER_BRAKE_MODE_OST,
MCPWM_GEN_ACTION_LOW)));
半桥必须为两个生成器都配置相同的制动动作。逻辑低电平可能被死区、GPIO 矩阵或外部电路反相,因此应在栅极驱动器处确认实际安全状态。
生成器级故障动作与操作器制动的区别在于:前者适合单个输出的即时边沿响应,后者负责整个输出级的安全状态、锁存行为和恢复策略。主保护路径通常应优先使用操作器制动。
OST 故障恢复
CBC 在故障消失后在配置的边界自动恢复。OST 恢复前,先移除并确认故障根因已经消失,然后调用:
ESP_ERROR_CHECK(mcpwm_operator_recover_from_fault(oper, fault));
故障仍有效时该调用会失败。
CBC 仅在故障有效期间制动,并在下一个周期边界恢复;OST 保持锁存直至软件恢复。
制动事件回调
操作器可通过 on_brake_cbc 和 on_brake_ost 回调报告制动事件。二者均在 ISR 上下文运行,只应用于通知,不应用于阻塞式恢复。
mcpwm_operator_event_callbacks_t cbs = {
.on_brake_cbc = my_brake_cbc_cb,
.on_brake_ost = my_brake_ost_cb,
};
ESP_ERROR_CHECK(mcpwm_operator_register_event_callbacks(oper, &cbs, NULL));
载波调制
载波调制在操作器的 PWM 输出上叠加高频载波,常用于变压器隔离式栅极驱动:即使基础 PWM 保持 100% 占空比,调制后仍有可穿过隔离栅的跳变。应先完成基础 PWM 的配置;载波设置影响此操作器的所有生成器。
载波配置
mcpwm_carrier_config_t carrier = {
.clk_src = MCPWM_CARRIER_CLK_SRC_DEFAULT,
.frequency_hz = 100000,
.duty_cycle = 0.5f,
.first_pulse_duration_us = 20,
};
ESP_ERROR_CHECK(mcpwm_operator_apply_carrier(oper, &carrier));
100 kHz 载波与 50% 占空比基础 PWM 做与操作。首个脉冲被拉伸到 20 us(两个载波周期);基础 PWM 为低电平时不做斩波。
载波参数
clk_src选择载波时钟源。默认指向一个内部 PLL 时钟(如 PLL_F160M),部分芯片还提供 RC_FAST 或 XTAL 作为备选。不同时钟源的分辨率与功耗不同;默认时钟源即可满足大多数应用,仅在需要避开某个时钟引入的噪声、PLL 精度不够,或对功耗有要求时,才需要手动指定。frequency_hz是载波频率;应选择同时满足隔离变压器、栅极驱动器、开关损耗预算和目标芯片时钟分辨率的值。duty_cycle只能取硬件支持的 0.125、0.25、0.375、0.5、0.625、0.75 或 0.875,而非任意比例。first_pulse_duration_us控制调制开始后的首个脉冲。它必须非零,且至少为一个载波周期。较长的首脉冲可帮助在感性隔离路径中建立电流,但必须保持在栅极驱动系统允许范围内。invert_before_modulate改变原始 PWM 极性,invert_after_modulate改变调制后极性。
不需要载波调制时,向 mcpwm_operator_apply_carrier() 传入 NULL 配置即可禁用。
API 参考
MCPWM 操作器驱动函数
Header File
This header file can be included with:
#include "driver/mcpwm_oper.h"
This header file is a part of the API provided by the
esp_driver_mcpwmcomponent. To declare that your component depends onesp_driver_mcpwm, add the following to your CMakeLists.txt:REQUIRES esp_driver_mcpwm
or
PRIV_REQUIRES esp_driver_mcpwm
Functions
-
esp_err_t mcpwm_new_operator(const mcpwm_operator_config_t *config, mcpwm_oper_handle_t *ret_oper)
Create MCPWM operator.
- 参数:
config -- [in] MCPWM operator configuration
ret_oper -- [out] Returned MCPWM operator handle
- 返回:
ESP_OK: Create MCPWM operator successfully
ESP_ERR_INVALID_ARG: Create MCPWM operator failed because of invalid argument
ESP_ERR_NO_MEM: Create MCPWM operator failed because out of memory
ESP_ERR_NOT_FOUND: Create MCPWM operator failed because can't find free resource
ESP_FAIL: Create MCPWM operator failed because of other error
-
esp_err_t mcpwm_del_operator(mcpwm_oper_handle_t oper)
Delete MCPWM operator.
- 参数:
oper -- [in] MCPWM operator, allocated by
mcpwm_new_operator()- 返回:
ESP_OK: Delete MCPWM operator successfully
ESP_ERR_INVALID_ARG: Delete MCPWM operator failed because of invalid argument
ESP_FAIL: Delete MCPWM operator failed because of other error
-
esp_err_t mcpwm_operator_connect_timer(mcpwm_oper_handle_t oper, mcpwm_timer_handle_t timer)
Connect MCPWM operator and timer, so that the operator can be driven by the timer.
- 参数:
oper -- [in] MCPWM operator handle, allocated by
mcpwm_new_operator()timer -- [in] MCPWM timer handle, allocated by
mcpwm_new_timer()
- 返回:
ESP_OK: Connect MCPWM operator and timer successfully
ESP_ERR_INVALID_ARG: Connect MCPWM operator and timer failed because of invalid argument
ESP_FAIL: Connect MCPWM operator and timer failed because of other error
-
esp_err_t mcpwm_operator_set_brake_on_fault(mcpwm_oper_handle_t oper, const mcpwm_brake_config_t *config)
Set brake method for MCPWM operator.
- 参数:
oper -- [in] MCPWM operator, allocated by
mcpwm_new_operator()config -- [in] MCPWM brake configuration
- 返回:
ESP_OK: Set trip for operator successfully
ESP_ERR_INVALID_ARG: Set trip for operator failed because of invalid argument
ESP_FAIL: Set trip for operator failed because of other error
-
esp_err_t mcpwm_operator_recover_from_fault(mcpwm_oper_handle_t oper, mcpwm_fault_handle_t fault)
Try to make the operator recover from fault.
备注
To recover from fault or escape from trip, you make sure the fault signal has disappeared already. Otherwise the recovery can't succeed.
- 参数:
oper -- [in] MCPWM operator, allocated by
mcpwm_new_operator()fault -- [in] MCPWM fault handle
- 返回:
ESP_OK: Recover from fault successfully
ESP_ERR_INVALID_ARG: Recover from fault failed because of invalid argument
ESP_ERR_INVALID_STATE: Recover from fault failed because the fault source is still active
ESP_FAIL: Recover from fault failed because of other error
-
esp_err_t mcpwm_operator_register_event_callbacks(mcpwm_oper_handle_t oper, const mcpwm_operator_event_callbacks_t *cbs, void *user_data)
Set event callbacks for MCPWM operator.
备注
User can deregister a previously registered callback by calling this function and setting the callback member in the
cbsstructure to NULL.- 参数:
oper -- [in] MCPWM operator handle, allocated by
mcpwm_new_operator()cbs -- [in] Group of callback functions
user_data -- [in] User data, which will be passed to callback functions directly
- 返回:
ESP_OK: Set event callbacks successfully
ESP_ERR_INVALID_ARG: Set event callbacks failed because of invalid argument
ESP_FAIL: Set event callbacks failed because of other error
-
esp_err_t mcpwm_operator_apply_carrier(mcpwm_oper_handle_t oper, const mcpwm_carrier_config_t *config)
Apply carrier feature for MCPWM operator.
- 参数:
oper -- [in] MCPWM operator, allocated by
mcpwm_new_operator()config -- [in] MCPWM carrier specific configuration
- 返回:
ESP_OK: Set carrier for operator successfully
ESP_ERR_INVALID_ARG: Set carrier for operator failed because of invalid argument
ESP_FAIL: Set carrier for operator failed because of other error
Structures
-
struct mcpwm_operator_config_t
MCPWM operator configuration.
Public Members
-
int group_id
Specify from which group to allocate the MCPWM operator
-
int intr_priority
MCPWM operator interrupt priority, if set to 0, the driver will try to allocate an interrupt with a relative low priority (1,2,3)
-
struct mcpwm_operator_config_t::extra_mcpwm_operator_flags flags
Extra configuration flags for operator
-
struct extra_mcpwm_operator_flags
Extra configuration flags for operator.
Public Members
-
uint32_t update_gen_action_on_tez
Whether to update generator action when timer counts to zero
-
uint32_t update_gen_action_on_tep
Whether to update generator action when timer counts to peak
-
uint32_t update_gen_action_on_sync
Whether to update generator action on sync event
-
uint32_t update_dead_time_on_tez
Whether to update dead time when timer counts to zero
-
uint32_t update_dead_time_on_tep
Whether to update dead time when timer counts to peak
-
uint32_t update_dead_time_on_sync
Whether to update dead time on sync event
-
uint32_t update_gen_action_on_tez
-
int group_id
-
struct mcpwm_brake_config_t
MCPWM brake configuration structure.
Public Members
-
mcpwm_fault_handle_t fault
Which fault causes the operator to brake
-
mcpwm_operator_brake_mode_t brake_mode
Brake mode
-
uint32_t cbc_recover_on_tez
Recovery CBC brake state on tez event
-
uint32_t cbc_recover_on_tep
Recovery CBC brake state on tep event
-
struct mcpwm_brake_config_t flags
Extra flags for brake configuration
-
mcpwm_fault_handle_t fault
-
struct mcpwm_operator_event_callbacks_t
Group of supported MCPWM operator event callbacks.
备注
The callbacks are all running under ISR environment
Public Members
-
mcpwm_brake_event_cb_t on_brake_cbc
callback function when mcpwm operator brakes in CBC
-
mcpwm_brake_event_cb_t on_brake_ost
callback function when mcpwm operator brakes in OST
-
mcpwm_brake_event_cb_t on_brake_cbc
-
struct mcpwm_carrier_config_t
MCPWM carrier configuration structure.
Public Members
-
mcpwm_carrier_clock_source_t clk_src
MCPWM carrier clock source
-
uint32_t frequency_hz
Carrier frequency in Hz
-
uint32_t first_pulse_duration_us
The duration of the first PWM pulse, in us
-
float duty_cycle
Carrier duty cycle
-
uint32_t invert_before_modulate
Invert the raw signal
-
uint32_t invert_after_modulate
Invert the modulated signal
-
struct mcpwm_carrier_config_t flags
Extra flags for carrier configuration
-
mcpwm_carrier_clock_source_t clk_src