40#define HF_PWM_ERR_LIST(X) \
42 X(PWM_SUCCESS, 0, "Success") \
44 X(PWM_ERR_FAILURE, 1, "General failure") \
45 X(PWM_ERR_NOT_INITIALIZED, 2, "Not initialized") \
46 X(PWM_ERR_ALREADY_INITIALIZED, 3, "Already initialized") \
47 X(PWM_ERR_INVALID_PARAMETER, 4, "Invalid parameter") \
48 X(PWM_ERR_NULL_POINTER, 5, "Null pointer") \
49 X(PWM_ERR_OUT_OF_MEMORY, 6, "Out of memory") \
51 X(PWM_ERR_INVALID_CHANNEL, 7, "Invalid PWM channel") \
52 X(PWM_ERR_CHANNEL_BUSY, 8, "Channel already in use") \
53 X(PWM_ERR_CHANNEL_NOT_AVAILABLE, 9, "Channel not available") \
54 X(PWM_ERR_INSUFFICIENT_CHANNELS, 10, "Insufficient channels available") \
56 X(PWM_ERR_INVALID_FREQUENCY, 11, "Invalid frequency") \
57 X(PWM_ERR_FREQUENCY_TOO_HIGH, 12, "Frequency too high") \
58 X(PWM_ERR_FREQUENCY_TOO_LOW, 13, "Frequency too low") \
59 X(PWM_ERR_RESOLUTION_NOT_SUPPORTED, 14, "Resolution not supported") \
61 X(PWM_ERR_INVALID_DUTY_CYCLE, 15, "Invalid duty cycle") \
62 X(PWM_ERR_DUTY_OUT_OF_RANGE, 16, "Duty cycle out of range") \
64 X(PWM_ERR_HARDWARE_FAULT, 17, "Hardware fault") \
65 X(PWM_ERR_TIMER_CONFLICT, 18, "Timer resource conflict") \
66 X(PWM_ERR_PIN_CONFLICT, 19, "Pin already in use") \
68 X(PWM_ERR_COMMUNICATION_TIMEOUT, 20, "Communication timeout") \
69 X(PWM_ERR_COMMUNICATION_FAILURE, 21, "Communication failure") \
70 X(PWM_ERR_DEVICE_NOT_RESPONDING, 22, "Device not responding") \
71 X(PWM_ERR_INVALID_DEVICE_ID, 23, "Invalid device ID") \
72 X(PWM_ERR_UNSUPPORTED_OPERATION, 24, "Unsupported operation") \
73 X(PWM_ERR_UNKNOWN, 25, "Unknown error")
77#define X(name, value, description) name = value,
90#define X(NAME, VALUE, DESC) \
91 case hf_pwm_err_t::NAME: \
296 float phase_shift_degrees)
noexcept = 0;
400 if (duty_cycle < 0.0f)
402 if (duty_cycle > 1.0f)
404 return static_cast<hf_u32_t>(duty_cycle * ((1U << resolution_bits) - 1));
414 hf_u32_t max_value = (1U << resolution_bits) - 1;
415 if (raw_value > max_value)
416 raw_value = max_value;
417 return static_cast<float>(raw_value) /
static_cast<float>(max_value);
426 return (duty_cycle >= 0.0f && duty_cycle <= 1.0f);
438 return (frequency_hz >= min_freq_hz && frequency_hz <= max_freq_hz);
448 if (resolution_bits == 0 || resolution_bits > 16)
450 hf_u32_t max_value = (1U << resolution_bits) - 1;
451 return (raw_value <= max_value);
462 if (target_freq == 0)
464 float diff =
static_cast<float>(target_freq > actual_freq ? target_freq - actual_freq
465 : actual_freq - target_freq);
466 return 1.0f - (diff /
static_cast<float>(target_freq));
475 if (duty_cycle < 0.0f)
477 if (duty_cycle > 1.0f)
void(*)(hf_channel_id_t channel_id, hf_pwm_err_t error, void *user_data) hf_pwm_fault_callback_t
Callback for PWM fault/error events.
Definition BasePwm.h:156
#define X(name, value, description)
Definition BasePwm.h:77
hf_pwm_err_t
Definition BasePwm.h:76
@ PWM_ERR_UNSUPPORTED_OPERATION
constexpr std::string_view HfPwmErrToString(hf_pwm_err_t err) noexcept
Convert PWM error code to string view.
Definition BasePwm.h:88
void(*)(hf_channel_id_t channel_id, void *user_data) hf_pwm_period_callback_t
Callback for PWM period complete events.
Definition BasePwm.h:148
Platform-agnostic hardware type definitions for the HardFOC system.
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
uint64_t hf_u64_t
Platform-agnostic 64-bit unsigned integer type.
Definition HardwareTypes.h:58
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
virtual hf_pwm_err_t StartAll() noexcept=0
Start all enabled channels simultaneously.
virtual hf_pwm_err_t StopAll() noexcept=0
Stop all channels.
hf_pwm_diagnostics_t diagnostics_
PWM diagnostic information.
Definition BasePwm.h:491
static constexpr float CalculateFrequencyAccuracy(hf_u32_t target_freq, hf_u32_t actual_freq) noexcept
Calculate frequency accuracy percentage.
Definition BasePwm.h:460
static constexpr bool IsValidDutyCycle(float duty_cycle) noexcept
Validate duty cycle range.
Definition BasePwm.h:425
virtual hf_pwm_err_t SetDutyCycle(hf_channel_id_t channel_id, float duty_cycle) noexcept=0
Set duty cycle for a channel.
static constexpr float RawToDutyCycle(hf_u32_t raw_value, hf_u8_t resolution_bits) noexcept
Calculate duty cycle percentage from raw value.
Definition BasePwm.h:413
static constexpr bool IsValidRawDuty(hf_u32_t raw_value, hf_u8_t resolution_bits) noexcept
Validate raw duty value against resolution.
Definition BasePwm.h:447
virtual hf_pwm_err_t SetComplementaryOutput(hf_channel_id_t primary_channel, hf_channel_id_t complementary_channel, hf_u32_t deadtime_ns) noexcept=0
Set complementary output configuration (for motor control)
static constexpr hf_u32_t DutyCycleToRaw(float duty_cycle, hf_u8_t resolution_bits) noexcept
Calculate raw duty value from percentage.
Definition BasePwm.h:399
virtual hf_pwm_err_t Initialize() noexcept=0
Initialize the PWM system.
BasePwm & operator=(BasePwm &&)=delete
bool initialized_
Initialization state.
Definition BasePwm.h:489
static constexpr float ClampDutyCycle(float duty_cycle) noexcept
Clamp duty cycle to valid range.
Definition BasePwm.h:474
virtual ~BasePwm() noexcept=default
virtual hf_pwm_err_t GetDiagnostics(hf_pwm_diagnostics_t &diagnostics) const noexcept
Get PWM diagnostics.
Definition BasePwm.h:364
virtual hf_pwm_err_t GetStatistics(hf_pwm_statistics_t &statistics) const noexcept
Get PWM statistics.
Definition BasePwm.h:354
virtual float GetDutyCycle(hf_channel_id_t channel_id) const noexcept=0
Get current duty cycle for a channel.
virtual hf_pwm_err_t Deinitialize() noexcept=0
Deinitialize the PWM system.
virtual hf_pwm_err_t DisableChannel(hf_channel_id_t channel_id) noexcept=0
Disable a PWM channel.
bool EnsureDeinitialized() noexcept
Ensure PWM is deinitialized (lazy deinitialization pattern)
Definition BasePwm.h:228
BasePwm(BasePwm &&)=delete
virtual hf_frequency_hz_t GetFrequency(hf_channel_id_t channel_id) const noexcept=0
Get current frequency for a channel.
virtual hf_pwm_err_t UpdateAll() noexcept=0
Update all channel outputs simultaneously (for synchronized updates)
bool EnsureInitialized() noexcept
Ensure PWM is initialized (lazy initialization pattern)
Definition BasePwm.h:216
virtual hf_pwm_err_t SetDutyCycleRaw(hf_channel_id_t channel_id, hf_u32_t raw_value) noexcept=0
Set raw duty value for a channel.
BasePwm(const BasePwm &)=delete
bool IsInitialized() const noexcept
Check if PWM system is initialized.
Definition BasePwm.h:206
virtual hf_pwm_err_t ResetDiagnostics() noexcept
Reset PWM diagnostic information.
Definition BasePwm.h:384
BasePwm() noexcept
Definition BasePwm.h:483
virtual hf_pwm_err_t SetFrequency(hf_channel_id_t channel_id, hf_frequency_hz_t frequency_hz) noexcept=0
Set frequency for a channel.
virtual hf_pwm_err_t SetPhaseShift(hf_channel_id_t channel_id, float phase_shift_degrees) noexcept=0
Set phase shift for a channel (if supported)
hf_pwm_statistics_t statistics_
PWM operation statistics.
Definition BasePwm.h:490
virtual hf_pwm_err_t EnableChannel(hf_channel_id_t channel_id) noexcept=0
Enable a PWM channel.
virtual bool IsChannelEnabled(hf_channel_id_t channel_id) const noexcept=0
Check if a channel is enabled.
BasePwm & operator=(const BasePwm &)=delete
static constexpr bool IsValidFrequency(hf_u32_t frequency_hz, hf_u32_t min_freq_hz, hf_u32_t max_freq_hz) noexcept
Validate frequency range.
Definition BasePwm.h:436
virtual hf_pwm_err_t ResetStatistics() noexcept
Reset PWM operation statistics.
Definition BasePwm.h:374
#define HF_PWM_ERR_LIST(X)
HardFOC PWM error codes.
Definition BasePwm.h:40
PWM diagnostics information.
Definition BasePwm.h:126
hf_pwm_diagnostics_t() noexcept
Definition BasePwm.h:134
bool fade_functionality_ready
Hardware fade is ready.
Definition BasePwm.h:128
hf_u8_t active_timers
Number of active timers.
Definition BasePwm.h:130
bool hardware_initialized
Hardware is initialized.
Definition BasePwm.h:127
hf_u8_t active_channels
Number of active channels.
Definition BasePwm.h:129
hf_pwm_err_t last_global_error
Last global error.
Definition BasePwm.h:132
hf_u32_t system_uptime_ms
System uptime in milliseconds.
Definition BasePwm.h:131
PWM statistics information.
Definition BasePwm.h:107
hf_u32_t fade_operations_count
Total fade operations.
Definition BasePwm.h:110
hf_u32_t frequency_changes_count
Total frequency changes.
Definition BasePwm.h:109
hf_u64_t initialization_timestamp
Initialization timestamp.
Definition BasePwm.h:115
hf_u32_t error_count
Total error count.
Definition BasePwm.h:111
hf_pwm_statistics_t() noexcept
Definition BasePwm.h:117
hf_u64_t last_activity_timestamp
Last activity timestamp.
Definition BasePwm.h:114
hf_u32_t channel_disables_count
Total channel disable operations.
Definition BasePwm.h:113
hf_u32_t duty_updates_count
Total duty cycle updates.
Definition BasePwm.h:108
hf_u32_t channel_enables_count
Total channel enable operations.
Definition BasePwm.h:112