0

デフォルトで利用可能なものよりも高い解像度と周波数で Arduino Due PWM を使用できるようにしたいと考えています。私は IDE 1.6.8 を使用しています。これは、数週間前にインストールした最新のものです (1.6.9 は現在進行中かもしれません)。インターネットで検索し、ボードとオシロスコープで実験した後、次の結論に達しました。

  • より高い PWM 周波数を取得するには、variant.hの対応する行を変更する必要があります。PWM はピン 6 ~ 9 に影響を与えるようで、TC は他の PWM 対応ピンに影響を与えます。どのピンがどのタイマーにあるからだと思いますか?micros()、millis ()などは変更の影響を受けないようです:

#define PWM_FREQUENCY 20000 // changed from 1000 #define TC_FREQUENCY 20000 // changed from 1000

  • 複数の場所で述べたように、analogWriteResolution() Arduino 関数が壊れているか、少なくともそれ自体では、Due PWM 解像度を上げるのに十分ではありません。analogWriteResolution()が期待どおりに動作するためには、 variant.hで以下を変更する必要もあります:

#define PWM_MAX_DUTY_CYCLE 4095 // changed from 255 #define PWM_MIN_DUTY_CYCLE 0 #define PWM_RESOLUTION 12 // changed from 8

  • 私がボードを購入したときの標準である Arduino Due R3-E の物理的なラベルは誤解を招くようです: ボード上にDIGITAL (PWM~)と書かれており、そのような~はピン 3、5、6 にのみ存在します。 、9、10、11 に含まれているピン 2 から 13 までのすべてのピンで PWM を取得できます。

すべてを把握し、オシロスコープなどで確認するのに時間がかかり、スタックオーバーフローでそれらの回答が見つからなかったため、このコンテンツをここに投稿します。また、2 つの質問があります。

  • PWM と TC の周波数を変更しても (私が行ったテストのように) OK ですか? 他のコア機能/ライブラリとやり取りできますか?

  • 下位互換性以外に、PWM の最大デューティ サイクルと分解能のデフォルト値に理由はありますか?

4

1 に答える 1

0

これは、PWM 周波数除数で行うことができます: http://forum.arduino.cc/index.php?topic=16612#msg121031

これは、PWMfrequency ライブラリに実装されています: http://playground.arduino.cc/Code/PwmFrequency は、基本的に次のようになります。

void setPwmFrequency(int pin, int divisor) {
  byte mode;
  if(pin == 5 || pin == 6 || pin == 9 || pin == 10) {
    switch(divisor) {
      case 1: mode = 0x01; break;
      case 8: mode = 0x02; break;
      case 64: mode = 0x03; break;
      case 256: mode = 0x04; break;
      case 1024: mode = 0x05; break;
      default: return;
    }
    if(pin == 5 || pin == 6) {
      TCCR0B = TCCR0B & 0b11111000 | mode;
    } else {
      TCCR1B = TCCR1B & 0b11111000 | mode;
    }
  } else if(pin == 3 || pin == 11) {
    switch(divisor) {
      case 1: mode = 0x01; break;
      case 8: mode = 0x02; break;
      case 32: mode = 0x03; break;
      case 64: mode = 0x04; break;
      case 128: mode = 0x05; break;
      case 256: mode = 0x06; break;
      case 1024: mode = 0x07; break;
      default: return;
    }
    TCCR2B = TCCR2B & 0b11111000 | mode;
  }
}
于 2016-11-29T14:09:13.953 に答える