@@ -71,15 +71,14 @@ STATIC ledc_timer_config_t timers[PWM_TIMER_MAX];
71
71
#define TIMER_IDX_TO_MODE (timer_idx ) (timer_idx / LEDC_TIMER_MAX)
72
72
#define TIMER_IDX_TO_TIMER (timer_idx ) (timer_idx % LEDC_TIMER_MAX)
73
73
74
- // Params for PW operation
74
+ // Params for PWM operation
75
75
// 5khz is default frequency
76
- #define PWFREQ (5000)
77
-
78
- // 10-bit resolution (compatible with esp8266 PWM)
79
- #define PWRES (LEDC_TIMER_10_BIT)
76
+ #define PWM_FREQ (5000)
77
+ // default 10-bit resolution (compatible with esp8266 PWM)
78
+ #define PWM_RES_10_BIT (LEDC_TIMER_10_BIT)
80
79
81
80
// Maximum duty value on 10-bit resolution
82
- #define MAX_DUTY_U10 ((1 << PWRES ) - 1)
81
+ #define MAX_DUTY_U10 ((1 << PWM_RES_10_BIT ) - 1)
83
82
// https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/peripherals/ledc.html#supported-range-of-frequency-and-duty-resolutions
84
83
// duty() uses 10-bit resolution or less
85
84
// duty_u16() and duty_ns() use 16-bit resolution or less
@@ -94,8 +93,6 @@ STATIC ledc_timer_config_t timers[PWM_TIMER_MAX];
94
93
#define UI_RES_16_BIT (16)
95
94
// Maximum duty value on highest user interface resolution
96
95
#define UI_MAX_DUTY ((1 << UI_RES_16_BIT) - 1)
97
- // How much to shift from the HIGHEST_PWM_RES duty resolution to the user interface duty resolution UI_RES_16_BIT
98
- #define UI_RES_SHIFT (UI_RES_16_BIT - HIGHEST_PWM_RES) // 0 for ESP32, 2 for S2, S3, C3
99
96
100
97
// If the PWM frequency is less than EMPIRIC_FREQ, then LEDC_REF_CLK_HZ(1 MHz) source is used, else LEDC_APB_CLK_HZ(80 MHz) source is used
101
98
#define EMPIRIC_FREQ (10) // Hz
@@ -111,7 +108,7 @@ typedef struct _machine_pwm_obj_t {
111
108
int mode ;
112
109
int channel ;
113
110
int timer ;
114
- int duty_x ; // PWRES if duty(), HIGHEST_PWM_RES if duty_u16(), -HIGHEST_PWM_RES if duty_ns()
111
+ int duty_x ; // PWM_RES_10_BIT if duty(), UI_RES_16_BIT if duty_u16(), -UI_RES_16_BIT if duty_ns()
115
112
int duty_u10 ; // stored values from previous duty setters
116
113
int duty_u16 ; // - / -
117
114
int duty_ns ; // - / -
@@ -264,11 +261,11 @@ STATIC void set_freq(machine_pwm_obj_t *self, unsigned int freq, ledc_timer_conf
264
261
265
262
// Save the same duty cycle when frequency is changed
266
263
if (save_duty_resolution != timer -> duty_resolution ) {
267
- if (self -> duty_x == HIGHEST_PWM_RES ) {
264
+ if (self -> duty_x == UI_RES_16_BIT ) {
268
265
set_duty_u16 (self , self -> duty_u16 );
269
- } else if (self -> duty_x == PWRES ) {
266
+ } else if (self -> duty_x == PWM_RES_10_BIT ) {
270
267
set_duty_u10 (self , self -> duty_u10 );
271
- } else if (self -> duty_x == - HIGHEST_PWM_RES ) {
268
+ } else if (self -> duty_x == - UI_RES_16_BIT ) {
272
269
set_duty_ns (self , self -> duty_ns );
273
270
}
274
271
}
@@ -296,7 +293,7 @@ STATIC int duty_to_ns(machine_pwm_obj_t *self, int duty) {
296
293
#define get_duty_raw (self ) ledc_get_duty(self->mode, self->channel)
297
294
298
295
STATIC uint32_t get_duty_u16 (machine_pwm_obj_t * self ) {
299
- return ledc_get_duty (self -> mode , self -> channel ) << (HIGHEST_PWM_RES + UI_RES_SHIFT - timers [TIMER_IDX (self -> mode , self -> timer )].duty_resolution );
296
+ return ledc_get_duty (self -> mode , self -> channel ) << (UI_RES_16_BIT - timers [TIMER_IDX (self -> mode , self -> timer )].duty_resolution );
300
297
}
301
298
302
299
STATIC uint32_t get_duty_u10 (machine_pwm_obj_t * self ) {
@@ -312,7 +309,7 @@ STATIC void set_duty_u16(machine_pwm_obj_t *self, int duty) {
312
309
mp_raise_msg_varg (& mp_type_ValueError , MP_ERROR_TEXT ("duty_u16 must be from 0 to %d" ), UI_MAX_DUTY );
313
310
}
314
311
ledc_timer_config_t timer = timers [TIMER_IDX (self -> mode , self -> timer )];
315
- int channel_duty = duty >> (HIGHEST_PWM_RES + UI_RES_SHIFT - timer .duty_resolution );
312
+ int channel_duty = duty >> (UI_RES_16_BIT - timer .duty_resolution );
316
313
int max_duty = (1 << timer .duty_resolution ) - 1 ;
317
314
if (channel_duty < 0 ) {
318
315
channel_duty = 0 ;
@@ -336,16 +333,16 @@ STATIC void set_duty_u16(machine_pwm_obj_t *self, int duty) {
336
333
}
337
334
*/
338
335
339
- self -> duty_x = HIGHEST_PWM_RES ;
336
+ self -> duty_x = UI_RES_16_BIT ;
340
337
self -> duty_u16 = duty ;
341
338
}
342
339
343
340
STATIC void set_duty_u10 (machine_pwm_obj_t * self , int duty ) {
344
341
if ((duty < 0 ) || (duty > MAX_DUTY_U10 )) {
345
342
mp_raise_msg_varg (& mp_type_ValueError , MP_ERROR_TEXT ("duty must be from 0 to %u" ), MAX_DUTY_U10 );
346
343
}
347
- set_duty_u16 (self , duty << (HIGHEST_PWM_RES + UI_RES_SHIFT - PWRES ));
348
- self -> duty_x = PWRES ;
344
+ set_duty_u16 (self , duty << (UI_RES_16_BIT - LEDC_TIMER_10_BIT ));
345
+ self -> duty_x = PWM_RES_10_BIT ;
349
346
self -> duty_u10 = duty ;
350
347
}
351
348
@@ -354,7 +351,7 @@ STATIC void set_duty_ns(machine_pwm_obj_t *self, int ns) {
354
351
mp_raise_msg_varg (& mp_type_ValueError , MP_ERROR_TEXT ("duty_ns must be from 0 to %d ns" ), duty_to_ns (self , UI_MAX_DUTY ));
355
352
}
356
353
set_duty_u16 (self , ns_to_duty (self , ns ));
357
- self -> duty_x = - HIGHEST_PWM_RES ;
354
+ self -> duty_x = - UI_RES_16_BIT ;
358
355
self -> duty_ns = ns ;
359
356
}
360
357
@@ -425,9 +422,9 @@ STATIC void mp_machine_pwm_print(const mp_print_t *print, mp_obj_t self_in, mp_p
425
422
if (self -> active ) {
426
423
mp_printf (print , ", freq=%u" , ledc_get_freq (self -> mode , self -> timer ));
427
424
428
- if (self -> duty_x == PWRES ) {
425
+ if (self -> duty_x == PWM_RES_10_BIT ) {
429
426
mp_printf (print , ", duty=%d" , get_duty_u10 (self ));
430
- } else if (self -> duty_x == - HIGHEST_PWM_RES ) {
427
+ } else if (self -> duty_x == - UI_RES_16_BIT ) {
431
428
mp_printf (print , ", duty_ns=%d" , get_duty_ns (self ));
432
429
} else {
433
430
mp_printf (print , ", duty_u16=%d" , get_duty_u16 (self ));
@@ -479,7 +476,7 @@ STATIC void mp_machine_pwm_init_helper(machine_pwm_obj_t *self,
479
476
freq = timers [chans [channel_idx ].timer_idx ].freq_hz ;
480
477
}
481
478
if (freq <= 0 ) {
482
- freq = PWFREQ ;
479
+ freq = PWM_FREQ ;
483
480
}
484
481
}
485
482
if ((freq <= 0 ) || (freq > 40000000 )) {
@@ -536,7 +533,7 @@ STATIC void mp_machine_pwm_init_helper(machine_pwm_obj_t *self,
536
533
} else if (duty != -1 ) {
537
534
set_duty_u10 (self , duty );
538
535
} else if (self -> duty_x == 0 ) {
539
- set_duty_u10 (self , (1 << PWRES ) / 2 ); // 50%
536
+ set_duty_u10 (self , (1 << PWM_RES_10_BIT ) / 2 ); // 50%
540
537
}
541
538
}
542
539
0 commit comments