Shujima Blog

Apple製品,技術系の話をするブログ

Arduino DueのPWM周波数を変える mac版(variant.h編集)

こちらを参考にmacでやろうとして戸惑ったので.

http://anbalab.com/summary/duepwm

環境

variant.hのディレクトリ

ここにありました!

~/Library/Arduino15/packages/arduino/hardware/sam/1.6.12/variants/arduino_due_x/

※~は/Users/<ログインユーザ名>/を指す省略表記です ※Arduino15,1.6.12の数字はバージョンにより異なります.自分のパッケージのバージョンを確認してください

1.6.12の場合は上のディレクトリをファインダーでShift+Command+Gで出てくる「フォルダの場所を入力」機能でジャンプできます.

f:id:masa_flyu:20180728222632j:plain

PWMの周波数を変える手順

variant.hを開きます. 220行目あたりをみますと,

//以下はvariant.hの220行目から

/*
 * PWM
 */
#define PWM_INTERFACE      PWM
#define PWM_INTERFACE_ID   ID_PWM
//#define PWM_FREQUENCY        1000
#define PWM_FREQUENCY      4000
#define PWM_MAX_DUTY_CYCLE 255
#define PWM_MIN_DUTY_CYCLE 0
#define PWM_RESOLUTION     8

/*
 * TC
 */
#define TC_INTERFACE        TC0
#define TC_INTERFACE_ID     ID_TC0
//#define TC_FREQUENCY        1000
#define TC_FREQUENCY        4000
#define TC_MAX_DUTY_CYCLE   255
#define TC_MIN_DUTY_CYCLE   0
#define TC_RESOLUTION      8

のようにdefine定義が連なっています.

このうち,PWM_FREQUENCYTC_FREQUENCYを変えたいPWM周波数[Hz]に書き換えます. 私の場合は226行目と236行目でした. 念の為,書き換える前のコードをコメントアウトして残しました.

あとはこれを保存さえすれば,再起動などをしなくても,書き込みなおすだけで,周波数が変更されます.

ちなみに,PWMのデューティもより細かく変更できます

masa-flyu.hatenablog.com

どこまで周波数を高くできるか

このクソみたいなプログラムで実験してみました.

//このプログラムは Arduino DUE 用です
void setup() {
  analogWrite(11,100);
}

void loop() {
}

今回,PWMを変更する目的は,モータを動かすときの雑音が気になったからです. 可聴域の上限である20kHzまで上げれたら御の字でしょう.

というわけで実験開始

まずは5kHz,

f:id:masa_flyu:20180728220820j:plain
5000 = 5kHz (50us/div)

難なくクリア,続けて大台10kHz,

f:id:masa_flyu:20180728220949j:plain
10000 = 10kHz (50us/div)

そして目標の20kHz,

f:id:masa_flyu:20180728221044j:plain
20000 = 20kHz (50us/div)
ぜんぜんいけますね! 限界を見たくなったので一応続けます.一気に飛んで100kHz,

f:id:masa_flyu:20180728221229j:plain
100000 = 100kHz (5us/div)
divを広げましたがまったく問題ないですね.うっすら縦線が見え始めています. 1桁増やして1MHz,

f:id:masa_flyu:20180728221447j:plain
1000000 = 1MHz (0.2us/div)

傾斜が見えてきました.続けて5MHz,

f:id:masa_flyu:20180728221705j:plain
5000000 = 5MHz (0.2us/div)

かなり形が崩れてますね.この辺が限界でしょう.最後に10MHz,

f:id:masa_flyu:20180728221716j:plain
10000000 = 10MHz (0.2us/div)

ピークは一瞬ですね.もはやPWMとは呼べないでしょう.

用途にもよりますが,5MHzくらいまでいけるんじゃないでしょうか.こんなに必要な用途思いつきませんがね...

当ブログをご利用いただく際には免責事項をお読みください。