google-site-verification: google3bd66dd162ef54c7.html

Arduinoを使ったパルスジェネレーターの製作、(ハード検討)

 Arduinoを使ったパルスジェネレータ作り、今回はハードウェアをどうするかというか、どうしたかという話です。

 結局、こうしました。

▼回路図
20160228PG_Schem.png
 最小限の部品だけで作りたいので、ロータリーエンコーダーが一つと、タクトスイッチ3つだけにしました。トグルスイッチなどを使うとソフトが簡単になるのですが、ここはソフトを工夫することで安いタクトスイッチだけで済ませます。おっと、ここには書いていませんが表示にはキャラクタ液晶を使います。

 CPUのポートが壊れると痛いので、最終的には74HC04をパラにいっぱい使ったバッファ経由で出力するのがいいかな、と思っています。

▼ブレッドボード
20160228IMG_4699.jpg
 まだArduino UNOの状態で動かしていますが、最終的にはCPUチップのATmega328の単独動作にして、安くコンパクトに仕上げる予定です。

 液晶に何やらそれっぽい表示が出ています。実はプログラムはほとんど出来ていて、現在微調整中です。

Arduinoを使ったパルスジェネレーターの製作、(方式検討)

 Arduinoでパルスジェネレーターを作ってみることにしました。うちにはHP3315Aというファンクションジェネレータがあるので、これをパルスジェネレーターの代りに使えないことはありません。でも、出力をその都度CMOSレベルに合わせるのは面倒だし、デューテー比が5%までしか絞れなかったりするので、ちょっと使い難いのです。

 ところでArduinoでパルジェネを作る場合、どうやって正確なタイミングのパルスを発生させるかが問題になります。

 以前作ったLEDストロボ"では、micros()関数を使って経過時間の値を得ることで、タイミング制御を行いました。この方法は判り易いのですが、常に時刻の監視が必要で、その合間を縫って表示やスイッチの監視をやらないといけません。もたもたしていると次のパルス発生の時刻になるのでプログラム作りはかなり面倒でした。

 実は後で気付いたのですが、Timer1割り込みをうまく使えば、数十μsでも正確なタイミングでパルスの発生が可能でした。この頃はタイマー割込みはMsTimer2しか知らなかったのでこういうことが起きてしまいました。ちなみにMsTimer2は1msステップの値しか設定出来ず、μs単位のタイミングの指定は出来ません。

 Timer1はもちろん割り込み処理なので、メインのルーチンはパルス発生とは無関係に動かすことが出来て、タイミングの問題に煩わされることはありません。

 ということで、Timet1割込みを使ったパルス発生のプログラムを書いてみました。

▼割込みによるパルス発生のテストプログラム
// Timer1でパルス出力のテスト
// 2016/2/25 ラジオペンチ http://radiopench.blog96.fc2.com/

#include <TimerOne.h>

long t1 = 2000; // パルスON時間 2ms
long t2 = 8000; // パルスOFF時間 8ms

void setup() {
pinMode(13, OUTPUT);
Timer1.initialize(10000); // 10ms後に割込みループ開始
Timer1.attachInterrupt(T1Isr); // Timer1割込み開始
}

void loop() {
}

// タイマー割り込みでパルス出力
void T1Isr() {
digitalWrite(13, HIGH); // パルスON
Timer1.setPeriod(t1); // パルス幅セット
Timer1.attachInterrupt( T2Isr ); // タイムアップでT2Isr
}

void T2Isr() {
digitalWrite(13, LOW); // パルスOFF
Timer1.setPeriod(t2); // 次のパルス
Timer1.attachInterrupt( T1Isr ); // タイムアップでT1Isrに戻る
}
 Timer1の割込み処理ルーチンの T1Isr() とT2Isr() の間が無限ループになり、連続パルスが発生します。setup()から無限ループに投入する方法がこれで良かったのか、あまり自信はありません。loop() では何もやっていませんが、ここにユーザーインターフェイスのプログラムを書くことになります。

 このプログラムではパルスのON時間は2ms、OFF時間は8msに設定していますが、波形を確認してみると、

▼波形
出力波形
 プログラムした通り、周期10msでデューティ20%のパルスが出ています。

▼パルス周波数
周波数
 100Hzになっていて欲しいのですが、少し低いです。Arduino UNO R3で動かしているので、セラロックの精度が悪いのが見えている、あるいは割込み処理のオーバーヘッドの影響だと思います。digitalWriteは遅いので、ポートをビット操作した方が良さそうです。

 ともかくTimer1を使って連続パルスを発生させることが出来ました。この後はパルス幅などを簡単に設定出来るようにするため、操作系のプログラムを作り込んでいくことにします。
カレンダー
01 | 2016/02 | 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 - - - - -
プロフィール

ラジオペンチ

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

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