I am not a huge fan of the API using clock ticks as opposed to time. I wonder if the API should just be frequency and duty cycle. If the underlying HW cant support it it can return an error. I have not thought this through completely so I am sure there is some reason this is not good :-)
I guess one possible issue is the issue where the HW cant support the exact frequency. For example, I ask for 1kHZ but can only get 1.1 or .9. Anyway, I dont have an alternate proposal so maybe I shouldnt comment :) Will > On Mar 30, 2016, at 9:56 AM, p...@wrada.com wrote: > > > > 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 > >