Beaglebone Black. PWM minimum frequency of 1.52KHz
fabiodive
fabiodive at gmail.com
Thu May 22 18:51:19 UTC 2014
Hello Luiz, hello all my friends,
Luiz, it is a real pleasure for me to hear you!
I didn't try yet your work but I will do that tomorrow,
actually your modifications sounds really well done.
I will report here,
thank you!
cheers,
Fabio
On May 22, 2014, at 15:19 , Luiz Otavio O Souza <lists.br at gmail.com> wrote:
> On 10 May 2014 08:56, fabiodive wrote:
>> Hello,
>>
>> PWM on Beaglebone Black
>>
>> during my laboratory tests I was not able to setup a frequency suitable for servo motors.
>> I tried several times with many values but the results was always the same.
>> The minimal frequency I was able to achieve was 1.52 KHz.
>> Also, I noticed odd results with the most of configuration values, in this case
>> I lost the PWM output signal.
>>
>> I tried some combinations, measuring the results with an oscilloscope, the period
>> configuration key appears to loose its nanoseconds meaning beyond a value:
>
> Hi Fabio!
>
> The PWM frequency is determined as SYSCLKOUT (100Mhz) / prescaler
> settings / period. As the current code uses 1 for the prescaler and
> the period is a 16bit value the lower frequency you can have is
> actually 1.529Khz.
>
>> # sysctl dev.am335x_pwm.1.period=1500
>> # sysctl dev.am335x_pwm.1.dutyA=300
>> result frequency: 66 KHz ->should be 666 KHz
>> length of period: 15 us ->should be 1.5 us
>> length of pulse: 2 us
>
> As above, this is correct: 100Mhz / 1 / 1500 = 66Khz.
>
>>
>> # sysctl dev.am335x_pwm.1.period=1500000
>> # sysctl dev.am335x_pwm.1.dutyA=10000
>> result frequency: 1.71 KHz -> should be 666Hz
>> length of period: 585 us
>> length of pulse: 100 us
>>
>> # sysctl dev.am335x_pwm.1.period=1800000
>> # sysctl dev.am335x_pwm.1.dutyA=10000
>> result frequency: 3.24 KHz -> should be 555Hz
>> length of period: 308 us
>> length of pulse: 100 us
>
> These two examples are overflowing the period variable.
>
> I've the attached patch which enforces the maximum values where needed
> (to avoid such overflows) and two new sysctls, one allows you to set
> the prescaler for the PWM module and the other (which is probably more
> interesting) allows you to check the actual PWM frequency.
>
> The sysctl.am335x_pwm.X.freq can also be use to set an desired
> frequency directly, it will try to get you the better setting it can
> find for the desired frequency, which usually means get the bigger
> period it can find to give the better PWM resolution that is possible
> for a given frequency.
>
> I've been able to drive R/C servos directly with this patch and the
> following set:
>
> sysctl.am335x_pwm.X.freq = 50 (digital servos may operate at higher frequencies)
>
> And then, for the cheap chinese servo i have here, i can get it to
> travel almost 180o using duty values from 2000 to 6000 (YMMV).
>
> I've checked the frequencies with a scope and they look fine for me.
>
> Regards,
> Luiz
> <am335x_pwm.diff>
More information about the freebsd-arm
mailing list