@@ -55,11 +55,11 @@ static const char *TAG = "pwm";
55
55
#define AHEAD_TICKS3 2
56
56
#define MAX_TICKS 10000000ul
57
57
58
- #define PWM_VERSION "PWM v3.2 "
58
+ #define PWM_VERSION "PWM v3.4 "
59
59
60
60
typedef struct {
61
61
uint32_t duty ; /*!< pwm duty for each channel */
62
- int16_t phase ; /*!< pwm phase for each channel */
62
+ float phase ; /*!< pwm phase for each channel */
63
63
uint8_t io_num ; /*!< pwm io_num for each channel */
64
64
} pwm_info_t ;
65
65
@@ -113,13 +113,13 @@ static void pwm_phase_init(void)
113
113
114
114
for (i = 0 ; i < pwm_obj -> channel_num ; i ++ ) {
115
115
if (-180 < pwm_obj -> pwm_info [i ].phase && pwm_obj -> pwm_info [i ].phase < 0 ) {
116
- time_delay = 0 - ((0 - pwm_obj -> pwm_info [i ].phase ) * pwm_obj -> depth / 360 );
116
+ time_delay = ( int32_t )( 0 - ((0 - pwm_obj -> pwm_info [i ].phase ) * pwm_obj -> depth / 360.0 ) );
117
117
} else if (pwm_obj -> pwm_info [i ].phase == 0 ) {
118
118
continue ;
119
- } else if (180 > pwm_obj -> pwm_info [i ].phase && pwm_obj -> pwm_info [i ].phase > 0 ) {
120
- time_delay = pwm_obj -> pwm_info [i ].phase * pwm_obj -> depth / 360 ;
119
+ } else if (180 >= pwm_obj -> pwm_info [i ].phase && pwm_obj -> pwm_info [i ].phase > 0 ) {
120
+ time_delay = ( int32_t )( pwm_obj -> pwm_info [i ].phase * pwm_obj -> depth / 360.0 ) ;
121
121
} else {
122
- ESP_LOGE (TAG , "channel[%d] phase error %d , valid ramge from (-180,180) \n" , i , pwm_obj -> pwm_info [i ].phase );
122
+ ESP_LOGE (TAG , "channel[%d] phase error %f , valid ramge from (-180,180] \n" , i , pwm_obj -> pwm_info [i ].phase );
123
123
continue ;
124
124
}
125
125
@@ -224,7 +224,7 @@ esp_err_t pwm_set_period_duties(uint32_t period, uint32_t *duties)
224
224
return ESP_OK ;
225
225
}
226
226
227
- esp_err_t pwm_set_phase (uint8_t channel_num , int16_t phase )
227
+ esp_err_t pwm_set_phase (uint8_t channel_num , float phase )
228
228
{
229
229
PWM_CHECK (channel_num < pwm_obj -> channel_num , "Channel num error" , ESP_ERR_INVALID_ARG );
230
230
@@ -233,7 +233,7 @@ esp_err_t pwm_set_phase(uint8_t channel_num, int16_t phase)
233
233
return ESP_OK ;
234
234
}
235
235
236
- esp_err_t pwm_set_phases (int16_t * phases )
236
+ esp_err_t pwm_set_phases (float * phases )
237
237
{
238
238
uint8_t i ;
239
239
PWM_CHECK (NULL != phases , "Pointer is empty" , ESP_ERR_INVALID_ARG );
@@ -246,7 +246,7 @@ esp_err_t pwm_set_phases(int16_t *phases)
246
246
return ESP_OK ;
247
247
}
248
248
249
- esp_err_t pwm_get_phase (uint8_t channel_num , uint16_t * phase_p )
249
+ esp_err_t pwm_get_phase (uint8_t channel_num , float * phase_p )
250
250
{
251
251
PWM_CHECK (channel_num < pwm_obj -> channel_num , "Channel num error" , ESP_ERR_INVALID_ARG );
252
252
PWM_CHECK (NULL != phase_p , "Pointer is empty" , ESP_ERR_INVALID_ARG );
@@ -259,9 +259,7 @@ esp_err_t pwm_get_phase(uint8_t channel_num, uint16_t *phase_p)
259
259
static void pwm_timer_enable (uint8_t enable )
260
260
{
261
261
if (0 == enable ) {
262
- ENTER_CRITICAL ();
263
262
REG_WRITE (WDEVTSF0TIMER_ENA , REG_READ (WDEVTSF0TIMER_ENA ) & (~WDEV_TSF0TIMER_ENA ));
264
- EXIT_CRITICAL ();
265
263
} else {
266
264
REG_WRITE (WDEVTSF0TIMER_ENA , WDEV_TSF0TIMER_ENA );
267
265
}
@@ -310,14 +308,20 @@ static void IRAM_ATTR pwm_timer_intr_handler(void)
310
308
pwm_obj -> this_target = AHEAD_TICKS1 + AHEAD_TICKS3 ;
311
309
}
312
310
311
+ REG_WRITE (WDEVSLEEP0_CONF , REG_READ (WDEVSLEEP0_CONF ) & (~WDEV_TSFUP0_ENA ));
312
+ REG_WRITE (WDEVTSF0TIMER_ENA , REG_READ (WDEVTSF0TIMER_ENA ) & (~WDEV_TSF0TIMER_ENA ));
313
313
REG_WRITE (WDEVTSFSW0_LO , 0 );
314
314
//WARNING, pwm_obj->this_target - AHEAD_TICKS1 should be bigger than 2
315
315
REG_WRITE (WDEVTSF0_TIMER_LO , pwm_obj -> this_target - AHEAD_TICKS1 );
316
316
REG_WRITE (WDEVTSF0TIMER_ENA , WDEV_TSF0TIMER_ENA );
317
+ REG_WRITE (WDEVSLEEP0_CONF , REG_READ (WDEVSLEEP0_CONF ) | WDEV_TSFUP0_ENA );
317
318
}
318
319
319
320
static void pwm_timer_start (uint32_t period )
320
321
{
322
+ ENTER_CRITICAL ();
323
+ REG_WRITE (WDEVSLEEP0_CONF , REG_READ (WDEVSLEEP0_CONF ) & (~WDEV_TSFUP0_ENA ));
324
+ REG_WRITE (WDEVTSF0TIMER_ENA , REG_READ (WDEVTSF0TIMER_ENA ) & (~WDEV_TSF0TIMER_ENA ));
321
325
// suspend all task to void timer interrupt missed
322
326
// TODO, do we need lock interrupt here, I think interrupt context will not take 1ms long
323
327
// time low field to 0
@@ -334,8 +338,11 @@ static void pwm_timer_start(uint32_t period)
334
338
pwm_obj -> this_target = US_TO_TICKS (period );
335
339
// WARNING: pwm_obj->this_target should bigger than AHEAD_TICKS1
336
340
REG_WRITE (WDEVTSF0_TIMER_LO , pwm_obj -> this_target - AHEAD_TICKS1 );
337
- // enable timer
341
+ REG_WRITE (WDEVTSF0TIMER_ENA , WDEV_TSF0TIMER_ENA );
342
+ REG_WRITE (WDEVSLEEP0_CONF , REG_READ (WDEVSLEEP0_CONF ) | WDEV_TSFUP0_ENA );
343
+ //enable timer
338
344
pwm_timer_enable (1 );
345
+ EXIT_CRITICAL ();
339
346
}
340
347
341
348
static void pwm_timer_register (void (* handle )(void ))
@@ -573,7 +580,9 @@ esp_err_t pwm_stop(uint32_t stop_level_mask)
573
580
{
574
581
int16_t i = 0 ;
575
582
583
+ ENTER_CRITICAL ();
576
584
pwm_timer_enable (0 );
585
+ EXIT_CRITICAL ();
577
586
uint32_t level_set = REG_READ (PERIPHS_GPIO_BASEADDR + GPIO_OUT_ADDRESS );
578
587
579
588
for (i = 0 ; i < pwm_obj -> channel_num ; i ++ ) {
0 commit comments