Hey Miguel,

thanks for the background that helps a lot.

I agree that (if this is the way the pwm api should work) the top value should 
be explicit. As the return value from pwm_set_frequency would be an option - 
given its prominence though it would probably make sense to add an API call for 
it or add it as a member to `struct pwm_dev`.

At least that way the dependency between the application and driver 
implementation gets broken.

It would be great if we could nail that down here so I can implement the stm 
driver correctly the first time ;).

The pin-less PWM is more a result of calling the APIs in the wrong order. I 
couldn't come up with a use case but also wasn't sure if it should be 
supported. I do have robot though where the h-bridge is a bit hard to control. 
What I ended up doing was to generate the same PWM in 2 hw-units and depending 
on state enabled one of the output pins.

Good stuff,
Markus


On Thu, 1 Mar 2018 00:48:36 -0300
Miguel Azevedo <miguella...@gmail.com> wrote:

> Hi Markus,
> 
> > According to the doc the duty cycle should be absolutely defined
> > between 0 (no output) and 65535 (full output).  
> Yes, the doc on the PWM API wasn't updated after the first drivers got
> implemented, if you take a look at pwm_nrf52 on my latest pull request
> on PWM the driver's doc is different.
> 
> > Just to be clear, the way I understand the interface a call like
> >
> >   pwm_enable_duty_cycle(pwm, 0, 0x7FFF);
> >
> > should always lead to a 50% duty cycle, regardless of what the pwm
> > frequency was set to and regardless of what counter frequency is
> > internally used by the pwm driver.  
> 
> Well, in a general way PWM uses clock division, so in practice you
> have a top value, which is clock_freq/pwm_freq and this should be the
> 100% duty cycle.
> Some versions ago there was a PWM HAL API, I based the current PWM API
> on that one, with a few differences which BTW where discussed on this
> mailing list.
> Why not convert it and always have a 0 - 65535 and not have external
> code doing it?
> At the time I implemented the pwm_nrf52 and soft_pwm drivers it made
> more sense to have the duty cycle fraction value based on the top
> value. This is because it would totally respect the resolution and
> remove the need to convert from one value range to another each time
> we change duty cycle.
> If you convert it internally every time you change the duty cycle,
> which probably will happen frequently, it won't be as efficient as
> calculating a top value once you set the frequency(something which is
> likely to happen less frequently).
> 
> > I would appreciate any clarifying comments as to what's going on
> > here - or where I'm going wrong.  
> What happens here is that I forgot to change the documentation,
> although the drivers work consistently the way I just described.
> Just to be clear here: I understand your concern about the fraction
> range and that it is on the older API.
> It still makes sense to me to use the real range and calculate the top
> value when we set the frequency rather than converting from one value
> range to another every time we change the duty cycle, its just the way
> PWM works. Probably it would be better to return a top value on the
> set_frequency function, this is one of the changes would like to
> propose.
> 
> > The second question has to do with the sequence of api calls and at
> > what point the PWM is actually started (which is an explicit step
> > for STM32s).
> > - Is it a safe assumption that an application must call
> > pwm_chan_config for a channel before it can call
> > pwm_enable_duty_cycle?  
> Absolutely. As far as we go we need to set a GPIO output before we
> fire up a PWM channel.
> 
> > - Is there support for kicking off a PWM channel without
> > configuring an output pin?  
> No, can you give us a use case where that would need happen?
> 
> > Lastly, in some email archive about the original PWM driver thread
> > I found a reference to 'hal_pwm' - which I can't even find a header
> > for. Did this get removed from the repo?  
> Yes, it did, here you have it:
> https://github.com/apache/mynewt-core/blob/mynewt_0_9_0_tag/hw/hal/include/hal/hal_pwm.h
> 
> Best,
> 
> Miguel
> 
> On Wed, Feb 28, 2018 at 9:53 PM, markus <mar...@bibi.ca> wrote:
> > I started implementing a PWM driver for the STM32 processors a few
> > days ago and ran into an issue I need clarification. According to
> > the doc the duty cycle should be absolutely defined between 0 (no
> > output) and 65535 (full output).
> >
> > However, pwm_test and pwm_nrf52 require the application code to get
> > the base frequency, calculate the top value from that and then
> > scale the duty cycle accordingly.
> >
> > Just to be clear, the way I understand the interface a call like
> >
> >   pwm_enable_duty_cycle(pwm, 0, 0x7FFF);
> >
> > should always lead to a 50% duty cycle, regardless of what the pwm
> > frequency was set to and regardless of what counter frequency is
> > internally used by the pwm driver.
> >
> > I would appreciate any clarifying comments as to what's going on
> > here - or where I'm going wrong.
> >
> > The second question has to do with the sequence of api calls and at
> > what point the PWM is actually started (which is an explicit step
> > for STM32s).
> > - Is it a safe assumption that an application must call
> > pwm_chan_config for a channel before it can call
> > pwm_enable_duty_cycle?
> > - Is there support for kicking off a PWM channel without
> > configuring an output pin?
> >
> > Lastly, in some email archive about the original PWM driver thread
> > I found a reference to 'hal_pwm' - which I can't even find a header
> > for. Did this get removed from the repo?
> >
> > Thanks a lot,
> > Markus
> >
> >
> >  
> 
> 
> 

Reply via email to