

Arduino
IDEを使いSpresenseでPWM出力をしたいのですが、IDEではデフォルトが8Bitととなっており、変更ができないようです。(ArduinoDueを除く)  
しかしSpresenseでは15Bitの分解能を持っています。

分解能が256と制限されているのは少々扱いづらいので、32768(15Bit)でPWM出力ができるような関数があれば教えてほしいです。

Arduino Due では `analogWriteResolution(bits)` のように書くそうです。

**環境:**  
Arduino1.8.12  
ボードVer1.5.1  
Windows10 Home


CC BY-SA 4.0
2020-04-08T16:14:33.883
65475
2020-04-10T00:58:48.573
2020-04-08T16:42:57.530
3060
39556
question
spresense
Arduino IDEでPWM出力を15Bitで扱う方法


残念ながら、ArduinoのCPUのATmega328のPWMカウンタは８ビット幅しかありません。  
なので、８ビット以上の分解能をもたせることは不可能となります。


CC BY-SA 4.0
2020-04-09T13:54:57.883
65501
2020-04-09T13:54:57.883
27481
65475
answer


Arduino IDE から直接 nuttx のドライバを叩けば出来るかも知れません。Spresense の PWM のドライバの定義は次にあります。

<https://github.com/SPRESENSE/spresense-
nuttx/blob/master/include/nuttx/drivers/pwm.h>

この中で、pwm のドライバは次のように記述されています。

[code]

    struct pwm_info_s
    {
      uint32_t           frequency; /* Frequency of the pulse train */
    
    #ifdef CONFIG_PWM_MULTICHAN
                                    /* Per-channel output state */
      struct pwm_chan_s  channels[CONFIG_PWM_NCHANNELS];
    
    #else
      ub16_t             duty;      /* Duty of the pulse train, "1"-to-"0" duration.
                                     * Maximum: 65535/65536 (0x0000ffff)
                                     * Minimum:     1/65536 (0x00000001) */
    #  ifdef CONFIG_PWM_PULSECOUNT
      uint32_t           count;     /* The number of pulse to generate.  0 means to
                                     * generate an indefinite number of pulses */
    #  endif
    #endif /* CONFIG_PWM_MULTICHAN */
    };
    
[/code]

使い方は次のサンプルが参考になると思います。（Spresense SDK をダウンロードすれば examples の中にマージされるみたいです）

<https://github.com/jodersky/nuttx/blob/master/apps/examples/pwm/pwm_main.c>

ドライバはLinuxと同じように使えます。

[code]

      pwm_devinit();
    
      /* Open the PWM device for reading */
      fd = open(g_pwmstate.devpath, O_RDONLY);
    
      /* Configure the characteristics of the pulse train */
      info.frequency = frequency;
      info.duty      = duty;
    
      ioctl(fd, PWMIOC_SETCHARACTERISTICS, (unsigned long)((uintptr_t)&info));
    
      /* Then start the pulse train.  Since the driver was opened in blocking
       * mode, this call will block if the count value is greater than zero.   */
      ioctl(fd, PWMIOC_START, 0);
    
[/code]

という感じです。Arduino IDEからNuttXのドライバを呼び出し方は過去のスタックオーバーフローで回答していますので、参考にしてください。

[SPRESENSE SDK は、Arduino IDE
でも使える？](https://ja.stackoverflow.com/questions/53466/spresense-sdk-%e3%81%af-
arduino-ide-%e3%81%a7%e3%82%82%e4%bd%bf%e3%81%88%e3%82%8b/53502#53502)

中途半端な回答かも知れませんが、ご参考になれば！


CC BY-SA 4.0
2020-04-10T00:58:48.573
65509
2020-04-10T00:58:48.573
27334
65475
answer