芯片: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输出执行四个预定义动作中的一个:
-
锁定输出的当前状态
-
将输出设置为低
-
将输出设置为高
-
切换输出
用户应确定电机可能的故障模式,以及在检测到特定故障时应采取的措施,例如,将有刷电机的所有输出驱动为低电平,或将步进电机锁定电流状态等。作为该措施的结果,电机应处于安全状态,以降低故障造成损坏的可能性。
故障处理程序功能分两步启用:
-
配置GPIO作为故障信号输入。这是以类似于上面部分中针对捕获信号所描述的方式来完成的。它包括设置信号电平以触发mcpwm_fault_input_level_t中定义的故障。
-
通过调用mcpwm_fault_set_oneshot_mode()或mcpwm_default_set_cyc_mode()初始化故障处理程序。这些功能设置了一旦故障信号变为非激活状态,MCPWM应运行的模式。可能有两种模式:
-
-
MCPWM单元的状态将被锁定,直到重置-MCPWM_fault_set_oneshot_mode()。
-
一旦故障信号变为非活动状态,MCPWM将恢复运行-MCPWM_fault_set_cyc_mode()。
-
-
函数调用参数包括对mcpwm_fault_signal_t中定义的三个故障输入之一的选择,以及对mcpwm_action_on_pwmxa_t和mcpwm_action_on_pwmxb_t中定义的输出A和B的特定操作。
-
可以在运行时通过调用mcpwm_fault_deinit()禁用特定的故障信号。
如果输出信号通过隔离变压器,则添加更高频率的载波
分辨率的额外配置。
示例代码
MCPWM example are located under: peripherals/mcpwm:
-
带霍尔无刷直流电机 - peripherals/mcpwm/mcpwm_bldc_hall_control
-
带捕获的HC-SR04传感器 - peripherals/mcpwm/mcpwm_capture_hc_sr04