ESP32 MCPWM 中的发生器可以由不同的比较器触发吗?

问题描述 投票:0回答:1

我想通过 L298 电源驱动器直接控制带有 ESP32 的步进电机。这适用于全步模式,但我无法生成半步模式的信号(Enable、In1、In2 In3、In4)。 这是控件类的构造函数:

    McpwmStepperControl::McpwmStepperControl(gpio_num_t In1, gpio_num_t In2,
        gpio_num_t EnA, gpio_num_t In3, gpio_num_t In4, gpio_num_t EnB, gpio_num_t CapPin, gpio_num_t RefPin, int GroupID)
            : _reverse(false), _In1(In1), _In2(In2), _EnA(EnA), _In3(In3), _In4(In4), _EnB(EnB), _CapPin(CapPin), _RefPin(RefPin),
             _GroupID(GroupID), _direction(false), _error_relay(0), _debounce(0),
             Timer(GroupID),
             Operator{McpwmOperator(GroupID), McpwmOperator(GroupID), McpwmOperator(GroupID)},
             Comparator{McpwmComparator(Operator[0]), McpwmComparator(Operator[1]), McpwmComparator(Operator[2])},
             Generator{McpwmGenerator(Operator[0], In1, 0), McpwmGenerator(Operator[0], In2, 1),
                 McpwmGenerator(Operator[1], In3, 0), McpwmGenerator(Operator[1], In4, 1),
                 McpwmGenerator(Operator[2], EnA, 0), McpwmGenerator(Operator[2], EnB, 0) } 
{
    setSpeeds(10, 150); // set default values
    _dp = GPIO_NUM_NC;
    Operator[0].connectTimer(Timer);
    Operator[1].connectTimer(Timer);
    Operator[2].connectTimer(Timer);
    Timer.setComparators(&Comparator);
}

这是我尝试初始化其中一个生成器的方法:

    ESP_ERROR_CHECK(mcpwm_generator_set_actions_on_timer_event(Generator[0].getHandle(),
            MCPWM_GEN_COMPARE_EVENT_ACTION(MCPWM_TIMER_DIRECTION_UP, Comparator[0].getHandle(), MCPWM_GEN_ACTION_TOGGLE),
            MCPWM_GEN_COMPARE_EVENT_ACTION(MCPWM_TIMER_DIRECTION_UP, Comparator[1].getHandle(), MCPWM_GEN_ACTION_TOGGLE),
            MCPWM_GEN_COMPARE_EVENT_ACTION(MCPWM_TIMER_DIRECTION_UP, Comparator[2].getHandle(), MCPWM_GEN_ACTION_TOGGLE),
            MCPWM_GEN_COMPARE_EVENT_ACTION(MCPWM_TIMER_DIRECTION_DOWN, Comparator[2].getHandle(), MCPWM_GEN_ACTION_TOGGLE),
            MCPWM_GEN_COMPARE_EVENT_ACTION(MCPWM_TIMER_DIRECTION_DOWN, Comparator[1].getHandle(), MCPWM_GEN_ACTION_TOGGLE),
            MCPWM_GEN_COMPARE_EVENT_ACTION(MCPWM_TIMER_DIRECTION_DOWN, Comparator[0].getHandle(), MCPWM_GEN_ACTION_TOGGLE),
            MCPWM_GEN_COMPARE_EVENT_ACTION_END()
            ));

代码编译并启动正常,但不,它仅在 Comparator[0] 事件时切换。 (我注释掉了 MCPWM_GEN_COMPARE_EVENT_ACTION 宏的所有组合,但我总是得到相同的波形)。 这是一个微不足道的编码错误还是 ESP32 MCPWM 硬件的限制?

Scope image

黄色通道由定时器满和空触发,蓝色通道是发生器输出。如您所见,它仅在 Comparator[0] 上切换。

这里是github上完整代码的链接:

https://github.com/tommiport5/McpwmTest.git

esp32 stepper espressif-idf
1个回答
0
投票

我实际上发现了 MCPWM 硬件实现中的限制,这些限制在文档中我并不太清楚:

  1. 一个组不能有 4 个操作员。 2 个运算符有效,但我尝试了 4 个(对于两个半桥和两个使能输入,并收到消息“第 0 组中没有自由运算符”)。
  2. 一个操作员最多可以有 2 个比较器。
  3. 一名操作员最多可以拥有 2 台发电机。
  4. 生成器只能对来自其自身运算符的比较器事件做出反应。

由于这些限制,我目前没有找到一种方法来为半步模式生成 4 个独立信号。请随意使用我在 github 上的测试系统作为您研究的基础。

© www.soinside.com 2019 - 2024. All rights reserved.