Arduino PORTENTA Pro C33による高度なPWM機能


APDahlen Applications Engineer

Arduino PORTENTA Pro C33のデフォルトのPWM周波数は?

Arduinoには製品間の後方互換性を維持してきた長い歴史があります。新しいArduino PORTENTA Pro C33も例外ではありません。Arduino Unoと同様に、C33のデフォルトのパルス幅変調(PWM)周波数は、8ビット分解能で約490Hzです。デフォルトのPWMは、analogWrite( )関数を使ってアクセスすることを思い出してください。

これは多くのプロジェクトにとって良いスタート位置ですが、高度なプロジェクト、特にモータ制御を伴うものには望ましくありません。低い周波数は耳につくし、PWMの8ビット分解能はもっと改善できるでしょう。これは、Renesas Arm Cortex processorのC33の性能を考えると、特に当てはまります。このデバイスは、デフォルト設定やよく知られたanalogWrite( ) 関数の限界をはるかに超える性能を発揮します。

この技術記事では、C33のPWMのロックを解除する方法を示します。これにより、デューティサイクルに小数(浮動小数点型)値を使用する機能とともに、PWM周波数を任意の値に設定する機能が提供されます。最も優れた点は、コードがArduino IDE(統合開発環境)のパーツとしてすでにインストールされていることです。図1に、今回セットアップで使用したハードウェアを示します。

図1: Arduino PORTENTA Pro C33のPWMは、任意の周波数に設定でき、デューティサイクルは浮動小数点をパーセンテージで設定できます。

PORTENTA Pro C33のPWMコードはどこにありますか?

PWMコードを見つけるには、Arduino IDEの内部動作を調べる必要があります。出発点として、プログラムをコンパイル(検証)する前に、特定のArduinoマイクロコントローラを識別する必要があることは、誰でも知っています。これは、選択したマイクロコントローラ用にプログラムをコンパイルするようIDEに指示するため、重要です。古典的なLED点滅(Lチカ)プログラムがその好例です。高レベルのArduinoコードはすべての Arduinoファミリメンバーで同じですが、コンパイルされたマシンコードは、たとえば Microchip ATmega(旧 Atmel)とRenesas Armとでは大きく異なります。

希望のArduinoボードを選択すると、IDEは関連するハードウェア固有のファイルセットを使用するように指示します。Windowsマシンでは、C33用のPWMファイルはpwm.hとpwm.cppという名前です。これらは次の場所にあります:

C:\Users\your_name\AppData\Local\Arduino15\packages\arduino\hardware\renesas_portenta\1.1.0

このIDEプロセスには、さらに複雑なレベルがありますが、我々の議論にはこの過度に単純化した紹介だけで十分です。

PORTENTA Pro C33のPWM周波数とビット幅はどのように変更するのでしょうか?

プロセスは比較的簡単です。必要なのは、pwm.cppとpwm.hのペアに含まれる事前構築済みのPwmOutクラスをてこ入れすることだけです。以下のコードにあるように、pwm.hファイルをインクルードすることでプロセスを開始します。次のステップは、PwmOutのインスタンスをインスタンス化することです。このコードリストでは、インスタンスをmyPWMと呼びます。 myPWMを特定のI/Oピン(この例では D6)に関連付けることによってインスタンス化していることに注意してください。最後のステップは、myPWM.begin( ); を使ってPWMのインスタンスをアクティブにすることです。他に何もしなければ、PWMはデフォルトの490Hz、デューティサイクル50%で動作します。

pwm.hとpwm.cppファイルを調べると、PWMを設定および調整するための様々な方法が含まれていることがわかります。この例では、myPWM.period_us(40); を使ってPWMが25kHzで動作するように設定しています。 最後に、myPWM.pulse_perc(D_perc); を使ってデューティサイクルを調整します。デューティサイクルのパーセンテージ(D_perc)は浮動小数点型で、PWMのデューティサイクルを細かく制御できることに注意してください。このデモでは、動画1に示されているように、PWMはデューティサイクルが0%から100%にゆっくりと推移し、またゆっくりと戻ります。

#include "pwm.h"
#define PWM_PIN D6

PwmOut myPWM(PWM_PIN);  // constructor associating the PWM with a particular pin

void setup() {
  pinMode(PWM_PIN, OUTPUT);
  Serial.begin(9600);
  myPWM.begin();
  myPWM.period_us(40);
}

void loop() {
  static float D_perc = 0;
  static bool state = 1;
  if (state) {
    D_perc += 0.25;
    if (D_perc > 100){
      state = 0;
      D_perc = 100;
    }
  } else {
    D_perc -= 0.25;
    if (D_perc < 0){
      state = 1;
      D_perc = 0;
    }
  }

  myPWM.pulse_perc(D_perc);
  Serial.println(D_perc);
  delay(100);
}

デモコードの使用による結果

デモプログラムの結果は動画1に示されています。ここでは、Digilent Analog Discoverからの画面キャプチャと、Arduino IDEからのシリアルモニタデータを示しています。25kHzのPWM周波数(周期40us)は安定しているように見えます。デューティサイクルは、1ステップあたり0.25%の変化で滑らかに推移していることが分かります。

画像1: Arduino PORTENTA Pro C33は、0.25%ずつ滑らかに変化するPWMを備えた25kHzのPWMを生成することがわかります。

おわりに

これは確かに、最適化されたソリューションではありません。ただし、実装は比較的簡単で、サーボモータ制御に関する将来の記事で、優れた結果が得られることが期待されます。また、デューティサイクル制御が浮動小数点パーセンテージで表現されていることも、教育的見地から役立つでしょう。

あなたのニーズに合うようコードを簡素化したり、修正したりすることは、あなたにお任せします。ヒントや提案をお寄せ下さい。できれば、あなたのプロジェクトでこの強化されたPWM技術を使用した経験を共有してください。

ご健闘をお祈りします。

APDahlen

関連するArduino教育コンテンツについては、こちらのリンクをご覧ください。

著者について

Aaron Dahlen 氏、LCDR USCG(退役)は、DigiKeyでアプリケーションエンジニアを務めています。彼は、技術者およびエンジニアとしての27年間の軍役を通じて構築されたユニークなエレクトロニクスおよびオートメーションのベースを持っており、これは12年間教壇に立ったことよってさらに強化されました(経験と知識の融合)。ミネソタ州立大学Mankato校でMSEEの学位を取得したDahlen氏は、ABET認定EEプログラムで教鞭をとり、EETプログラムのプログラムコーディネーターを務め、軍の電子技術者にコンポーネントレベルの修理を教えてきました。彼はミネソタ州北部の自宅に戻り、このような記事のリサーチや執筆を楽しんでいます。 LinkedIn | Aaron Dahlen - Application Engineer - DigiKey




オリジナル・ソース(English)