線スペクトル偏光分光装置 CCD開発・製作報告

* PC パラレルポートによるスリットステージパルスモーター駆動

(2001.1.26 装置開発ゼミ資料)

Jan. 26, 2001.
(Nov. 16, 2021. Link URLs modified.)

前回の報告『SUN WSシリアルポートからの機器制御』
次の報告『スリットステージの筐体への組み込み・スリットのステージ座標の決定』


* 概要

装置の望遠鏡焦点面スリットの移動に、パルスモーターで駆動する 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反時計方向に回転し、 ステージが相当距離移動する。

実際の運用に必要な処理は以下のとおり。

これらの処理のために、5bit出力、4bit入力のパラレルポートが必要である。 パソコン(DOS/V PC)のパラレルポートはこれに十分である。

Slit stage
スリット移動用Xステージ。

Slit stage system overview
システム全体。

Motor controll driver box
パルスモータードライバボックス。右がドライバ。左がモーターのセンサ信号用 シュミットトリガ回路。

Slit stage system block diagram
システム全体構成図。

ケーブル配線メモ(備忘録)
配線メモ1| 配線メモ2| 配線メモ3

* PC (DOS/V PC)のパラレルポート

* パラレルポートとの入出力の 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とすると、
  1. a.outを、rootで実行する。
  2. 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バイト入出力)など類似関数がある。 このようなシステム関数については、普通オンラインマニュアルに詳しい 解説があるので参照のこと。

■ ウェイトのとりかた

ウェイト(待ち時間)を取るには、以下の方法を使用する。
  1. usleep( time ) : timeはμsec。
    但し、20msec以下は設定できない。
  2. ポートアドレス 0x80にデータ(何でも良い)を出力。ほぼ1μsecのウェイトがかかる。 これを適当回繰り返す。
    (例) outb( 0, 0x80)
  3. nanosleep( time )
    Kernel 2.0.x 以上でμ秒単位での制御が可能らしい。 (呼び方が良く分からなかった。)
2の方法が簡単。これを用いるには、0x80のポートにもioperm でアクセス許可を与える必要がある。

■ コンパイル

Linuxでコンパイルする際には、最適化オプション -O or -O2をつける必要がある。(マクロの解決のため)
(例) gcc -O2 -lm -o slitcont slitcont.c

* プログラム

■ 一覧

■ 原点合わせのアルゴリズム

起動後、次の様な順序でステージを原点に設定する。
  1. CCWリミット信号が見つかるまで、ステップ幅FULL(2μm/pulse)で ステージをCCW方向に移動。
  2. CCWリミット発見で移動一旦停止。
  3. 原点信号が見つかるまで、ステップ幅HALF(1μm/pulse)で ステージをCW方向に移動。
  4. 原点信号が見つかったところで移動停止。 その位置を原点(座標0)とする。

* 注意・雑記

* 参考資料

[LIPS CCD top page]


post 秋田谷 洋 (akitaya@astr.tohoku.ac.jp)