33#ifdef HF_MCU_FAMILY_ESP32
34#include "driver/ledc.h"
122 virtual ~EspPwm() noexcept override;
323 float phase_shift_degrees) noexcept override;
349 hf_u8_t resolution_bits) noexcept;
361 hf_u8_t preferred_resolution) noexcept;
388 hf_u8_t resolution_bits) noexcept;
468 hf_u32_t deadtime_ns) noexcept override;
655 void* user_data =
nullptr) noexcept;
729 : configured(false), enabled(false), assigned_timer(0xFF), raw_duty_value(0),
732 description(
nullptr), fade_callback(
nullptr) {}
882 static bool IRAM_ATTR
LedcFadeEndCallback(
const ledc_cb_param_t* param,
void* user_arg)
noexcept;
915 hf_u8_t resolution_bits) const noexcept;
933 : frequency_hz(freq), resolution_bits(res), clock_source(clk), timer_id(timer) {}
961 const ValidationContext& context)
const noexcept;
998 hf_u8_t resolution_bits)
const noexcept;
1029 hf_u8_t resolution_bits)
noexcept;
Abstract base class for PWM implementations in the HardFOC system.
hf_pwm_err_t
Definition BasePwm.h:76
@ PWM_ERR_INVALID_PARAMETER
ESP32 PWM type definitions for LEDC peripheral hardware abstraction.
static constexpr uint8_t HF_PWM_MAX_TIMERS
Definition EspTypes_PWM.h:57
static constexpr uint8_t HF_PWM_MAX_CHANNELS
Definition EspTypes_PWM.h:55
hf_pwm_mode_t
ESP32 PWM mode configuration.
Definition EspTypes_PWM.h:122
hf_pwm_eviction_decision_t(*)(const hf_pwm_eviction_request_t &request, void *user_data) hf_pwm_eviction_callback_t
Callback function for eviction consent.
Definition EspTypes_PWM.h:197
static constexpr uint32_t HF_PWM_MIN_FREQUENCY
Definition EspTypes_PWM.h:59
hf_pwm_eviction_policy_t
Timer eviction policy for resource management.
Definition EspTypes_PWM.h:147
hf_pwm_clock_source_t
ESP32 PWM clock source selection with frequency and constraint details.
Definition EspTypes_PWM.h:102
@ HF_PWM_CLK_SRC_APB
APB clock (80MHz) - recommended for most uses.
@ HF_PWM_CLK_SRC_DEFAULT
Default clock source (typically APB_CLK)
hf_pwm_channel_priority_t
Channel priority levels for eviction decisions.
Definition EspTypes_PWM.h:157
@ PRIORITY_NORMAL
Normal priority - default.
static constexpr uint8_t HF_PWM_MAX_RESOLUTION
Definition EspTypes_PWM.h:58
static constexpr uint32_t HF_PWM_MAX_FREQUENCY
Definition EspTypes_PWM.h:61
uint32_t hf_u32_t
Platform-agnostic 32-bit unsigned integer type.
Definition HardwareTypes.h:52
uint8_t hf_u8_t
Platform-agnostic 8-bit unsigned integer type.
Definition HardwareTypes.h:40
int8_t hf_i8_t
Platform-agnostic 8-bit signed integer type.
Definition HardwareTypes.h:64
hf_u32_t hf_channel_id_t
Platform-agnostic channel identifier type.
Definition HardwareTypes.h:163
hf_u32_t hf_frequency_hz_t
Platform-agnostic frequency type (in Hz).
Definition HardwareTypes.h:145
Abstract base class for PWM implementations.
Definition BasePwm.h:182
ESP32 PWM implementation using LEDC peripheral with comprehensive ESP32 variant support.
Definition EspPwm.h:96
hf_pwm_err_t ConfigurePlatformChannel(hf_channel_id_t channel_id, const hf_pwm_channel_config_t &config, hf_u8_t timer_id) noexcept
Configure platform channel.
Definition EspPwm.cpp:1954
hf_u8_t GetResolution(hf_channel_id_t channel_id) const noexcept
Get current PWM resolution for a channel.
Definition EspPwm.cpp:990
bool IsChannelEnabled(hf_channel_id_t channel_id) const noexcept override
Check if a PWM channel is currently enabled.
Definition EspPwm.cpp:463
hf_i8_t AttemptSafeEviction(hf_u32_t frequency_hz, hf_u8_t resolution_bits) noexcept
Attempt safe timer eviction based on user policy.
Definition EspPwm.cpp:2537
bool IsClockSourceCompatible(hf_pwm_clock_source_t timer_clock, hf_pwm_clock_source_t requested_clock) const noexcept
Check if two clock sources are compatible for timer sharing.
Definition EspPwm.cpp:2281
hf_pwm_err_t SetChannelFadeCallback(hf_channel_id_t channel_id, void(*callback)(hf_channel_id_t)) noexcept
Set per-channel callback for PWM fade completion events.
Definition EspPwm.cpp:1353
hf_pwm_err_t StartAll() noexcept override
Start all configured PWM channels simultaneously.
Definition EspPwm.cpp:1120
static constexpr hf_u8_t MAX_CHANNELS
Maximum PWM channels.
Definition EspPwm.h:102
hf_pwm_err_t SetFrequency(hf_channel_id_t channel_id, hf_frequency_hz_t frequency_hz) noexcept override
Set PWM frequency with automatic timer management.
Definition EspPwm.cpp:585
hf_pwm_err_t SetIdleLevel(hf_channel_id_t channel_id, hf_u8_t idle_level) noexcept
Set idle output level for a channel.
Definition EspPwm.cpp:1504
hf_pwm_err_t GetLastError(hf_channel_id_t channel_id) const noexcept
Get the last error code for a specific channel.
Definition EspPwm.cpp:1304
hf_pwm_eviction_policy_t eviction_policy_
Timer eviction policy (default: STRICT_NO_EVICTION)
Definition EspPwm.h:1102
bool auto_fallback_enabled_
Whether to automatically try alternative resolutions.
Definition EspPwm.h:1098
hf_u32_t CalculateMaxFrequency(hf_u8_t resolution_bits, hf_pwm_clock_source_t clock_source=hf_pwm_clock_source_t::HF_PWM_CLK_SRC_APB) const noexcept
Calculate maximum achievable frequency for a given resolution.
Definition EspPwm.cpp:2253
hf_pwm_err_t EnableAutoFallback() noexcept
Enable automatic fallback to alternative resolutions.
Definition EspPwm.cpp:927
hf_pwm_err_t Deinitialize() noexcept override
Deinitialize the LEDC peripheral and release all resources.
Definition EspPwm.cpp:128
void * eviction_callback_user_data_
User data for eviction callback.
Definition EspPwm.h:1104
hf_pwm_err_t RegisterLedcFadeCallback(hf_channel_id_t channel_id) noexcept
Register LEDC fade callback using ESP-IDF API.
Definition EspPwm.cpp:2082
hf_i8_t AttemptEvictionWithConsent(hf_u32_t frequency_hz, hf_u8_t resolution_bits) noexcept
Attempt eviction with user consent callback.
Definition EspPwm.cpp:2564
hf_pwm_err_t ConfigurePlatformTimer(hf_u8_t timer_id, hf_u32_t frequency_hz, hf_u8_t resolution_bits, hf_pwm_clock_source_t clock_source) noexcept
Configure platform timer with LEDC peripheral integration.
Definition EspPwm.cpp:1896
hf_pwm_mode_t current_mode_
Current operating mode.
Definition EspPwm.h:1095
hf_pwm_err_t ForceTimerAssignment(hf_channel_id_t channel_id, hf_u8_t timer_id) noexcept
Force a specific timer for a channel (advanced usage)
Definition EspPwm.cpp:1547
hf_i8_t AttemptForceEviction(hf_u32_t frequency_hz, hf_u8_t resolution_bits) noexcept
Attempt aggressive eviction (original behavior)
Definition EspPwm.cpp:2698
hf_pwm_err_t EnableChannel(hf_channel_id_t channel_id) noexcept override
Enable a configured PWM channel to start signal generation.
Definition EspPwm.cpp:342
hf_pwm_err_t DeconfigureChannel(hf_channel_id_t channel_id) noexcept
Deconfigure a channel and release all associated resources.
Definition EspPwm.cpp:2778
PlatformMutex mutex_
Thread safety mutex.
Definition EspPwm.h:1081
int8_t GetTimerAssignment(hf_channel_id_t channel_id) const noexcept
Get current timer assignment for a channel.
Definition EspPwm.cpp:1537
hf_frequency_hz_t GetFrequency(hf_channel_id_t channel_id) const noexcept override
Get current PWM frequency in Hz.
Definition EspPwm.cpp:1246
hf_u8_t PerformTimerHealthCheck() noexcept
Perform comprehensive timer health check and cleanup.
Definition EspPwm.cpp:2732
static void IRAM_ATTR InterruptHandler(hf_channel_id_t channel_id, void *user_data) noexcept
Platform-specific interrupt handler.
Definition EspPwm.cpp:2059
hf_pwm_err_t ConfigureChannel(hf_channel_id_t channel_id, const hf_pwm_channel_config_t &config) noexcept
Configure a PWM channel with comprehensive LEDC feature support.
Definition EspPwm.cpp:236
bool IsValidChannelId(hf_channel_id_t channel_id) const noexcept
Validate channel ID.
Definition EspPwm.cpp:1740
hf_pwm_err_t UnregisterLedcFadeCallback(hf_channel_id_t channel_id) noexcept
Unregister LEDC fade callback.
Definition EspPwm.cpp:2122
hf_pwm_err_t UpdateAll() noexcept override
Update all enabled PWM channels with their current settings.
Definition EspPwm.cpp:1162
hf_pwm_err_t SetEvictionPolicy(hf_pwm_eviction_policy_t policy) noexcept
Set timer eviction policy for resource management.
Definition EspPwm.cpp:1624
hf_pwm_channel_priority_t GetChannelPriority(hf_channel_id_t channel_id) const noexcept
Get channel priority.
Definition EspPwm.cpp:1685
static constexpr hf_u8_t MAX_RESOLUTION
Maximum resolution bits.
Definition EspPwm.h:104
hf_pwm_err_t SetPhaseShift(hf_channel_id_t channel_id, float phase_shift_degrees) noexcept override
Set PWM phase shift (ESP32 LEDC limitation: not supported)
Definition EspPwm.cpp:772
hf_pwm_mode_t GetMode() const noexcept
Get current PWM operating mode.
Definition EspPwm.cpp:228
static constexpr hf_u8_t MAX_TIMERS
Maximum timer groups.
Definition EspPwm.h:103
hf_i8_t AttemptEvictionNonCritical(hf_u32_t frequency_hz, hf_u8_t resolution_bits) noexcept
Attempt eviction of non-critical channels only.
Definition EspPwm.cpp:2642
std::atomic< bool > initialized_
Initialization state (atomic for lazy init)
Definition EspPwm.h:1082
hf_u32_t CalculateClockDivider(hf_u32_t frequency_hz, hf_u8_t resolution_bits) const noexcept
Calculate optimal clock divider for frequency.
Definition EspPwm.cpp:2207
void SetChannelError(hf_channel_id_t channel_id, hf_pwm_err_t error) noexcept
Set error for a channel.
Definition EspPwm.cpp:2051
hf_pwm_err_t SetDutyCycleRaw(hf_channel_id_t channel_id, hf_u32_t raw_value) noexcept override
Set PWM duty cycle using raw timer counts.
Definition EspPwm.cpp:532
hf_pwm_eviction_policy_t GetEvictionPolicy() const noexcept
Get current eviction policy.
Definition EspPwm.cpp:1639
hf_pwm_err_t SetComplementaryOutput(hf_channel_id_t primary_channel, hf_channel_id_t complementary_channel, hf_u32_t deadtime_ns) noexcept override
Configure complementary PWM output pair with deadtime.
Definition EspPwm.cpp:1185
void NotifyTimerReconfiguration(hf_u8_t timer_id, hf_u32_t new_frequency, hf_u8_t resolution_bits) noexcept
Notify channels that their timer has been reconfigured.
Definition EspPwm.cpp:2478
bool IsFadeActive(hf_channel_id_t channel_id) const noexcept
Check if hardware fade is active on a channel.
Definition EspPwm.cpp:1494
hf_pwm_err_t SetChannelPriority(hf_channel_id_t channel_id, hf_pwm_channel_priority_t priority) noexcept
Set channel priority for eviction decisions.
Definition EspPwm.cpp:1658
hf_pwm_err_t SetChannelCritical(hf_channel_id_t channel_id, bool is_critical) noexcept
Mark channel as critical (never evict)
Definition EspPwm.cpp:1695
hf_pwm_err_t GetChannelStatus(hf_channel_id_t channel_id, hf_pwm_channel_status_t &status) const noexcept
Get comprehensive channel status and configuration.
Definition EspPwm.cpp:1257
hf_pwm_err_t GetDiagnostics(hf_pwm_diagnostics_t &diagnostics) const noexcept override
Get PWM diagnostics.
Definition EspPwm.cpp:1320
hf_pwm_diagnostics_t diagnostics_
PWM diagnostics.
Definition EspPwm.h:1097
hf_pwm_err_t SetMode(hf_pwm_mode_t mode) noexcept
Set PWM operating mode.
Definition EspPwm.cpp:207
bool IsChannelCritical(hf_channel_id_t channel_id) const noexcept
Check if channel is marked as critical.
Definition EspPwm.cpp:1726
hf_pwm_err_t StopAll() noexcept override
Stop all enabled PWM channels simultaneously.
Definition EspPwm.cpp:1141
hf_i8_t FindOrAllocateTimer(hf_u32_t frequency_hz, hf_u8_t resolution_bits, hf_pwm_clock_source_t clock_source) noexcept
Unified timer allocation with comprehensive strategy.
Definition EspPwm.cpp:1744
hf_pwm_err_t DisableChannel(hf_channel_id_t channel_id) noexcept override
Disable a PWM channel and stop signal generation.
Definition EspPwm.cpp:412
static constexpr hf_u32_t MAX_FREQUENCY
Maximum frequency (Hz)
Definition EspPwm.h:106
hf_pwm_err_t SetEvictionCallback(hf_pwm_eviction_callback_t callback, void *user_data=nullptr) noexcept
Set eviction consent callback for user-controlled eviction.
Definition EspPwm.cpp:1644
hf_pwm_err_t EnableFade() noexcept
Enable fade functionality.
Definition EspPwm.cpp:2456
std::string GetTimerUsageInfo(hf_u8_t timer_id) const noexcept
Get timer usage information for debugging.
Definition EspPwm.cpp:2502
hf_pwm_err_t SetHardwareFade(hf_channel_id_t channel_id, float target_duty_cycle, hf_u32_t fade_time_ms) noexcept
Set hardware fade for smooth duty cycle transitions.
Definition EspPwm.cpp:1396
hf_pwm_err_t GetStatistics(hf_pwm_statistics_t &statistics) const noexcept override
Get PWM statistics.
Definition EspPwm.cpp:1314
hf_pwm_err_t SetFrequencyWithResolution(hf_channel_id_t channel_id, hf_frequency_hz_t frequency_hz, hf_u8_t resolution_bits) noexcept
Set frequency with explicit resolution choice (user-controlled)
Definition EspPwm.cpp:794
static bool IRAM_ATTR LedcFadeEndCallback(const ledc_cb_param_t *param, void *user_arg) noexcept
Static ESP-IDF LEDC fade callback handler (C-compatible)
Definition EspPwm.cpp:2155
bool ValidateDutyCycleRange(hf_u32_t raw_duty, hf_u8_t resolution_bits) const noexcept
Enhanced duty cycle validation with overflow protection.
Definition EspPwm.cpp:2270
hf_pwm_err_t SetFrequencyAndResolution(hf_channel_id_t channel_id, hf_frequency_hz_t frequency_hz, hf_u8_t resolution_bits) noexcept
Set frequency and resolution together (atomic operation)
Definition EspPwm.cpp:1005
virtual ~EspPwm() noexcept override
Destructor - ensures clean shutdown.
Definition EspPwm.cpp:74
bool fade_functionality_installed_
LEDC fade functionality installed.
Definition EspPwm.h:1091
std::array< ChannelState, MAX_CHANNELS > channels_
Channel states.
Definition EspPwm.h:1086
hf_pwm_err_t StopHardwareFade(hf_channel_id_t channel_id) noexcept
Stop hardware fade for a channel.
Definition EspPwm.cpp:1462
hf_pwm_err_t InitializeChannels() noexcept
Initialize PWM channels.
Definition EspPwm.cpp:2439
hf_u32_t GetSourceClockFrequency(hf_pwm_clock_source_t clock_source) const noexcept
Get source clock frequency for a given clock source.
Definition EspPwm.cpp:2221
ValidationResult ValidateFrequencyResolutionComplete(const ValidationContext &context) const noexcept
Unified comprehensive validation for frequency/resolution combinations.
Definition EspPwm.cpp:2338
hf_pwm_err_t SetFrequencyWithAutoFallback(hf_channel_id_t channel_id, hf_frequency_hz_t frequency_hz, hf_u8_t preferred_resolution) noexcept
Set frequency with automatic fallback to alternative resolutions.
Definition EspPwm.cpp:869
hf_pwm_err_t InitializeFadeFunctionality() noexcept
Initialize LEDC fade functionality.
Definition EspPwm.cpp:2186
hf_pwm_unit_config_t unit_config_
Unit configuration.
Definition EspPwm.h:1094
hf_pwm_clock_source_t clock_source_
Current clock source.
Definition EspPwm.h:1084
hf_pwm_eviction_callback_t eviction_callback_
User callback for eviction consent.
Definition EspPwm.h:1103
hf_pwm_err_t last_global_error_
Last global error.
Definition EspPwm.h:1090
hf_u8_t FindBestAlternativeResolutionDynamic(hf_u32_t frequency_hz, hf_u8_t preferred_resolution, hf_pwm_clock_source_t clock_source=hf_pwm_clock_source_t::HF_PWM_CLK_SRC_APB) const noexcept
Find best alternative resolution using dynamic calculation.
Definition EspPwm.cpp:2293
std::array< TimerState, MAX_TIMERS > timers_
Timer states.
Definition EspPwm.h:1087
bool IsAutoFallbackEnabled() const noexcept
Check if auto-fallback mode is enabled.
Definition EspPwm.cpp:949
hf_u32_t base_clock_hz_
Base clock frequency.
Definition EspPwm.h:1083
hf_pwm_err_t SetResolution(hf_channel_id_t channel_id, hf_u8_t resolution_bits) noexcept
Set PWM resolution for a channel.
Definition EspPwm.cpp:958
hf_pwm_err_t SetDutyCycle(hf_channel_id_t channel_id, float duty_cycle) noexcept override
Set PWM duty cycle as a percentage (0.0 to 1.0)
Definition EspPwm.cpp:476
EspPwm(const hf_pwm_unit_config_t &config=hf_pwm_unit_config_t{}) noexcept
Constructor for ESP32C6 PWM controller.
Definition EspPwm.cpp:63
hf_pwm_err_t InitializeTimers() noexcept
Initialize PWM timers.
Definition EspPwm.cpp:2427
float GetDutyCycle(hf_channel_id_t channel_id) const noexcept override
Get current duty cycle as a percentage.
Definition EspPwm.cpp:1234
hf_pwm_err_t UpdatePlatformDuty(hf_channel_id_t channel_id, hf_u32_t raw_duty_value) noexcept
Update platform duty cycle.
Definition EspPwm.cpp:2009
void ReleaseTimerIfUnused(hf_u8_t timer_id) noexcept
Release a timer if no longer needed with hardware cleanup.
Definition EspPwm.cpp:1864
hf_pwm_err_t DisableAutoFallback() noexcept
Disable automatic fallback to alternative resolutions.
Definition EspPwm.cpp:938
hf_pwm_err_t Initialize() noexcept override
Initialize the LEDC peripheral and PWM subsystem.
Definition EspPwm.cpp:85
hf_pwm_statistics_t statistics_
PWM statistics.
Definition EspPwm.h:1096
static constexpr hf_u32_t MIN_FREQUENCY
Minimum frequency (Hz)
Definition EspPwm.h:105
void HandleFadeComplete(hf_channel_id_t channel_id) noexcept
Handle fade complete interrupt.
Definition EspPwm.cpp:2066
hf_u8_t CalculateMaxResolution(hf_u32_t frequency_hz, hf_pwm_clock_source_t clock_source=hf_pwm_clock_source_t::HF_PWM_CLK_SRC_APB) const noexcept
Calculate maximum achievable resolution for a given frequency.
Definition EspPwm.cpp:2235
hf_pwm_err_t GetCapabilities(hf_pwm_capabilities_t &capabilities) const noexcept
Get ESP32 variant-specific PWM capabilities.
Definition EspPwm.cpp:1291
std::array< ComplementaryPair, MAX_CHANNELS/2 > complementary_pairs_
Complementary pairs.
Definition EspPwm.h:1088
Internal channel state with per-channel callback support.
Definition EspPwm.h:710
bool configured
Channel is configured.
Definition EspPwm.h:711
hf_pwm_err_t last_error
Last error for this channel.
Definition EspPwm.h:716
const char * description
Optional description for debugging.
Definition EspPwm.h:723
hf_pwm_channel_config_t config
Channel configuration.
Definition EspPwm.h:713
hf_pwm_channel_priority_t priority
Channel priority for eviction decisions.
Definition EspPwm.h:721
bool enabled
Channel is enabled.
Definition EspPwm.h:712
bool fade_active
Hardware fade is active.
Definition EspPwm.h:717
ChannelState() noexcept
Definition EspPwm.h:728
bool is_critical
Mark as critical (never evict)
Definition EspPwm.h:722
hf_u8_t assigned_timer
Assigned timer (0-3)
Definition EspPwm.h:714
bool needs_reconfiguration
Channel needs reconfiguration due to timer change.
Definition EspPwm.h:718
hf_u32_t raw_duty_value
Current raw duty value.
Definition EspPwm.h:715
Complementary output pair configuration.
Definition EspPwm.h:755
bool active
Pair is active.
Definition EspPwm.h:759
hf_u32_t deadtime_ns
Deadtime in nanoseconds.
Definition EspPwm.h:758
hf_u8_t complementary_channel
Complementary channel.
Definition EspPwm.h:757
ComplementaryPair() noexcept
Definition EspPwm.h:761
hf_u8_t primary_channel
Primary channel.
Definition EspPwm.h:756
Internal timer state.
Definition EspPwm.h:738
bool in_use
Timer is in use.
Definition EspPwm.h:739
hf_u8_t channel_count
Number of channels using this timer.
Definition EspPwm.h:742
hf_u32_t frequency_hz
Timer frequency.
Definition EspPwm.h:740
hf_pwm_clock_source_t clock_source
Clock source configured for this timer.
Definition EspPwm.h:743
TimerState() noexcept
Definition EspPwm.h:746
hf_u8_t resolution_bits
Timer resolution.
Definition EspPwm.h:741
bool has_hardware_conflicts
Timer has hardware conflicts (avoid reusing)
Definition EspPwm.h:744
Simple validation context for frequency/resolution validation.
Definition EspPwm.h:924
hf_u8_t resolution_bits
Target resolution in bits.
Definition EspPwm.h:926
hf_i8_t timer_id
Optional specific timer (-1 for general)
Definition EspPwm.h:928
hf_u32_t frequency_hz
Target frequency in Hz.
Definition EspPwm.h:925
ValidationContext(hf_u32_t freq, hf_u8_t res, hf_pwm_clock_source_t clk=hf_pwm_clock_source_t::HF_PWM_CLK_SRC_APB, hf_i8_t timer=-1) noexcept
Definition EspPwm.h:930
hf_pwm_clock_source_t clock_source
Clock source for validation.
Definition EspPwm.h:927
Comprehensive validation result with detailed information.
Definition EspPwm.h:939
hf_u32_t max_achievable_frequency
Maximum frequency for this resolution.
Definition EspPwm.h:944
hf_u8_t max_achievable_resolution
Maximum resolution for this frequency.
Definition EspPwm.h:943
uint64_t available_clock_hz
Available source clock frequency.
Definition EspPwm.h:946
const char * reason
Human-readable reason for failure.
Definition EspPwm.h:942
ValidationResult() noexcept
Definition EspPwm.h:948
bool is_valid
Overall validation result.
Definition EspPwm.h:940
uint64_t required_clock_hz
Required timer clock frequency.
Definition EspPwm.h:945
hf_pwm_err_t error_code
Specific error code if invalid.
Definition EspPwm.h:941
PWM capabilities and limitations for ESP32.
Definition EspTypes_PWM.h:360
ESP32 PWM channel configuration with comprehensive LEDC feature support.
Definition EspTypes_PWM.h:306
PWM channel status information.
Definition EspTypes_PWM.h:220
PWM diagnostics information.
Definition BasePwm.h:126
PWM statistics information.
Definition BasePwm.h:107
ESP32 PWM unit configuration.
Definition EspTypes_PWM.h:203