google-site-verification: google3bd66dd162ef54c7.html

Timer1とFlexiTimer2を使ったバーストパルス発生の実験

 Arduinoを使ったパルスジェネレーターを最近作りましたが、まだまだメモリーに余裕があります。これを遊ばせておくのはもったいないので、もう少し機能を追加したいと思います。

 機能追加の候補としては、バーストパルス発生、サーボテスト信号発生、ストロボスコープ信号の発生です。

 このうちで厄介そうなのはバーストパルスの発生です。現在のパルスジェネレーターは、パルスのONとOFFの時間をTimer1割り込みの値を交互に切り替えることで、タイミングを作っています。(下図参照)

▼パルスの発生原理
ノーマルパルス
 この方法は単純で判り易いのですが、毎回タイマーの設定をやり直さないといけないのでオーバーヘッドが発生するのが難点です。

 この方法のままでバーストパルスを発生させると、オーバーヘッドが累積するため大きな誤差になることが予想されます。この問題を解決するために、もう一つ別のタイマー割り込みを使うことにします。

▼タイマー割り込みを二つ使ったバーストパルスの発生
バーストパルス
 この図のように、バーストの発生周期はFlexiTimer2で、バーストそのものの周期はTimer1で発生させてやれば、タイミング誤差の少ないパルス発生が出来るはずです。

 実はこれをやりたくてFlexiTimer2の使い方を調べていたのですが、制約条件はいろいろあるものの、なんとか思い通りに動かせるようになりました。そこで、早速Timer1と組み合わせてバーストパルスの発生のテストを行ってみました。動作の原理は、上の図の通りです。

▼バーストパルス発生のテストプログラム
/* FlexiTimer2とTimer1の同時使用テスト
* インターバルはFlexiTimer2で、バーストのON/OFF時間はTimerOneで発生
* 2016/3/28 ラジオペンチ
*/

#include <FlexiTimer2.h>
#include <TimerOne.h>
#include <LiquidCrystal.h>

#define led_pin 13

volatile int burstN;
volatile boolean sigFlag;

unsigned long MI; // メインインターバル
unsigned long BI; // バーストインターバル(周期の半分の値をセット
int BPN; // バーストパルス数

void setup() {
pinMode(led_pin, OUTPUT);
pinMode(14, OUTPUT);
MI = 50; // 50*60μs= 3ms
BI = 30;
BPN = 10;
IntervalSet(MI);
}

void loop() {
}

void IntervalSet(unsigned long t) { // メインインターバル設定
FlexiTimer2::stop();
FlexiTimer2::set(t, 0.00006, IRQ_FT2); // 注:40usだとジッタが大きいかも
FlexiTimer2::start();
}

void IRQ_FT2() { // FlexiTimer2の割込み処理
sigFlag = false; // 開始位相はネガ
burstN = BPN; // バーストパルス数設定
Timer1.initialize(BI); // Timer1にバーストインターバルセット
digitalWrite(14, HIGH); // バースト同期パルス発生
Timer1.attachInterrupt(IRQ_timer1); // Timer1割込み開始
digitalWrite(14, LOW);
}

void IRQ_timer1() { // TimerOneの割込み処理
sigFlag = ! sigFlag; // 極性反転して
digitalWrite(13, sigFlag); // ポートへ出力
if (sigFlag == false) { // LOWになっていた場合は
burstN--; // カウンタをデクリメント
if (burstN == 0) {
Timer1.stop(); // Timer1割込み停止
}
}
}
3ms周期で、10発のバーストパルス(デユーテーイ50%、周期60μs)を発生させるプログラムになっています。

▼波形
バースト波形
 横軸は0.5ms/div. 波形の上はバーストパルスで、下は同期信号です。バースト周期3msで10発のパルスが発生しています。

 ということで、何とかバーストパルスが発生できるようになりました。

 記事の最初に書いたサーボテスト信号などは簡単なプログラムを書くだけで作れるはずです。ただ問題は、これらの機能を、どうやって既存のパルスジェネレーターに組み込むかです。

 複数の機能を簡単なボタン層背で使えるようにしないといけませんが、プログラムを組むのが面倒です。さて、どうしたものやら。
関連記事

コメントの投稿

管理者にだけ表示を許可する

カレンダー
02 | 2017/03 | 03
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 -
プロフィール

ラジオペンチ

Author:ラジオペンチ
電子工作を中心としたブログです。たまに近所(東京都稲城市)の話題など。60過ぎて視力や器用さの衰えを感じつつ日々挑戦!
コメントを入れる時にメールアドレスの記入は不要です。なお、非公開コメントは受け付けていません。

記事が気に入ったらクリックを!
最新記事
カテゴリ
最新コメント
リンク
FC2カウンター
検索フォーム
月別アーカイブ
RSSリンクの表示
QRコード
QRコード