線スペクトル偏光分光装置 CCD開発・製作報告
PC パラレルポートによるスリットステージパルスモーター駆動
(2001.1.26
装置開発ゼミ資料)
Jan. 26, 2001.
(Nov. 16, 2021. Link URLs modified.)
概要
装置の望遠鏡焦点面スリットの移動に、パルスモーターで駆動する
xステージを使用する。このパルスモーターの駆動には適当な
パルス出力、状態信号出力、ステージ位置センサーからの信号
入力が必要となる。
これらは、最終的にはMessia-IVのパラレルI/Oポートを用いる予定で
あるが、Messia-IVがない環境で、スリット移動を伴う実験を
行う必要があることから、一般のパソコンのパラレルポートによる
パルスモーターの制御システムを構築した。
Xステージ・パルスモーターについて
使用ステージ: 駿河精機 K101-20。
駆動用パルスモーターにはオリエンタルモーター社の5相モーターで、
専用ドライバーを通して使用する。
制御に必要な入出力信号は次のとおり。いずれもTTL 5V。
- ● 出力(5ch)
- (1) CW方向駆動用パルス(再速で100μsec幅; 10mm/sec相当)
- (2) CCW方向駆動用パルス
- (3) モーター電流 on/off
- (4) ステップ幅変更(FULL:2μm/step、HALF:1μm/step)
- (5) 自動カレントダウン機能 on/off
- ● 入力(4ch)
- (1) CW方向リミット信号
- (2) CCW方向リミット信号
- (3) 原点信号
- (4) TIMING信号(HALF ステップ20パルスに1回出力される)
モーターは、出力(1)or(2)のパルスの立上りで時計方向or反時計方向に回転し、
ステージが相当距離移動する。
実際の運用に必要な処理は以下のとおり。
- 状態出力(3)-(5)を常に希望の設定で出力しつつ、(1)か(2)の
チャネルを適当な周期(100μsec以上)で、on/offを繰り返して
パルス信号を生成し、モーターを駆動させる。
- モーターが1パルス駆動ごとにリミット信号(1)、(2)が発生していないか
確認する。また、立ち上げ直後には、絶対位置決定のために、
ステージを適当に動かし原点信号(3)を検出する。
これらの処理のために、5bit出力、4bit入力のパラレルポートが必要である。
パソコン(DOS/V PC)のパラレルポートはこれに十分である。
スリット移動用Xステージ。
システム全体。
パルスモータードライバボックス。右がドライバ。左がモーターのセンサ信号用
シュミットトリガ回路。
システム全体構成図。
ケーブル配線メモ(備忘録)
配線メモ1|
配線メモ2|
配線メモ3
PC (DOS/V PC)のパラレルポート
- 信号レベル: TTL(0 - 5 V)
- 出力: 12 bits (うち論理反転 が3 bits)
- 入力: 5 bits (うち論理反転が 1bit)
- 入出力ポーアドレス: BASE Address 〜 BASE Address +2
- データポート(BASE Address + 0) : 出力 8 bits
- ステータスポート(BASE Address + 1) : 入力 5 bits
- コントロールポート(BASE Address +2 ) : 出力 4 bits
- BASE Address (多くの場合)
- lp0 : 0x3BC
- lp1 : 0x378
- lp2 : 0x278
パラレルポートとの入出力の Cプログラミング
■ ベースアドレスを知る
使用するポートのベースアドレスを調べる。
例えば、オンボードのパラレルポート lp0は、多くの場合、0x3BC。
BIOSの設定画面などで、調査・設定が可能。
■ ポートの初期設定 (Linuxの場合)
ポートにデータを出力するには、それぞれのアドレスについて
root権限でプログラムに読み書きの許可を与えることが必要。
使用する関数 :
- ioperm( from, num, turn on ) : unistd.hで定義
- from : 読み書きを許すポートの開始アドレス
num : 連続していくつのアドレスの許可を与えるか
turn_on : 許可の種類(1:読み書き可、0:読み書き不可)
lp0の場合、0x3bcから3アドレス連続して書き込みを行うので、
#include
ioperm( 0x3bc, 3, 1 );
とする。
これらを含むCプログラムを、root権限で実行しなければ
ならない。これには、コンパイル済の実行ファイルをa.outとすると、
- a.outを、rootで実行する。
- a.outの所有者をrootとし、sticky bitを立てる
% su root
# chown root a.out
# chmod +s a.out
# exit
の2通りがある。後者は一般ユーザーで実行できるため安全上お薦め。
Windows/DOSの場合は、ポートの書き込み許可の設定は特に必要ないようである。
■ ポートへの出力
以下の関数を使用して、適当なポートに1 byteデータを出力する。
- 出力
- void outb(unsigned char value, unsigned port) : Linux
outp( port, value ) : Windows/DOS
- 入力
- unsigned inb(unsined port) : Linux
inp( port ) : Windows/DOS
Linuxの関数は、asm/io.h、DOSの関数はdos.hで定義。
Linuxの場合、他にもinb_p、outb_p (入出力後に1μ秒ウェイト)、inw、outw、
inw_p、outw_p(2バイト入出力)など類似関数がある。
このようなシステム関数については、普通オンラインマニュアルに詳しい
解説があるので参照のこと。
■ ウェイトのとりかた
ウェイト(待ち時間)を取るには、以下の方法を使用する。
- usleep( time ) : timeはμsec。
但し、20msec以下は設定できない。
- ポートアドレス 0x80にデータ(何でも良い)を出力。ほぼ1μsecのウェイトがかかる。
これを適当回繰り返す。
(例) outb( 0, 0x80)
- nanosleep( time )
Kernel 2.0.x 以上でμ秒単位での制御が可能らしい。
(呼び方が良く分からなかった。)
2の方法が簡単。これを用いるには、0x80のポートにもioperm
でアクセス許可を与える必要がある。
■ コンパイル
Linuxでコンパイルする際には、最適化オプション -O or
-O2をつける必要がある。(マクロの解決のため)
(例) gcc -O2 -lm -o slitcont slitcont.c
プログラム
■ 一覧
■ 原点合わせのアルゴリズム
起動後、次の様な順序でステージを原点に設定する。
- CCWリミット信号が見つかるまで、ステップ幅FULL(2μm/pulse)で
ステージをCCW方向に移動。
- CCWリミット発見で移動一旦停止。
- 原点信号が見つかるまで、ステップ幅HALF(1μm/pulse)で
ステージをCW方向に移動。
- 原点信号が見つかったところで移動停止。
その位置を原点(座標0)とする。
注意・雑記
- マルチタスクのLinux、Windowsでは、当然他のタスクの処理状況により
プログラム処理速度が変化しうる。実際、モーター駆動駆動中に
ウィンドウの操作などを行うと、回転速度にむらが生じた。
純MS-DOSではそういうことはなさそうだが、まだ試していない。
- FreeBSDやSolarisで、inb、outb相当の方法を探したが見つからなかった。
ご存知の方教えて下さい。
- 初期のPC-9801では、パラレルポート(プリンタポートと呼称)は、
プリンタ制御に限定されており、入出力チャネルが少なく実用的でない。
(代わりにちゃんとしたI/Oインタフェースがついているが。)
PC-9821Ap以上では、アドレスが異なるのみでDOS/Vと同様の
パラレルポート機能を備えている。
- 最近のパラレルポートでは、Data bit 0-7を入出力に切替えられる、
『双方向パラレルポート(拡張モード)』が使用できるらしい。
参考資料
秋田谷 洋
(akitaya@astr.tohoku.ac.jp)