Skip to content

Commit

Permalink
platform: increase motor PWM frequency 10x
Browse files Browse the repository at this point in the history
This increases the motor PWM frequency on all platforms from the 1/1.2
kHz range to the 10/12 kHz range. This reduces the motor noise when the
PWM is active. This is similar to EV3, which uses a 13.2 kHz PWM for
motors. This comes at a small cost of a slightly less linear duty cycle
vs. torque curve.
  • Loading branch information
dlech committed Nov 13, 2020
1 parent 7650872 commit 030dd66
Show file tree
Hide file tree
Showing 8 changed files with 69 additions and 28 deletions.
8 changes: 4 additions & 4 deletions lib/pbio/drv/city_hub/motor.c
Expand Up @@ -85,15 +85,15 @@ static void pbdrv_motor_run_fwd(pbio_port_t port, int16_t duty_cycle) { // duty
GPIOC->MODER = (GPIOC->MODER & ~GPIO_MODER_MODER6_Msk) | (1 << GPIO_MODER_MODER6_Pos);
GPIOC->BSRR = GPIO_BSRR_BS_6;
if (pbdrv_pwm_get_dev(0, &dev) == PBIO_SUCCESS) {
pbdrv_pwm_set_duty(dev, 3, 10000 - duty_cycle);
pbdrv_pwm_set_duty(dev, 3, 1000 - duty_cycle / 10);
}
GPIOC->MODER = (GPIOC->MODER & ~GPIO_MODER_MODER8_Msk) | (2 << GPIO_MODER_MODER8_Pos);
break;
case PBIO_PORT_A:
GPIOC->MODER = (GPIOC->MODER & ~GPIO_MODER_MODER7_Msk) | (1 << GPIO_MODER_MODER7_Pos);
GPIOC->BSRR = GPIO_BSRR_BS_7;
if (pbdrv_pwm_get_dev(0, &dev) == PBIO_SUCCESS) {
pbdrv_pwm_set_duty(dev, 4, 10000 - duty_cycle);
pbdrv_pwm_set_duty(dev, 4, 1000 - duty_cycle / 10);
}
GPIOC->MODER = (GPIOC->MODER & ~GPIO_MODER_MODER9_Msk) | (2 << GPIO_MODER_MODER9_Pos);
break;
Expand All @@ -111,15 +111,15 @@ static void pbdrv_motor_run_rev(pbio_port_t port, int16_t duty_cycle) { // duty
GPIOC->MODER = (GPIOC->MODER & ~GPIO_MODER_MODER8_Msk) | (1 << GPIO_MODER_MODER8_Pos);
GPIOC->BSRR = GPIO_BSRR_BS_8;
if (pbdrv_pwm_get_dev(0, &dev) == PBIO_SUCCESS) {
pbdrv_pwm_set_duty(dev, 1, 10000 + duty_cycle);
pbdrv_pwm_set_duty(dev, 1, 1000 + duty_cycle / 10);
}
GPIOC->MODER = (GPIOC->MODER & ~GPIO_MODER_MODER6_Msk) | (2 << GPIO_MODER_MODER6_Pos);
break;
case PBIO_PORT_A:
GPIOC->MODER = (GPIOC->MODER & ~GPIO_MODER_MODER9_Msk) | (1 << GPIO_MODER_MODER9_Pos);
GPIOC->BSRR = GPIO_BSRR_BS_9;
if (pbdrv_pwm_get_dev(0, &dev) == PBIO_SUCCESS) {
pbdrv_pwm_set_duty(dev, 2, 10000 + duty_cycle);
pbdrv_pwm_set_duty(dev, 2, 1000 + duty_cycle / 10);
}
GPIOC->MODER = (GPIOC->MODER & ~GPIO_MODER_MODER7_Msk) | (2 << GPIO_MODER_MODER7_Pos);
break;
Expand Down
16 changes: 8 additions & 8 deletions lib/pbio/drv/move_hub/motor.c
Expand Up @@ -109,31 +109,31 @@ static void pbdrv_motor_run_fwd(pbio_port_t port, int16_t duty_cycle) {
GPIOA->MODER = (GPIOA->MODER & ~GPIO_MODER_MODER10_Msk) | (1 << GPIO_MODER_MODER10_Pos);
GPIOA->BSRR = GPIO_BSRR_BS_10;
if (pbdrv_pwm_get_dev(0, &dev) == PBIO_SUCCESS) {
pbdrv_pwm_set_duty(dev, 1, 10000 - duty_cycle);
pbdrv_pwm_set_duty(dev, 1, 1000 - duty_cycle / 10);
}
GPIOA->MODER = (GPIOA->MODER & ~GPIO_MODER_MODER8_Msk) | (2 << GPIO_MODER_MODER8_Pos);
break;
case PBIO_PORT_B:
GPIOA->MODER = (GPIOA->MODER & ~GPIO_MODER_MODER11_Msk) | (1 << GPIO_MODER_MODER11_Pos);
GPIOA->BSRR = GPIO_BSRR_BS_11;
if (pbdrv_pwm_get_dev(0, &dev) == PBIO_SUCCESS) {
pbdrv_pwm_set_duty(dev, 2, 10000 - duty_cycle);
pbdrv_pwm_set_duty(dev, 2, 1000 - duty_cycle / 10);
}
GPIOA->MODER = (GPIOA->MODER & ~GPIO_MODER_MODER9_Msk) | (2 << GPIO_MODER_MODER9_Pos);
break;
case PBIO_PORT_C:
GPIOC->MODER = (GPIOC->MODER & ~GPIO_MODER_MODER6_Msk) | (1 << GPIO_MODER_MODER6_Pos);
GPIOC->BSRR = GPIO_BSRR_BS_6;
if (pbdrv_pwm_get_dev(1, &dev) == PBIO_SUCCESS) {
pbdrv_pwm_set_duty(dev, 3, 10000 - duty_cycle);
pbdrv_pwm_set_duty(dev, 3, 1000 - duty_cycle / 10);
}
GPIOC->MODER = (GPIOC->MODER & ~GPIO_MODER_MODER8_Msk) | (2 << GPIO_MODER_MODER8_Pos);
break;
case PBIO_PORT_D:
GPIOC->MODER = (GPIOC->MODER & ~GPIO_MODER_MODER9_Msk) | (1 << GPIO_MODER_MODER9_Pos);
GPIOC->BSRR = GPIO_BSRR_BS_9;
if (pbdrv_pwm_get_dev(1, &dev) == PBIO_SUCCESS) {
pbdrv_pwm_set_duty(dev, 2, 10000 - duty_cycle);
pbdrv_pwm_set_duty(dev, 2, 1000 - duty_cycle / 10);
}
GPIOC->MODER = (GPIOC->MODER & ~GPIO_MODER_MODER7_Msk) | (2 << GPIO_MODER_MODER7_Pos);
break;
Expand All @@ -151,31 +151,31 @@ static void pbdrv_motor_run_rev(pbio_port_t port, int16_t duty_cycle) {
GPIOA->MODER = (GPIOA->MODER & ~GPIO_MODER_MODER8_Msk) | (1 << GPIO_MODER_MODER8_Pos);
GPIOA->BSRR = GPIO_BSRR_BS_8;
if (pbdrv_pwm_get_dev(0, &dev) == PBIO_SUCCESS) {
pbdrv_pwm_set_duty(dev, 3, 10000 + duty_cycle);
pbdrv_pwm_set_duty(dev, 3, 1000 + duty_cycle / 10);
}
GPIOA->MODER = (GPIOA->MODER & ~GPIO_MODER_MODER10_Msk) | (2 << GPIO_MODER_MODER10_Pos);
break;
case PBIO_PORT_B:
GPIOA->MODER = (GPIOA->MODER & ~GPIO_MODER_MODER9_Msk) | (1 << GPIO_MODER_MODER9_Pos);
GPIOA->BSRR = GPIO_BSRR_BS_9;
if (pbdrv_pwm_get_dev(0, &dev) == PBIO_SUCCESS) {
pbdrv_pwm_set_duty(dev, 4, 10000 + duty_cycle);
pbdrv_pwm_set_duty(dev, 4, 1000 + duty_cycle / 10);
}
GPIOA->MODER = (GPIOA->MODER & ~GPIO_MODER_MODER11_Msk) | (2 << GPIO_MODER_MODER11_Pos);
break;
case PBIO_PORT_C:
GPIOC->MODER = (GPIOC->MODER & ~GPIO_MODER_MODER8_Msk) | (1 << GPIO_MODER_MODER8_Pos);
GPIOC->BSRR = GPIO_BSRR_BS_8;
if (pbdrv_pwm_get_dev(1, &dev) == PBIO_SUCCESS) {
pbdrv_pwm_set_duty(dev, 1, 10000 + duty_cycle);
pbdrv_pwm_set_duty(dev, 1, 1000 + duty_cycle / 10);
}
GPIOC->MODER = (GPIOC->MODER & ~GPIO_MODER_MODER6_Msk) | (2 << GPIO_MODER_MODER6_Pos);
break;
case PBIO_PORT_D:
GPIOC->MODER = (GPIOC->MODER & ~GPIO_MODER_MODER7_Msk) | (1 << GPIO_MODER_MODER7_Pos);
GPIOC->BSRR = GPIO_BSRR_BS_7;
if (pbdrv_pwm_get_dev(1, &dev) == PBIO_SUCCESS) {
pbdrv_pwm_set_duty(dev, 4, 10000 + duty_cycle);
pbdrv_pwm_set_duty(dev, 4, 1000 + duty_cycle / 10);
}
GPIOC->MODER = (GPIOC->MODER & ~GPIO_MODER_MODER9_Msk) | (2 << GPIO_MODER_MODER9_Pos);
break;
Expand Down
10 changes: 8 additions & 2 deletions lib/pbio/drv/prime_hub/motor.c
Expand Up @@ -29,6 +29,7 @@ typedef struct {

static const pbdrv_motor_data_t
platform_data[PBDRV_CONFIG_NUM_MOTOR_CONTROLLER] = {
// Port A
{
.pin1_gpio.bank = GPIOE,
.pin1_gpio.pin = 9,
Expand All @@ -41,6 +42,7 @@ static const pbdrv_motor_data_t
.pin2_pwm_id = 0,
.pin2_pwm_ch = 2,
},
// Port B
{
.pin1_gpio.bank = GPIOE,
.pin1_gpio.pin = 13,
Expand All @@ -53,6 +55,7 @@ static const pbdrv_motor_data_t
.pin2_pwm_id = 0,
.pin2_pwm_ch = 4,
},
// Port C
{
.pin1_gpio.bank = GPIOB,
.pin1_gpio.pin = 6,
Expand All @@ -65,6 +68,7 @@ static const pbdrv_motor_data_t
.pin2_pwm_id = 2,
.pin2_pwm_ch = 2,
},
// Port D
{
.pin1_gpio.bank = GPIOB,
.pin1_gpio.pin = 8,
Expand All @@ -77,6 +81,7 @@ static const pbdrv_motor_data_t
.pin2_pwm_id = 2,
.pin2_pwm_ch = 4,
},
// Port E
{
.pin1_gpio.bank = GPIOC,
.pin1_gpio.pin = 6,
Expand All @@ -89,6 +94,7 @@ static const pbdrv_motor_data_t
.pin2_pwm_id = 1,
.pin2_pwm_ch = 2,
},
// Port F
{
.pin1_gpio.bank = GPIOC,
.pin1_gpio.pin = 8,
Expand Down Expand Up @@ -142,7 +148,7 @@ static void pbdrv_motor_brake(const pbdrv_motor_data_t *data) {
static void pbdrv_motor_run_fwd(const pbdrv_motor_data_t *data, int16_t duty_cycle) {
pbdrv_pwm_dev_t *pwm_dev;
if (pbdrv_pwm_get_dev(data->pin1_pwm_id, &pwm_dev) == PBIO_SUCCESS) {
pbdrv_pwm_set_duty(pwm_dev, data->pin1_pwm_ch, duty_cycle);
pbdrv_pwm_set_duty(pwm_dev, data->pin1_pwm_ch, duty_cycle / 10);
}
pbdrv_gpio_alt(&data->pin1_gpio, data->pin1_alt);
pbdrv_gpio_out_high(&data->pin2_gpio);
Expand All @@ -151,7 +157,7 @@ static void pbdrv_motor_run_fwd(const pbdrv_motor_data_t *data, int16_t duty_cyc
static void pbdrv_motor_run_rev(const pbdrv_motor_data_t *data, int16_t duty_cycle) {
pbdrv_pwm_dev_t *pwm_dev;
if (pbdrv_pwm_get_dev(data->pin2_pwm_id, &pwm_dev) == PBIO_SUCCESS) {
pbdrv_pwm_set_duty(pwm_dev, data->pin2_pwm_ch, duty_cycle);
pbdrv_pwm_set_duty(pwm_dev, data->pin2_pwm_ch, duty_cycle / 10);
}
pbdrv_gpio_out_high(&data->pin1_gpio);
pbdrv_gpio_alt(&data->pin2_gpio, data->pin2_alt);
Expand Down
8 changes: 6 additions & 2 deletions lib/pbio/drv/technic_hub/motor.c
Expand Up @@ -26,6 +26,7 @@ typedef struct {

static const pbdrv_motor_data_t
platform_data[PBDRV_CONFIG_NUM_MOTOR_CONTROLLER] = {
// Port A
{
.pin1_gpio.bank = GPIOA,
.pin1_gpio.pin = 1,
Expand All @@ -35,6 +36,7 @@ static const pbdrv_motor_data_t
.pwm_dev_id = 1,
.pwm_dev_ch = 1,
},
// Port B
{
.pin1_gpio.bank = GPIOA,
.pin1_gpio.pin = 9,
Expand All @@ -44,6 +46,7 @@ static const pbdrv_motor_data_t
.pwm_dev_id = 0,
.pwm_dev_ch = 2,
},
// Port C
{
.pin1_gpio.bank = GPIOB,
.pin1_gpio.pin = 13,
Expand All @@ -53,6 +56,7 @@ static const pbdrv_motor_data_t
.pwm_dev_id = 0,
.pwm_dev_ch = 1,
},
// Port D
{
.pin1_gpio.bank = GPIOA,
.pin1_gpio.pin = 10,
Expand Down Expand Up @@ -103,7 +107,7 @@ static void pbdrv_motor_brake(const pbdrv_motor_data_t *data) {
static void pbdrv_motor_run_fwd(const pbdrv_motor_data_t *data, int16_t duty_cycle) {
pbdrv_pwm_dev_t *pwm_dev;
if (pbdrv_pwm_get_dev(data->pwm_dev_id, &pwm_dev) == PBIO_SUCCESS) {
pbdrv_pwm_set_duty(pwm_dev, data->pwm_dev_ch, duty_cycle);
pbdrv_pwm_set_duty(pwm_dev, data->pwm_dev_ch, duty_cycle / 10);
}
pbdrv_gpio_alt(&data->pin1_gpio, data->alt);
pbdrv_gpio_out_high(&data->pin2_gpio);
Expand All @@ -112,7 +116,7 @@ static void pbdrv_motor_run_fwd(const pbdrv_motor_data_t *data, int16_t duty_cyc
static void pbdrv_motor_run_rev(const pbdrv_motor_data_t *data, int16_t duty_cycle) {
pbdrv_pwm_dev_t *pwm_dev;
if (pbdrv_pwm_get_dev(data->pwm_dev_id, &pwm_dev) == PBIO_SUCCESS) {
pbdrv_pwm_set_duty(pwm_dev, data->pwm_dev_ch, duty_cycle);
pbdrv_pwm_set_duty(pwm_dev, data->pwm_dev_ch, duty_cycle / 10);
}
pbdrv_gpio_out_high(&data->pin1_gpio);
pbdrv_gpio_alt(&data->pin2_gpio, data->alt);
Expand Down
13 changes: 10 additions & 3 deletions lib/pbio/platform/city_hub/platform.c
Expand Up @@ -97,31 +97,38 @@ static void pwm_dev_2_platform_init() {
GPIOB->AFR[1] = (GPIOB->AFR[1] & ~GPIO_AFRH_AFSEL8_Msk) | (2 << GPIO_AFRH_AFSEL8_Pos);
}

// NOTE: Official LEGO firmware uses 1.2 kHz PWM for motors. We have changed to
// 12 kHz to reduce the unpleasant noise (similar to the frequency used by the
// official EV3 firmware).

const pbdrv_pwm_stm32_tim_platform_data_t
pbdrv_pwm_stm32_tim_platform_data[PBDRV_CONFIG_PWM_STM32_TIM_NUM_DEV] = {
{
.platform_init = pwm_dev_0_platform_init,
.TIMx = TIM3,
.prescalar = 4, // results in 12 MHz clock
.period = 10000, // 12MHz divided by 10k makes 1.2 kHz PWM
.period = 1000, // 12 MHz divided by 1k makes 12 kHz PWM
.id = PWM_DEV_0,
// channel 1/3: Port B motor driver; channel 2/4: Port A motor driver
.channels = PBDRV_PWM_STM32_TIM_CHANNEL_1_ENABLE | PBDRV_PWM_STM32_TIM_CHANNEL_2_ENABLE
| PBDRV_PWM_STM32_TIM_CHANNEL_3_ENABLE | PBDRV_PWM_STM32_TIM_CHANNEL_4_ENABLE,
},
{
.platform_init = pwm_dev_1_platform_init,
.TIMx = TIM15,
.prescalar = 4, // results in 12 MHz clock
.period = 10000, // 12MHz divided by 10k makes 1.2 kHz PWM
.period = 10000, // 12 MHz divided by 10k makes 1.2 kHz PWM
.id = PWM_DEV_1,
// channel 1: Green LED; channel 2: Blue LED
.channels = PBDRV_PWM_STM32_TIM_CHANNEL_1_ENABLE | PBDRV_PWM_STM32_TIM_CHANNEL_2_ENABLE,
},
{
.platform_init = pwm_dev_2_platform_init,
.TIMx = TIM16,
.prescalar = 4, // results in 12 MHz clock
.period = 10000, // 12MHz divided by 10k makes 1.2 kHz PWM
.period = 10000, // 12 MHz divided by 10k makes 1.2 kHz PWM
.id = PWM_DEV_2,
// channel 1: Red LED
.channels = PBDRV_PWM_STM32_TIM_CHANNEL_1_ENABLE,
},
};
Expand Down
16 changes: 12 additions & 4 deletions lib/pbio/platform/move_hub/platform.c
Expand Up @@ -139,40 +139,48 @@ static void pwm_dev_3_platform_init() {
GPIOB->AFR[1] = (GPIOB->AFR[1] & ~GPIO_AFRH_AFSEL8_Msk) | (2 << GPIO_AFRH_AFSEL8_Pos);
}

// NOTE: Official LEGO firmware uses 1.2 kHz PWM for motors. We have changed to
// 12 kHz to reduce the unpleasant noise (similar to the frequency used by the
// official EV3 firmware).

const pbdrv_pwm_stm32_tim_platform_data_t
pbdrv_pwm_stm32_tim_platform_data[PBDRV_CONFIG_PWM_STM32_TIM_NUM_DEV] = {
{
.platform_init = pwm_dev_0_platform_init,
.TIMx = TIM1,
.prescalar = 4, // results in 12 MHz clock
.period = 10000, // 12MHz divided by 10k makes 1.2 kHz PWM
.period = 1000, // 12 MHz divided by 1k makes 12 kHz PWM
.id = PWM_DEV_0,
// channel 1/3: Port A motor driver; channel 2/4: Port B motor driver
.channels = PBDRV_PWM_STM32_TIM_CHANNEL_1_ENABLE | PBDRV_PWM_STM32_TIM_CHANNEL_2_ENABLE
| PBDRV_PWM_STM32_TIM_CHANNEL_3_ENABLE | PBDRV_PWM_STM32_TIM_CHANNEL_4_ENABLE,
},
{
.platform_init = pwm_dev_1_platform_init,
.TIMx = TIM3,
.prescalar = 4, // results in 12 MHz clock
.period = 10000, // 12MHz divided by 10k makes 1.2 kHz PWM
.period = 1000, // 12 MHz divided by 1k makes 12 kHz PWM
.id = PWM_DEV_1,
// channel 1/3: Port C motor driver; channel 3/4: Port D motor driver
.channels = PBDRV_PWM_STM32_TIM_CHANNEL_1_ENABLE | PBDRV_PWM_STM32_TIM_CHANNEL_2_ENABLE
| PBDRV_PWM_STM32_TIM_CHANNEL_3_ENABLE | PBDRV_PWM_STM32_TIM_CHANNEL_4_ENABLE,
},
{
.platform_init = pwm_dev_2_platform_init,
.TIMx = TIM15,
.prescalar = 4, // results in 12 MHz clock
.period = 10000, // 12MHz divided by 10k makes 1.2 kHz PWM
.period = 10000, // 12 MHz divided by 10k makes 1.2 kHz PWM
.id = PWM_DEV_2,
// channel 1: Green LED; channel 2: Blue LED
.channels = PBDRV_PWM_STM32_TIM_CHANNEL_1_ENABLE | PBDRV_PWM_STM32_TIM_CHANNEL_2_ENABLE,
},
{
.platform_init = pwm_dev_3_platform_init,
.TIMx = TIM16,
.prescalar = 4, // results in 12 MHz clock
.period = 10000, // 12MHz divided by 10k makes 1.2 kHz PWM
.period = 10000, // 12 MHz divided by 10k makes 1.2 kHz PWM
.id = PWM_DEV_3,
// channel 1: Red LED
.channels = PBDRV_PWM_STM32_TIM_CHANNEL_1_ENABLE,
},
};
Expand Down
13 changes: 10 additions & 3 deletions lib/pbio/platform/prime_hub/platform.c
Expand Up @@ -157,14 +157,19 @@ static void pwm_dev_3_platform_init() {
TIM12->CCR2 = 5;
}

// NOTE: Official LEGO firmware uses 1.2 kHz PWM for motors. We have changed to
// 12 kHz to reduce the unpleasant noise (similar to the frequency used by the
// official EV3 firmware).

const pbdrv_pwm_stm32_tim_platform_data_t
pbdrv_pwm_stm32_tim_platform_data[PBDRV_CONFIG_PWM_STM32_TIM_NUM_DEV] = {
{
.platform_init = pwm_dev_0_platform_init,
.TIMx = TIM1,
.prescalar = 8, // results in 12 MHz clock
.period = 10000, // 12MHz divided by 10k makes 1.2 kHz PWM
.period = 1000, // 12MHz divided by 1k makes 12 kHz PWM
.id = PWM_DEV_0_TIM1,
// channel 1/2: Port A motor driver; channel 3/4: Port B motor driver
.channels = PBDRV_PWM_STM32_TIM_CHANNEL_1_ENABLE | PBDRV_PWM_STM32_TIM_CHANNEL_2_ENABLE
| PBDRV_PWM_STM32_TIM_CHANNEL_3_ENABLE | PBDRV_PWM_STM32_TIM_CHANNEL_4_ENABLE
| PBDRV_PWM_STM32_TIM_CHANNEL_1_INVERT | PBDRV_PWM_STM32_TIM_CHANNEL_2_INVERT
Expand All @@ -174,8 +179,9 @@ const pbdrv_pwm_stm32_tim_platform_data_t
.platform_init = pwm_dev_1_platform_init,
.TIMx = TIM3,
.prescalar = 8, // results in 12 MHz clock
.period = 10000, // 12MHz divided by 10k makes 1.2 kHz PWM
.period = 1000, // 12MHz divided by 1k makes 12 kHz PWM
.id = PWM_DEV_1_TIM3,
// channel 1/2: Port E motor driver; channel 3/4: Port F motor driver
.channels = PBDRV_PWM_STM32_TIM_CHANNEL_1_ENABLE | PBDRV_PWM_STM32_TIM_CHANNEL_2_ENABLE
| PBDRV_PWM_STM32_TIM_CHANNEL_3_ENABLE | PBDRV_PWM_STM32_TIM_CHANNEL_4_ENABLE
| PBDRV_PWM_STM32_TIM_CHANNEL_1_INVERT | PBDRV_PWM_STM32_TIM_CHANNEL_2_INVERT
Expand All @@ -185,8 +191,9 @@ const pbdrv_pwm_stm32_tim_platform_data_t
.platform_init = pwm_dev_2_platform_init,
.TIMx = TIM4,
.prescalar = 8, // results in 12 MHz clock
.period = 10000, // 12MHz divided by 10k makes 1.2 kHz PWM
.period = 1000, // 12MHz divided by 1k makes 12 kHz PWM
.id = PWM_DEV_2_TIM4,
// channel 1/2: Port C motor driver; channel 3/4: Port D motor driver
.channels = PBDRV_PWM_STM32_TIM_CHANNEL_1_ENABLE | PBDRV_PWM_STM32_TIM_CHANNEL_2_ENABLE
| PBDRV_PWM_STM32_TIM_CHANNEL_3_ENABLE | PBDRV_PWM_STM32_TIM_CHANNEL_4_ENABLE
| PBDRV_PWM_STM32_TIM_CHANNEL_1_INVERT | PBDRV_PWM_STM32_TIM_CHANNEL_2_INVERT
Expand Down

0 comments on commit 030dd66

Please sign in to comment.