A quick discussion thread on the PWM API.  I currently proposed a PWM API with 
five simple methods in my PWM git pull request.

hal_pwm_set_period(uin32_t usec);
hal_pwm_set_on_duration(uint32_t usec);
hal_pwm_on();
hal_pwm_off();
hal_pwm_create();

The on/off/create APIs are fine, and I don't intend to change them.

But the setting APIs assume a lot about the underlying PWM controller setup.  
Mainly that it has lots of resolution (clock rate) and lots of precision (bits 
of PWM register). The goal of this simple API was to abstract the HW enough to 
make it simple to use, but I think I've got overboard and made it unusable.  So 
I want to propose a new HAL API like this.

/* returns the count frequency for the underlying PWM. This is set by the BSP 
and HW limitations */
uint32_t hal_pwm_get_clock_freq_hz(void)

/* returns the register size of the counter regiser for the underlying PWM.  
This is set the by BSP and HW limitations */
uint32_t hal_pwm_get_resolution_bits(void);

/* sets the period of the PWM waveform in clock (clock frequency returned 
above). Can't exceed the resolution above (2^N) or error */
Int hal_pwm_set_period(uin32_t clocks);

/* sets the on duration of the PWM waveform in clocks (clock frequency returned 
above).  Can't exceed the resolution above or error */
Int hal_pwm_set_on_duration(uint32_t clock);

/* sets the duty cycle of the PWM. 0=always low, 255 = always high.
* Sets the period to the smallest possible to achieve this exact duty cycle. 
Overwrites any
* changes made by  hal_pwm_set_period and hal_pwm_set_on_duration. This is 
designed to be the simple API that folks
Would use if they just want a duty cycle for controlling LED brightness etc */
Int hal_pwm_set_duty_cycle(uint8_t frac);

Comments? This API is a bit more complicated but lets the application know a 
lot more about the underlying functionality of the PWM provided by the BSP.

Paul


Reply via email to