2022-06-30 06:38:18 +08:00
|
|
|
# Copyright (c) 2022 Espressif Systems (Shanghai) Co., Ltd.
|
|
|
|
# SPDX-License-Identifier: Apache-2.0
|
|
|
|
|
|
|
|
description: |
|
|
|
|
|
|
|
|
Espressif's Motor Control Pulse Width Modulator (MCPWM) controller Node
|
|
|
|
|
|
|
|
The MCPWM peripheral is intended for motor and power control.
|
|
|
|
It provides six PWM outputs that can be set up to operate in several topologies
|
|
|
|
|
|
|
|
ESP32 contains two MCPWM peripherals: MCPWM0 and MCPWM1
|
|
|
|
|
|
|
|
Each MCPWM peripheral has one clock divider (prescaler), three PWM timers, three PWM operators,
|
|
|
|
and a capture module.
|
|
|
|
|
|
|
|
Every PWM operator has two PWM outputs: PWMxA and PWMxB. They can work independently, in symmetric
|
|
|
|
and asymmetric configuration. MCPWMxA and MCPWMxB will share the same timer, thus having the same
|
|
|
|
operating frequency.
|
|
|
|
|
2023-01-03 21:08:30 +08:00
|
|
|
The driver currently always use the timer x for operator x. Timer 0 will use operator 0 for
|
|
|
|
PWM0A/B.
|
2022-06-30 06:38:18 +08:00
|
|
|
Timer 1 will use operator 1 for PWM1A/B, and so on.
|
|
|
|
|
|
|
|
Mapping channel ID:
|
|
|
|
Channel 0 -> Timer 0, Operator 0, output PWM0A
|
|
|
|
Channel 1 -> Timer 0, Operator 0, output PWM0B
|
|
|
|
Channel 2 -> Timer 1, Operator 1, output PWM1A
|
|
|
|
Channel 3 -> Timer 1, Operator 1, output PWM1B
|
|
|
|
Channel 4 -> Timer 2, Operator 2, output PWM2A
|
|
|
|
Channel 5 -> Timer 2, Operator 2, output PWM2B
|
|
|
|
Channel 6 -> Capture 0
|
|
|
|
Channel 7 -> Capture 1
|
|
|
|
Channel 8 -> Capture 2
|
|
|
|
|
|
|
|
Example: Use PWM0A output and capture 0:
|
|
|
|
|
|
|
|
pwm_loopback_0 {
|
|
|
|
compatible = "test-pwm-loopback";
|
|
|
|
pwms = <&mcpwm0 0 0 PWM_POLARITY_NORMAL>, #Channel 0 -> Output PWM0A
|
|
|
|
<&mcpwm0 6 0 PWM_POLARITY_NORMAL>; #Channel 6 -> Capture 0;
|
|
|
|
};
|
|
|
|
|
|
|
|
The mapping between the output PWMxA/B or CaptureX and GPIO is done through pinctrl:
|
|
|
|
|
|
|
|
&mcpwm0 {
|
|
|
|
pinctrl-0 = <&mcpwm0_default>;
|
|
|
|
pinctrl-names = "default";
|
|
|
|
}
|
|
|
|
|
|
|
|
The 'mcpwm0_default' node is defined inside the pinctrl node.
|
|
|
|
|
|
|
|
&pinctrl {
|
|
|
|
mcpwm0_default: mcpwm0_default {
|
|
|
|
group1 {
|
|
|
|
pinmux = <MCPWM0_OUT0A_GPIO0>,
|
|
|
|
<MCPWM0_OUT0B_GPIO2>,
|
|
|
|
<MCPWM0_OUT1A_GPIO4>;
|
|
|
|
output-enable;
|
|
|
|
};
|
|
|
|
group2 {
|
|
|
|
pinmux = <MCPWM0_CAP0_GPIO5>;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
Note: Check espressif,esp32-pinctrl.yaml for complete documentation regarding pinctrl.
|
|
|
|
|
|
|
|
Use the prescale-timerX property to configure the timers:
|
|
|
|
|
|
|
|
&mcpwm0 {
|
|
|
|
pinctrl-0 = <&mcpwm0_default>;
|
|
|
|
pinctrl-names = "default";
|
|
|
|
prescale = <255>;
|
|
|
|
prescale-timer0 = <103>;
|
|
|
|
prescale-timer1 = <0>;
|
|
|
|
prescale-timer2 = <255>;
|
|
|
|
status = "okay";
|
|
|
|
};
|
|
|
|
|
|
|
|
compatible: "espressif,esp32-mcpwm"
|
|
|
|
|
|
|
|
include: [pwm-controller.yaml, pinctrl-device.yaml, base.yaml]
|
|
|
|
|
|
|
|
properties:
|
|
|
|
prescale:
|
|
|
|
type: int
|
|
|
|
required: true
|
|
|
|
description: |
|
|
|
|
8 bit timer prescale for the global clock.
|
|
|
|
Period of PWM_clk = 6.25ns * (PWM_CLK_PRESCALE + 1).
|
|
|
|
|
|
|
|
"#pwm-cells":
|
|
|
|
const: 3
|
|
|
|
|
|
|
|
prescale-timer0:
|
|
|
|
type: int
|
|
|
|
description: |
|
|
|
|
8 bit timer prescale for timer 0.
|
|
|
|
Period of PT0_clk = Period of PWM_clk * (PWM_TIMER0_PRESCALE + 1).
|
|
|
|
|
|
|
|
prescale-timer1:
|
|
|
|
type: int
|
|
|
|
description: |
|
|
|
|
8 bit timer prescale for timer 1.
|
|
|
|
Period of PT1_clk = Period of PWM_clk * (PWM_TIMER1_PRESCALE + 1).
|
|
|
|
|
|
|
|
prescale-timer2:
|
|
|
|
type: int
|
|
|
|
description: |
|
|
|
|
8 bit timer prescale for timer 2.
|
|
|
|
Period of PT2_clk = Period of PWM_clk * (PWM_TIMER2_PRESCALE + 1).
|
|
|
|
|
|
|
|
pwm-cells:
|
|
|
|
- channel
|
|
|
|
- period
|
|
|
|
- flags
|