Arduino 101/ Genuino 101のPWM出力を試してみました。
調べてみたところ101のPWM周波数のデフォルトは490Hzのようです。変更できないか調べていたら「CurieTimerOne」ライブラリというのが準備されていて、PWM出力の実装もされていました。
▼PWM出力▼
#include "CurieTimerOne.h" void setup() { CurieTimerOne.pwmStart(12, 25.0, 1000000); }
引数は順番にピン番号、Duty、周波数です。Dutyは%か、もしくは0-1023の間で設定可能。周波数はμsです。この関数を使用すれば結構自由度の高いPWM周波数が設定できそうです。
ただこの関数、複数ピンのPWM出力に対応していないようで、いろいろ弄ってみましたが複数ピン出力のやり方はわかりませんでした。(←誰かわかる方いたら教えてください)
しかたがないのでスケッチで無理やりですが、PWM出力を記述してみました▼
#include "CurieTimerOne.h" #define PWM1_duty 30 #define PWM2_duty 70 #define PWM_freq 1000 //microsec #define PWM_resolution 100 int PWM_cnt; void setup() { pinMode(13, OUTPUT); pinMode(12, OUTPUT); CurieTimerOne.start(PWM_freq / PWM_resolution, &PWMIsr); } void loop() { delay(100); } void PWMIsr() { if (PWM_cnt <= PWM1_duty) { digitalWrite(13, 1); } else { digitalWrite(13, 0); } if (PWM_cnt <= PWM2_duty) { digitalWrite(12, 1); } else { digitalWrite(12, 0); } PWM_cnt ++; if (PWM_cnt == PWM_resolution) { PWM_cnt = 0; } }
「CurieTimerOne.start」 はタイマー関数です。Timer割り込みでPWM周波数を制御してます。スケッチでは12,13ピンをPWM出力用に設定。Dutyは30%と70%、PWM周波数は1000Hzに設定してます。上記で記述すればピンの制限はありません。
▼ロジアナで確認してみました▼
きっちり周波数1000Hzとなってます。
ただTimerを無駄にしてしまうのと、割り込み処理時間の影響がでるため周波数にも限界が出てしまいます。もっと良いやり方がないかもう少し探ってみたいと思います。
⊿1:GitHubでいつ頃からかライブラリが公開されていました。これで.hや.cppの中身が読めます。Timer1を使って複数ピンに対応したPWM周波数の変更を別の方法でも試してみました。
コメント