本文章 来自原创专栏《ESP32教学专栏 (基于ESP-IDF)》,讲解如何使用 ESP-IDF 构建 ESP32 程序,发布文章并会持续为已发布文章添加新内容! 每篇文章都经过了精打细磨!
↓↓↓通过下方对话框进入专栏目录页↓↓↓
CSDN 请求进入目录 _ O x
是否进入ESP32教学导航(基于ESP-IDF)?
确定
文章目录
一、电机控制器MCPWM的模块简介
ESP32有两个MCPWM单元,可用于控制不同类型的电机。每个单元有三对PWM输出。(如下图,每对输出标记为A、B。共六对PWM输出)
除了PWM输出之外,MCPWM还具有其他功能。比如每个单元还能够收集诸如同步信号等输入,检测电机过电流或过电压等故障信号,以及在例如转子位置上获得捕获信号的反馈。
MCPWM单元的更详细的框图如下所示:
每个A/B对可由三个定时器中的任何一个MCPWM定时器0、1和2中的任何一个时钟。(相同的定时器可用于时钟多对PWM输出)
从上图我们不难发现,MCPWM具有的功能(上图彩色的虚线框)有:
- OPERATOR操作器模块
- CAPTURE状态捕获模块
- FAULT DETECT故障处理器模块
- CLOCK/TIMER时钟、时钟预分频器模块
(黑色虚线框指的是GPIO矩阵 (GPIO Matrix))
下面详细介绍每个部分
1、操作器模块 Operator
操作员 (Operator) 用于操作连接到MCPWM单元的电机。
例如改变旋转方向(顺时针或逆时针),或改变转速。
操作员输出一共有 3 对,我们可以对其施加控制信号。标记为“A”和“B”的称为一对。A、B均有自己对应的名为“Generator”的子模块来驱动诸如PWM的输出信号。
为了提供PWM信号,每个Operator本身由三个可用的定时器(MCPWM Timer)中的任何一个进行计时。
为了简化API,API会 自动关联 具有相同索引
Timer
以驱动Operator
。
例如Timer 0
与Operator 0
关联。
2、捕获模块 Capture
捕获模块在功能上相当于由沿中断控制的捕获定时器
对于无刷直流电机,控制的要求之一是感应转子位置。
为了完成这一任务,每个 MCPWM单元提供三个传感输入以及专用的硬件。该硬件能够检测输入信号的边缘,并测量信号之间的时间。
因此,控制软件更简单,CPU功率可能用于其他任务。下图为一个无刷直流电动机控制实例(CAP1
CAP2
CAP3
是Capture的输入)
注意:3个Capture可以在不使用PWM输出时单独使用,即只配置Capture实现边缘捕获功能。因此MCPWM还可用于非电机外设。
例如,使用MCPWM的Capture0去捕获HC-SR04超声波模块ECHO引脚的高电平时间,进而实现测距。
3、故障处理器模块 Fault Detect
MCPWM的每个单元都能够感知外部信号,包括有关电机、电机驱动器或连接到MCPWM的任何其他设备的故障信息。
每个单元有三个错误输入,可以路由到用户可选择的GPIO。当接收到故障信号时,MCPWM可以配置为对A/B输出执行四种预定义的动作之一:
- 锁定输出的当前状态
- 设置低输出
- 设置高输出
- 开关输出
用户应确定电机可能的故障模式,以及在检测到特定故障时应采取的行动。
例如对有刷电机驱动所有输出为低,或对步进电机锁定电流状态等。这个动作会使电机处于安全状态,以减少故障造成的损坏的可能性。
4、*载波 Carrier
MCPWM有一个载波子模块,如果使用互感原理(如通过变压器)向电机驱动传递A/B输出信号(例如需要让电机驱动器输入电流与ESP32 GPIO输出电流相互隔离)。任何A和B输出信号都可以100%占空,并且当电机在满载时需要稳定运行时,信号不会改变。
由于非交流信号无法与变压器等互感原理的电子元件相耦合,因此信号被载波子模块调制以产生交流波形,即可使耦合成为可能。
5、*中断 Interrupts
通过调用mcpwm_isr_register()
可以注册MCPWM中断处理程序。
在 ESP-IDF v4.3 及之前,实现捕获模块
Capture
需要中断实现。
但是 ESP-IDFv4.3 之后(不包括v4.3)。对MCPWM的 Capture API 进行了优化和简化。
下图为2021年8月11日
的Github esp-idf仓库下的esp-idf\examples\peripherals
文件夹截图。可以看到,6天前对MCPWM的Capture
示例进行了更新
注意,如果使用了mcpwm_capture_enable_channel()
,那么将安装一个默认的ISR例程来实现简化API的回调。因此,如果使用了mcpwm_capture_enable_channel()
,请不要再调用mcpwm_isr_register()
这个函数来注册中断。
二、使用 MCPWM 输出 PWM 信号
1、使用方法
(1)MCPWM 输出初始化
初始化MCPWM需要的步骤:
- 配置GPIO口
- 在一个
mcpwm_config_t
结构体中设置定时器频率和初始任务的设置。 - 非必须:设置定时器分辨率(默认为
10,000,000
&