Spresense SDKによるPWM出力周波数の下限について


SPRESENSE SDKでのPWM生成に関する質問です。

現在、examples/pwmを試しているのですが、PWMの最低周波数(動作周波数xカウンタ最大値?)で悩んでいます。50Hz周期のサーボモータを接続しようとしたところioctlでエラーとなってしまいました。125HzのPWMは正常に生成できました。

本内容に関する、SPRESENSEの仕様書やコード等、ご存知の方いらっしゃいますでしょうか。

[code]

    nsh> pwm -p /dev/pwm0 -f 125
    pwm_main: starting output with frequency: 125 duty: 00008000
    pwm_main: stopping output
    nsh> pwm -p /dev/pwm0 -f 50
    pwm_main: starting output with frequency: 50 duty: 00008000
    pwm_main: ioctl(PWMIOC_START) failed: 22
    
[/code]

よろしくお願いいたします。




お世話になっております。自己解決しました、ありがとうございます。

下記のifに捕まっていました。cxd56_get_pwm_baseclock(デフォルトではSCUと同じRCOSC)を基準として、16bit幅のカウンタを利用するため、最低125Hzということですね。理解しました。

  * ~/spresense/sdk/bsp/src/cxd56_pwm.c
[code]     static int convert_freq2period(...)

    {
      ...
      pwmfreq = cxd56_get_pwm_baseclock();
      ...
      if ((freq > ((pwmfreq + 1) >> 1)) || (freq < (pwmfreq >> 16)))
        {
          pwmerr("Frequency out of range. %d [Effective range:%d - %d]\n",
                    freq, pwmfreq >> 16, (pwmfreq + 1) >> 1);
          return -1;
    
[/code]

今後ともよろしくお願いいたします。




お世話になっております。自己解決しました、ありがとうございます。

下記のifに捕まっていました。cxd56_get_pwm_baseclock(デフォルトではSCUと同じRCOSC)を基準として、16bit幅のカウンタを利用するため、最低125Hzということですね。理解しました。

  * ~/spresense/sdk/bsp/src/cxd56_pwm.c
[code]     static int convert_freq2period(...)

    {
      ...
      pwmfreq = cxd56_get_pwm_baseclock();
      ...
      if ((freq > ((pwmfreq + 1) >> 1)) || (freq < (pwmfreq >> 16)))
        {
          pwmerr("Frequency out of range. %d [Effective range:%d - %d]\n",
                    freq, pwmfreq >> 16, (pwmfreq + 1) >> 1);
          return -1;
    
[/code]

今後ともよろしくお願いいたします。

