Skip to content

Commit 3f3fab0

Browse files
committed
drv/pwm: new driver subsystem
This introduces an abstraction layer for PWM devices. Currently this just consists of STM32 TIM devices being used as PWMs. It prepares the way for adding other types of PWM devices. The platform-specific motor and light drivers are converted to use the new APIs. This is one step towards making those drivers more generic.
1 parent 7b2cb3b commit 3f3fab0

File tree

38 files changed

+1009
-673
lines changed

38 files changed

+1009
-673
lines changed

bricks/ev3dev/Makefile

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -261,14 +261,15 @@ PYBRICKS_LIB_SRC_C = $(addprefix lib/,\
261261
contiki-core/sys/timer.c \
262262
ev3dev/src/ev3dev_stretch/lego_port.c \
263263
ev3dev/src/ev3dev_stretch/lego_sensor.c \
264-
ev3dev/src/ev3dev_stretch/sysfs.c \
265264
ev3dev/src/ev3dev_stretch/nxtcolor.c \
265+
ev3dev/src/ev3dev_stretch/sysfs.c \
266266
libfixmath/libfixmath/fix16_sqrt.c \
267267
libfixmath/libfixmath/fix16_str.c \
268268
libfixmath/libfixmath/fix16.c \
269269
libfixmath/libfixmath/uint32.c \
270270
pbio/drv/battery/battery_linux_ev3.c \
271271
pbio/drv/button/button_linux_ev3.c \
272+
pbio/drv/core.c \
272273
pbio/drv/counter/counter_core.c \
273274
pbio/drv/counter/counter_ev3dev_stretch_iio.c \
274275
pbio/drv/ev3dev_stretch/light.c \
@@ -277,9 +278,10 @@ PYBRICKS_LIB_SRC_C = $(addprefix lib/,\
277278
pbio/drv/ioport/ioport_ev3dev_stretch.c \
278279
pbio/platform/ev3dev_stretch/clock.c \
279280
pbio/src/control.c \
281+
pbio/src/dcmotor.c \
280282
pbio/src/drivebase.c \
281283
pbio/src/error.c \
282-
pbio/src/dcmotor.c \
284+
pbio/src/integrator.c \
283285
pbio/src/light.c \
284286
pbio/src/logger.c \
285287
pbio/src/main.c \
@@ -289,9 +291,8 @@ PYBRICKS_LIB_SRC_C = $(addprefix lib/,\
289291
pbio/src/servo.c \
290292
pbio/src/sound.c \
291293
pbio/src/tacho.c \
292-
pbio/src/trajectory.c \
293294
pbio/src/trajectory_ext.c \
294-
pbio/src/integrator.c \
295+
pbio/src/trajectory.c \
295296
)
296297

297298
OBJ = $(PY_O)

bricks/nxt/Makefile

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -162,24 +162,25 @@ PBIO_SRC_C = $(addprefix lib/pbio/,\
162162
drv/$(PBIO_PLATFORM)/motor.c \
163163
drv/battery/battery_nxt.c \
164164
drv/button/button_nxt.c \
165+
drv/core.c \
165166
drv/counter/counter_core.c \
166167
drv/counter/counter_nxt.c \
167168
platform/$(PBIO_PLATFORM)/clock.c \
168169
platform/$(PBIO_PLATFORM)/platform.c \
169170
platform/$(PBIO_PLATFORM)/sys.c \
170171
src/control.c \
172+
src/dcmotor.c \
171173
src/drivebase.c \
172174
src/error.c \
173-
src/dcmotor.c \
175+
src/integrator.c \
174176
src/logger.c \
175177
src/main.c \
176178
src/math.c \
177179
src/motorpoll.c \
178180
src/servo.c \
179181
src/tacho.c \
180-
src/trajectory.c \
181182
src/trajectory_ext.c \
182-
src/integrator.c \
183+
src/trajectory.c \
183184
)
184185

185186
OBJ = $(PY_O) $(addprefix $(BUILD)/, $(SRC_C:.c=.o) $(SRC_S:.s=.o))

bricks/stm32/stm32.mk

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,7 @@ endif
131131
# Required for STM32 library
132132
CFLAGS += -D$(PB_CMSIS_MCU)
133133

134+
CFLAGS += -DSTM32_H='<stm32$(PB_MCU_SERIES_LCASE)xx.h>'
134135
CFLAGS += -DSTM32_HAL_H='<stm32$(PB_MCU_SERIES_LCASE)xx_hal.h>'
135136

136137
# TODO: probably only need no-unicode on movehub
@@ -283,12 +284,15 @@ PBIO_SRC_C = $(addprefix lib/pbio/,\
283284
drv/battery/battery_adc.c \
284285
drv/button/button_adc.c \
285286
drv/button/button_gpio.c \
287+
drv/core.c \
286288
drv/counter/counter_core.c \
287289
drv/counter/counter_stm32f0_gpio_quad_enc.c \
288290
drv/gpio/gpio_stm32f0.c \
289291
drv/gpio/gpio_stm32f4.c \
290292
drv/gpio/gpio_stm32l4.c \
291293
drv/ioport/ioport_lpf2.c \
294+
drv/pwm/pwm_core.c \
295+
drv/pwm/pwm_stm32_tim.c \
292296
drv/uart/uart_stm32f0.c \
293297
drv/uart/uart_stm32f4_ll_irq.c \
294298
drv/uart/uart_stm32l4_ll_dma.c \

lib/pbio/doc/doxygen.conf

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2102,6 +2102,7 @@ INCLUDE_FILE_PATTERNS =
21022102
PREDEFINED = \
21032103
PBIO_CONFIG_ENABLE_DEINIT \
21042104
PBIO_CONFIG_ENABLE_SYS \
2105+
PBDRV_CONFIG_PWM=1
21052106
PBDRV_CONFIG_HAS_PORT_A=1 \
21062107
PBDRV_CONFIG_HAS_PORT_B=1 \
21072108
PBDRV_CONFIG_HAS_PORT_C=1 \

lib/pbio/drv/city_hub/light.c

Lines changed: 9 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -6,66 +6,11 @@
66
#if PBDRV_CONFIG_LIGHT
77

88
#include <pbdrv/light.h>
9+
#include <pbdrv/pwm.h>
910
#include <pbio/config.h>
1011
#include <pbio/error.h>
1112
#include <pbio/port.h>
1213

13-
#include "stm32f030xc.h"
14-
15-
// setup LED PWMs and pins
16-
void _pbdrv_light_init(void) {
17-
// RGB values are 0-255, so multiplying by 5 here to limit brightness to
18-
// 1/5 of max possible without having to do division later. It should also
19-
// give use smoother steps than the official LEGO firmware since we aren't
20-
// jumping by 5s.
21-
TIM15->PSC = 187;
22-
TIM15->ARR = 256 * 5;
23-
TIM15->BDTR |= TIM_BDTR_MOE;
24-
TIM16->PSC = 187;
25-
TIM16->ARR = 256 * 5;
26-
TIM16->BDTR |= TIM_BDTR_MOE;
27-
28-
// red LED on PB8 using TIM16 CH1
29-
GPIOB->MODER = (GPIOB->MODER & ~GPIO_MODER_MODER8_Msk) | (2 << GPIO_MODER_MODER8_Pos);
30-
GPIOB->AFR[1] = (GPIOB->AFR[1] & ~GPIO_AFRH_AFSEL8_Msk) | (2 << GPIO_AFRH_AFSEL8_Pos);
31-
TIM16->CCMR1 |= (0x6 << TIM_CCMR1_OC1M_Pos) | TIM_CCMR1_OC1PE; // PWM Mode 1
32-
TIM16->CCER |= TIM_CCER_CC1E;
33-
34-
// green LED on PB14 using TIM15 CH1
35-
GPIOB->MODER = (GPIOB->MODER & ~GPIO_MODER_MODER14_Msk) | (2 << GPIO_MODER_MODER14_Pos);
36-
GPIOB->AFR[1] = (GPIOB->AFR[1] & ~GPIO_AFRH_AFSEL14_Msk) | (1 << GPIO_AFRH_AFSEL14_Pos);
37-
TIM15->CCMR1 |= (0x6 << TIM_CCMR1_OC1M_Pos) | TIM_CCMR1_OC1PE; // PWM Mode 1
38-
TIM15->CCER |= TIM_CCER_CC1E;
39-
40-
// blue LED on PB15 using TIM15 CH2
41-
GPIOB->MODER = (GPIOB->MODER & ~GPIO_MODER_MODER15_Msk) | (2 << GPIO_MODER_MODER15_Pos);
42-
GPIOB->AFR[1] = (GPIOB->AFR[1] & ~GPIO_AFRH_AFSEL15_Msk) | (1 << GPIO_AFRH_AFSEL15_Pos);
43-
TIM15->CCMR1 |= (0x6 << TIM_CCMR1_OC2M_Pos) | TIM_CCMR1_OC2PE; // PWM Mode 1
44-
TIM15->CCER |= TIM_CCER_CC2E;
45-
46-
TIM16->CR1 |= TIM_CR1_CEN;
47-
TIM16->EGR |= TIM_EGR_UG;
48-
TIM15->CR1 |= TIM_CR1_CEN;
49-
TIM15->EGR |= TIM_EGR_UG;
50-
TIM16->CCR1 = 0;
51-
TIM15->CCR1 = 0;
52-
TIM15->CCR2 = 0;
53-
}
54-
55-
#if PBIO_CONFIG_ENABLE_DEINIT
56-
// turn off the light
57-
void _pbdrv_light_deinit(void) {
58-
TIM15->CR1 &= ~TIM_CR1_CEN;
59-
TIM16->CR1 &= ~TIM_CR1_CEN;
60-
GPIOB->BRR = GPIO_BRR_BR_8;
61-
GPIOB->BRR = GPIO_BRR_BR_14;
62-
GPIOB->BRR = GPIO_BRR_BR_15;
63-
GPIOB->MODER = (GPIOB->MODER & ~GPIO_MODER_MODER8_Msk) | (1 << GPIO_MODER_MODER8_Pos);
64-
GPIOB->MODER = (GPIOB->MODER & ~GPIO_MODER_MODER14_Msk) | (1 << GPIO_MODER_MODER14_Pos);
65-
GPIOB->MODER = (GPIOB->MODER & ~GPIO_MODER_MODER15_Msk) | (1 << GPIO_MODER_MODER15_Pos);
66-
}
67-
#endif
68-
6914
pbio_error_t pbdrv_light_set_rgb(pbio_port_t port, uint8_t r, uint8_t g, uint8_t b) {
7015
if (port == PBIO_PORT_B || port == PBIO_PORT_A) {
7116
// TODO: check for Powered UP Lights connected to ports C/D
@@ -76,9 +21,14 @@ pbio_error_t pbdrv_light_set_rgb(pbio_port_t port, uint8_t r, uint8_t g, uint8_t
7621
return PBIO_ERROR_INVALID_PORT;
7722
}
7823

79-
TIM16->CCR1 = r;
80-
TIM15->CCR1 = g;
81-
TIM15->CCR2 = b;
24+
pbdrv_pwm_dev_t *dev;
25+
if (pbdrv_pwm_get_dev(2, &dev) == PBIO_SUCCESS) {
26+
pbdrv_pwm_set_duty(dev, 1, r);
27+
}
28+
if (pbdrv_pwm_get_dev(1, &dev) == PBIO_SUCCESS) {
29+
pbdrv_pwm_set_duty(dev, 1, g);
30+
pbdrv_pwm_set_duty(dev, 2, b);
31+
}
8232

8333
return PBIO_SUCCESS;
8434
}

lib/pbio/drv/city_hub/motor.c

Lines changed: 20 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -12,48 +12,10 @@
1212
#include "stm32f030xc.h"
1313

1414
#include <pbdrv/motor.h>
15-
#include <pbio/config.h>
16-
17-
void _pbdrv_motor_init(void) {
18-
// TIM3 is used for port C PWM
19-
TIM3->PSC = 3; // divide by 4 (= 3 + 1), so ticks are 12MHz
20-
TIM3->ARR = 10000; // 12MHz divided by 10k makes 1.2kHz PWM
21-
TIM3->BDTR |= TIM_BDTR_MOE;
22-
23-
// port B
24-
// init PWM pins as gpio out low (coasting) and prepare alternate function
25-
GPIOC->MODER = (GPIOC->MODER & ~GPIO_MODER_MODER6_Msk) | (1 << GPIO_MODER_MODER6_Pos);
26-
GPIOC->BRR = GPIO_BRR_BR_6;
27-
GPIOC->MODER = (GPIOC->MODER & ~GPIO_MODER_MODER8_Msk) | (1 << GPIO_MODER_MODER8_Pos);
28-
GPIOC->BRR = GPIO_BRR_BR_8;
29-
GPIOC->AFR[0] = (GPIOC->AFR[0] & ~GPIO_AFRL_AFSEL6_Msk) | (0 << GPIO_AFRL_AFSEL6_Pos);
30-
GPIOC->AFR[1] = (GPIOC->AFR[1] & ~GPIO_AFRH_AFSEL8_Msk) | (0 << GPIO_AFRH_AFSEL8_Pos);
31-
TIM3->CCR1 = 0;
32-
TIM3->CCR3 = 0;
33-
TIM3->CCMR1 |= (6 << TIM_CCMR1_OC1M_Pos) | TIM_CCMR1_OC1PE; // PWM mode 1
34-
TIM3->CCER |= TIM_CCER_CC1E;
35-
TIM3->CCMR2 |= (6 << TIM_CCMR2_OC3M_Pos) | TIM_CCMR2_OC3PE; // PWM mode 1
36-
TIM3->CCER |= TIM_CCER_CC3E;
37-
38-
// port A
39-
// init PWM pins as gpio out low (coasting) and prepare alternate function
40-
GPIOC->MODER = (GPIOC->MODER & ~GPIO_MODER_MODER7_Msk) | (1 << GPIO_MODER_MODER7_Pos);
41-
GPIOC->BRR = GPIO_BRR_BR_7;
42-
GPIOC->MODER = (GPIOC->MODER & ~GPIO_MODER_MODER9_Msk) | (1 << GPIO_MODER_MODER9_Pos);
43-
GPIOC->BRR = GPIO_BRR_BR_9;
44-
GPIOC->AFR[0] = (GPIOC->AFR[0] & ~GPIO_AFRL_AFSEL7_Msk) | (0 << GPIO_AFRL_AFSEL7_Pos);
45-
GPIOC->AFR[1] = (GPIOC->AFR[1] & ~GPIO_AFRH_AFSEL9_Msk) | (0 << GPIO_AFRH_AFSEL9_Pos);
46-
TIM3->CCR2 = 0;
47-
TIM3->CCR4 = 0;
48-
TIM3->CCMR1 |= (6 << TIM_CCMR1_OC2M_Pos) | TIM_CCMR1_OC2PE; // PWM mode 1
49-
TIM3->CCER |= TIM_CCER_CC2E;
50-
TIM3->CCMR2 |= (6 << TIM_CCMR2_OC4M_Pos) | TIM_CCMR2_OC4PE; // PWM mode 1
51-
TIM3->CCER |= TIM_CCER_CC4E;
52-
53-
// apply settings and start timer
54-
TIM3->CR1 |= TIM_CR1_CEN;
55-
TIM3->EGR |= TIM_EGR_UG;
56-
}
15+
#include <pbdrv/pwm.h>
16+
#include <pbio/error.h>
17+
#include <pbio/iodev.h>
18+
#include <pbio/port.h>
5719

5820
static pbio_iodev_t *get_iodev(pbio_port_t port) {
5921
pbio_iodev_t *iodev;
@@ -115,18 +77,24 @@ static void pbdrv_motor_brake(pbio_port_t port) {
11577
}
11678

11779
static void pbdrv_motor_run_fwd(pbio_port_t port, int16_t duty_cycle) { // duty is pos
80+
pbdrv_pwm_dev_t *dev;
81+
11882
// one pin as out, high and the other as PWM
11983
switch (port) {
12084
case PBIO_PORT_B:
12185
GPIOC->MODER = (GPIOC->MODER & ~GPIO_MODER_MODER6_Msk) | (1 << GPIO_MODER_MODER6_Pos);
12286
GPIOC->BSRR = GPIO_BSRR_BS_6;
123-
TIM3->CCR3 = 10000 - duty_cycle;
87+
if (pbdrv_pwm_get_dev(0, &dev) == PBIO_SUCCESS) {
88+
pbdrv_pwm_set_duty(dev, 3, 10000 - duty_cycle);
89+
}
12490
GPIOC->MODER = (GPIOC->MODER & ~GPIO_MODER_MODER8_Msk) | (2 << GPIO_MODER_MODER8_Pos);
12591
break;
12692
case PBIO_PORT_A:
12793
GPIOC->MODER = (GPIOC->MODER & ~GPIO_MODER_MODER7_Msk) | (1 << GPIO_MODER_MODER7_Pos);
12894
GPIOC->BSRR = GPIO_BSRR_BS_7;
129-
TIM3->CCR4 = 10000 - duty_cycle;
95+
if (pbdrv_pwm_get_dev(0, &dev) == PBIO_SUCCESS) {
96+
pbdrv_pwm_set_duty(dev, 4, 10000 - duty_cycle);
97+
}
13098
GPIOC->MODER = (GPIOC->MODER & ~GPIO_MODER_MODER9_Msk) | (2 << GPIO_MODER_MODER9_Pos);
13199
break;
132100
default:
@@ -135,18 +103,24 @@ static void pbdrv_motor_run_fwd(pbio_port_t port, int16_t duty_cycle) { // duty
135103
}
136104

137105
static void pbdrv_motor_run_rev(pbio_port_t port, int16_t duty_cycle) { // duty is neg
106+
pbdrv_pwm_dev_t *dev;
107+
138108
// one pin as out, high and the other as PWM
139109
switch (port) {
140110
case PBIO_PORT_B:
141111
GPIOC->MODER = (GPIOC->MODER & ~GPIO_MODER_MODER8_Msk) | (1 << GPIO_MODER_MODER8_Pos);
142112
GPIOC->BSRR = GPIO_BSRR_BS_8;
143-
TIM3->CCR1 = 10000 + duty_cycle;
113+
if (pbdrv_pwm_get_dev(0, &dev) == PBIO_SUCCESS) {
114+
pbdrv_pwm_set_duty(dev, 1, 10000 + duty_cycle);
115+
}
144116
GPIOC->MODER = (GPIOC->MODER & ~GPIO_MODER_MODER6_Msk) | (2 << GPIO_MODER_MODER6_Pos);
145117
break;
146118
case PBIO_PORT_A:
147119
GPIOC->MODER = (GPIOC->MODER & ~GPIO_MODER_MODER9_Msk) | (1 << GPIO_MODER_MODER9_Pos);
148120
GPIOC->BSRR = GPIO_BSRR_BS_9;
149-
TIM3->CCR2 = 10000 + duty_cycle;
121+
if (pbdrv_pwm_get_dev(0, &dev) == PBIO_SUCCESS) {
122+
pbdrv_pwm_set_duty(dev, 2, 10000 + duty_cycle);
123+
}
150124
GPIOC->MODER = (GPIOC->MODER & ~GPIO_MODER_MODER7_Msk) | (2 << GPIO_MODER_MODER7_Pos);
151125
break;
152126
default:
@@ -192,19 +166,4 @@ pbio_error_t pbdrv_motor_setup(pbio_port_t port, bool is_servo) {
192166
return PBIO_SUCCESS;
193167
}
194168

195-
#if PBIO_CONFIG_ENABLE_DEINIT
196-
void _pbdrv_motor_deinit(void) {
197-
// disable the PWM timers
198-
TIM3->CR1 &= TIM_CR1_CEN;
199-
GPIOC->MODER = (GPIOC->MODER & ~GPIO_MODER_MODER6_Msk) | (1 << GPIO_MODER_MODER6_Pos);
200-
GPIOC->BRR = GPIO_BRR_BR_6;
201-
GPIOC->MODER = (GPIOC->MODER & ~GPIO_MODER_MODER8_Msk) | (1 << GPIO_MODER_MODER8_Pos);
202-
GPIOC->BRR = GPIO_BRR_BR_8;
203-
GPIOC->MODER = (GPIOC->MODER & ~GPIO_MODER_MODER7_Msk) | (1 << GPIO_MODER_MODER7_Pos);
204-
GPIOC->BRR = GPIO_BRR_BR_7;
205-
GPIOC->MODER = (GPIOC->MODER & ~GPIO_MODER_MODER9_Msk) | (1 << GPIO_MODER_MODER9_Pos);
206-
GPIOC->BRR = GPIO_BRR_BR_9;
207-
}
208-
#endif
209-
210169
#endif // PBDRV_CONFIG_MOTOR

lib/pbio/drv/core.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
// SPDX-License-Identifier: MIT
2+
// Copyright (c) 2020 The Pybricks Authors
3+
4+
#include <pbdrv/pwm.h>
5+
6+
/** Initializes all enabled drivers. */
7+
void pbdrv_init() {
8+
pbdrv_pwm_init();
9+
}

lib/pbio/drv/cplus_hub/light.c

Lines changed: 11 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -6,64 +6,28 @@
66
#if PBDRV_CONFIG_LIGHT
77

88
#include <pbdrv/light.h>
9+
#include <pbdrv/pwm.h>
910
#include <pbio/config.h>
1011
#include <pbio/error.h>
1112
#include <pbio/port.h>
1213

13-
#include "stm32l4xx_hal.h"
14-
15-
extern TIM_HandleTypeDef *cplus_hub_htim1;
16-
extern TIM_HandleTypeDef *cplus_hub_htim15;
17-
extern TIM_HandleTypeDef *cplus_hub_htim16;
18-
19-
// setup LED PWMs and pins
20-
void _pbdrv_light_init(void) {
21-
TIM_OC_InitTypeDef tim_oc_init = { 0 };
22-
23-
tim_oc_init.OCMode = TIM_OCMODE_PWM1;
24-
tim_oc_init.OCPolarity = TIM_OCPOLARITY_LOW;
25-
26-
// red LED on PB15 using TIM15 CH2
27-
GPIOB->MODER = (GPIOB->MODER & ~GPIO_MODER_MODE15_Msk) | (2 << GPIO_MODER_MODE15_Pos);
28-
GPIOB->AFR[1] = (GPIOB->AFR[1] & ~GPIO_AFRH_AFSEL15_Msk) | (14 << GPIO_AFRH_AFSEL15_Pos);
29-
HAL_TIM_PWM_ConfigChannel(cplus_hub_htim15, &tim_oc_init, TIM_CHANNEL_2);
30-
HAL_TIM_PWM_Start(cplus_hub_htim15, TIM_CHANNEL_2);
31-
32-
// green LED on PA11 using TIM1 CH4
33-
GPIOA->MODER = (GPIOA->MODER & ~GPIO_MODER_MODE11_Msk) | (2 << GPIO_MODER_MODE11_Pos);
34-
GPIOA->AFR[1] = (GPIOA->AFR[1] & ~GPIO_AFRH_AFSEL11_Msk) | (1 << GPIO_AFRH_AFSEL11_Pos);
35-
HAL_TIM_PWM_ConfigChannel(cplus_hub_htim1, &tim_oc_init, TIM_CHANNEL_4);
36-
HAL_TIM_PWM_Start(cplus_hub_htim1, TIM_CHANNEL_4);
37-
38-
// blue LED on PA6 using TIM16 CH1
39-
GPIOA->MODER = (GPIOA->MODER & ~GPIO_MODER_MODE6_Msk) | (2 << GPIO_MODER_MODE6_Pos);
40-
GPIOA->AFR[0] = (GPIOA->AFR[0] & ~GPIO_AFRL_AFSEL6_Msk) | (14 << GPIO_AFRL_AFSEL6_Pos);
41-
HAL_TIM_PWM_ConfigChannel(cplus_hub_htim16, &tim_oc_init, TIM_CHANNEL_1);
42-
HAL_TIM_PWM_Start(cplus_hub_htim16, TIM_CHANNEL_1);
43-
}
44-
45-
#if PBIO_CONFIG_ENABLE_DEINIT
46-
// turn off the light
47-
void _pbdrv_light_deinit(void) {
48-
HAL_TIM_PWM_Stop(cplus_hub_htim16, TIM_CHANNEL_1);
49-
HAL_TIM_PWM_Stop(cplus_hub_htim1, TIM_CHANNEL_4);
50-
HAL_TIM_PWM_Stop(cplus_hub_htim15, TIM_CHANNEL_2);
51-
GPIOB->MODER = (GPIOB->MODER & ~GPIO_MODER_MODE15_Msk) | (1 << GPIO_MODER_MODE15_Pos);
52-
GPIOA->MODER = (GPIOA->MODER & ~GPIO_MODER_MODE11_Msk) | (1 << GPIO_MODER_MODE11_Pos);
53-
GPIOA->MODER = (GPIOA->MODER & ~GPIO_MODER_MODE6_Msk) | (1 << GPIO_MODER_MODE6_Pos);
54-
}
55-
#endif
56-
5714
pbio_error_t pbdrv_light_set_rgb(pbio_port_t port, uint8_t r, uint8_t g, uint8_t b) {
5815
if (port != PBIO_PORT_SELF) {
5916
return PBIO_ERROR_INVALID_PORT;
6017
}
6118

6219
// Timers have period of 10000 and we want period / 5 as max brightness.
6320

64-
TIM15->CCR2 = 10000 - r * 2000 / 255;
65-
TIM1->CCR4 = 10000 - g * 2000 / 255;
66-
TIM16->CCR1 = 10000 - b * 2000 / 255;
21+
pbdrv_pwm_dev_t *dev;
22+
if (pbdrv_pwm_get_dev(1, &dev) == PBIO_SUCCESS) {
23+
pbdrv_pwm_set_duty(dev, 2, 10000 - r * 2000 / 255);
24+
}
25+
if (pbdrv_pwm_get_dev(0, &dev) == PBIO_SUCCESS) {
26+
pbdrv_pwm_set_duty(dev, 4, 10000 - g * 2000 / 255);
27+
}
28+
if (pbdrv_pwm_get_dev(2, &dev) == PBIO_SUCCESS) {
29+
pbdrv_pwm_set_duty(dev, 1, 10000 - b * 2000 / 255);
30+
}
6731

6832
return PBIO_SUCCESS;
6933
}

0 commit comments

Comments
 (0)