ESP32S3学习——Motor Control Pulse Width Modulator (MCPWM)

芯片:esp32s3

开发环境:espidfv4.4

一、官网相关资料

1)简介

ESP32-S3有两个MCPWM单元,可用于控制不同类型的电机。每个单元有三对PWM输出。

每个A/B对可以由三个定时器Timer 0、1和2中的任何一个来计时。相同的定时器可以用于对一对以上的PWM输出进行计时。每个单元还能够收集输入,如SYNC SIGNALS,检测FAULT SIGNALS(故障信号),如电机过电流或过电压,以及获得关于例如转子位置的捕获信号的反馈。

二、配置流程

配置输出的基本功能

示例电路。它包括一个H桥,用于切换施加到电机(M)的电压的极化,并提供足够的电流来驱动电机

配置过程

  • 选择mcpwm单元,s3有两个(mcpwm_unit_t枚举)

  • mcpwm_gpio_init():将两个gpio初始化为所选单元内的输出信号,可用的信号选项都列在mcpwm_io_signals_t中,要一次设置多个引脚,请将函数mcpwm_set_pin()与mcpwm_pin_config_t一起使用

  • 选择计时器。装置内有三个定时器。计时器列在mcpwm_timer_t中

  • 在mcpwm_config_t结构中设置定时器频率和初始占空比。

  • 通过调用mcpwm_group_set_resolution()和mcpwm_timer_set_resolution()设置计时器分辨率

  • mcpwm_init():以使配置生效

操作输出以驱动电机

  • 为了简化API,每个计时器都由API自动关联,以驱动具有相同索引的运算符,例如,Timer 0 is associated with Operator 0.

  • mcpwm_set_signal_high()或mcpwm_set _signal_low()驱动特定信号稳定高电平或稳定低电平

  • mcpwm_start()或mcpwm_stop()来用PWM信号驱动输出。马达转速将与PWM占空比成比例

  • mcpwm_set_duty():以%为单位的占空值。以微秒为单位设置占空比,您可以调用mcpwm_set_duty_in_us()

  • mcpwm_get_duty()来检查当前设置的值

  • mcpwm_set_duty_type()来改变PWM信号的相位

  • mcpwm_generator_t为每个A和B输出单独设置占空比

  • 每次在mcpwm_set_signal_high()或mcpwm_set _signal_low()之后调用函数mcpwm_sett_duty_type(),以恢复先前设置的占空比。

调整电机的驱动方式

  • mcpwm_Set_frequency()设置特定的PWM频率,要检查设置的频率,请使用函数mcpwm_get_frequency()

  • 死区时间选项在mcpwm_deadtime_type_t中定义,并通过调用mcpwm_deadtime_enable()启用。要禁用此功能,请调用mcpwm_deadtime_disable()。

  • 同步由上面MCPWM的框图上显示的SYNC SIGNALS触发,并在MCPWM_SYNC_signal_t中定义。要将信号附加到GPIO,请调用mcpwm_GPIO_init()。然后可以使用函数mcpwm_sync_configure()启用同步。作为输入参数提供MCPWM单元,定时器进行同步,同步信号和相位延迟定时器

  • 同步信号是指使用两种不同的枚举。当选择gpio作为信号输入源时,第一个mcpwm_io_signals_t与函数mcpwm_gpio_init()一起使用。第二个mcpwm_sync_signal_t用于启用或禁用与mcpwm_sync_configure()或mcpwm_ync_disable()的同步。

  • 通过使MCPWM计数器向上、向下和向上/向下计数(自动改变计数方向),改变A/B输出信号的模式。相应的配置是在调用mcpwm_init()并从mcpwm_counter_type_t中选择一种计数器类型时完成的,如配置一节所述

同步同步计时器以协同工作(不啦不啦,用的时候再看)

  • 每个PWM定时器都有一个同步输入和一个同步输出。同步输入可以通过GPIO矩阵从其他定时器的同步输出或GPIO信号中选择。定时器的同步信号可以由输入同步信号产生,也可以在计数值达到峰值/零时产生。因此,PWM定时器可以通过它们的锁相而被链接在一起。在同步期间,PWM定时器时钟预分频器将重置其计数器,以便同步PWM定时器时钟。

  • 确保PWM定时器和操作员已配置,以便同步将继承其配置(计数模式、频率和占空比)。

  • 通过调用mcpwm_sync_configure()启用计时器的同步输入,从mcpwm_sync_signal_t中选择所需的信号输入,并设置从0到999的所需相位范围,该范围映射到0%~999.9%。0表示应用零相位,同时触发输出。并选择所需的计数方向。

  • 从另一个定时器或外部GPIO输入启用同步事件源之一。

捕获外部信号以提供对输出的额外控制

无刷直流电机控制的要求之一是感应转子位置。为了便于执行此任务,每个MCPWM单元提供三个感测输入以及专用硬件。硬件能够检测输入信号的边缘并测量信号之间的时间。因此,控制软件更简单,并且CPU功率可以用于其他任务。

捕获配置过程

  • 调用函数mcpwm_gpio_init()或mcpwm_set_pin()将gpio配置为捕获信号输入

  • 通过调用mcpwm_capture_enable_channel(),从mcpwm_capture_channel_id_t中选择所需的信号输入,在mcpwm_apture_config_t中设置信号边缘、信号计数预分频器和用户回调,启用功能本身

  • 在上面的第二步中,启用了32位捕获计时器。计时器在APB时钟的驱动下连续运行。时钟频率通常为80MHz。在每个捕获事件中,捕获计时器的值都存储在时间戳寄存器中,然后可以通过调用mcpwm_capture_signal_get_value()对其进行检查。可以使用mcpwm_capture_signal_get_edge()来检查最后一个信号的边缘。这些数据也在回调函数中作为事件数据cap_event_data_t提供

  • 如果不再需要,可以使用mcpwm_capture_disable_channel()禁用捕获功能。

  • 捕获预缩放与其他模块不同,因为它应用于输入信号,而不是定时器源。预分频器在初始值设置为低的情况下保持了其自身的电平状态,并且正在检测输入信号的正边缘以改变其内部状态。这意味着,如果两对正边缘和负边缘被传递到输入,预分频器的内部状态将改变两次。ISR将报告此内部状态变化,而不是输入信号。例如,如果两个边都是通过mcpwm_capture_config_t选择的,则将预缩放设置为2将在输入的每个正边上生成ISR回调。或者如果通过mcpwm_capture_config_t只选择了一条边,则输入的每两条正边。

使用故障处理程序检测和管理故障

MCPWM的每个单元能够感测具有关于马达、马达驱动器或连接到MCPWM的任何其他设备的故障的信息的外部信号。每个单元有三个故障输入,可以路由到用户可选的GPIO。MCPWM可以被配置为当接收到故障信号时对A/B输出执行四个预定义动作中的一个:

  • 锁定输出的当前状态

  • 将输出设置为低

  • 将输出设置为高

  • 切换输出

用户应确定电机可能的故障模式,以及在检测到特定故障时应采取的措施,例如,将有刷电机的所有输出驱动为低电平,或将步进电机锁定电流状态等。作为该措施的结果,电机应处于安全状态,以降低故障造成损坏的可能性。

故障处理程序功能分两步启用:

  1. 配置GPIO作为故障信号输入。这是以类似于上面部分中针对捕获信号所描述的方式来完成的。它包括设置信号电平以触发mcpwm_fault_input_level_t中定义的故障。

  2. 通过调用mcpwm_fault_set_oneshot_mode()或mcpwm_default_set_cyc_mode()初始化故障处理程序。这些功能设置了一旦故障信号变为非激活状态,MCPWM应运行的模式。可能有两种模式:

    • MCPWM单元的状态将被锁定,直到重置-MCPWM_fault_set_oneshot_mode()。

    • 一旦故障信号变为非活动状态,MCPWM将恢复运行-MCPWM_fault_set_cyc_mode()。

  3. 函数调用参数包括对mcpwm_fault_signal_t中定义的三个故障输入之一的选择,以及对mcpwm_action_on_pwmxa_t和mcpwm_action_on_pwmxb_t中定义的输出A和B的特定操作。

  4. 可以在运行时通过调用mcpwm_fault_deinit()禁用特定的故障信号。

如果输出信号通过隔离变压器,则添加更高频率的载波

分辨率的额外配置。

示例代码

MCPWM example are located under: peripherals/mcpwm:

三、上手敲代码

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值