ともさんのHP >ものつくり >2次元CCDを使った自作カメラ >天体写真用冷却CCDカメラの製作(ステッピングモーターを動かす)
天体写真用冷却CCDカメラの製作(ステッピングモーターを動かす)
ステッピングモーターを動かす
赤道儀やドームなどもこのカメラから制御できるようにします。回路は下図のとおり。
マイコンの汎用入出力ポートから制御信号をステッピングモーター制御基板に渡し、この基板上の回路がモーターを駆動する電源を供給します。
わざわざモーターの制御基板を別にするのはなぜかというと...キットで販売されている基板を流用するためです。自分で作ると時間がかかるし、部品集めも大変です。流用なら安くてすぐに手に入ります。
ステッピングモーター制御基板に使うのは秋月電子通商で販売されている「PIC マイコン 楽天 制御ステッピングモータードライブキット」です。1200円なり。+500円でモーターも手に入ります。キットに小さなマイコンが付いてきますが、これは捨ててしまい、その場所に、あとで記述するプログラムを焼き込んだPIC16F84マイコンを取り付けて使います。
基板上のパターンは、下記。マイコンから出た信号をケーブルに取り出せるようにしているだけ。
C言語で書いたモーター制御関数は下記のとおり。ただし、これはまだ動作チェックしていないです。
#include <h8/reg3067.h> /*I/Oアクセス用インクルード*/
char stepmotor( unsigned long step, unsigned char houkou,unsigned long s_count, unsigned long c_count,unsigned long a_count,unsigned long wait) { /* H8-3069でステッピングmotorを駆動するための関数 PortA-0,1,2を使用する。 2003/1/9 3664用を修正して製作開始 新たに出力指令信号を設けるこの信号がLのとき、PIC側で信号を出力するようにする 端子割り当て 出力指令信号 pa 2bit目 0000 0100 駆動信号 pa 1bit目 0000 0010 方向信号 pa 0bit目 0000 0001 出力指令信号=Lのとき、PIC側は信号を出す //step モーターを駆動するステップ数 //houkou 回転方向 //s_count 初期カウント(速度/定数) //c_count 一定カウント //a_count stepごとの増減カウント数 //wait 時間待ち*/ unsigned long n_step; /*残りstep */ unsigned long k_step; /*減速に必要な残りステップ */ unsigned long count; /*現在のカウント */ unsigned long h_count; /*比較用カウント */ unsigned char io_flug; /*o点滅用フラグ */ unsigned char n_flug; /*ループ終了フラグ */
unsigned char tmp; unsigned long I;
/*不良引数のチェック*/ if((s_count-c_count)<a_count){return -1;} if (step < 0){return -2;}
/*変数の初期化(共通)*/ n_flug = 1; /*ループ終了フラグの初期化(2軸のときは2)*/
/*変数の初期化(x)*/ n_step = step; /*残りstepの初期化*/ k_step = (unsigned long)((float)(s_count-c_count)/((float)(a_count))); /*減速に必要なstep数の算出*/ count = s_count; /*現在カウントの初期化*/ h_count = 0; /*比較用カウントの初期化*/ io_flug = 0; /*ioflugの初期化*/
/*ioポートの準備*/ tmp = PADDR; tmp =( tmp | 0x07 ); /*portAの2,1,0bit目を出力に設定 01110000=0x70*/ PADDR =tmp; tmp = PADR; tmp = tmp & (~0x02); /*1bit目出力をL 0000 0010=0x02*/ tmp = tmp | 0x04; /*2bit目出力をH 0000 0100=0x04*/ if (houkou ==1){tmp = tmp | 0x01;} /*方向==1なら0bit目H 0000 0001= 0x01*/ if (houkou ==0){tmp = tmp & (~0x01);} /*方向==0なら0bit目L*/ PADR = tmp;
/*出力指令信号をLにしてPICに信号出力開始を指令する*/ tmp = PADR; tmp = tmp & (~0x04); /*2bit目出力をL*/ PADR = tmp;
/*点滅開始*/ do{ for(I=0;I<wait;I++){ ;} /*ウエイト*/ if(n_step>0) {h_count ++; } /*step残っていたらcount進める*/
/*x方向カウント処理*/ if(h_count == count){ switch(io_flug){ case 0: /*io=0のときの処理*/ tmp = PADR; tmp = tmp | 0x02; PADR = tmp; /*portA-1bit目をH*/ io_flug = 1; /*flug反転*/ h_count = 0; /*h_countクリア*/ /*デバッグ printf("カウント %x 残step %x ポートa %x",count,n_step,padr); デバッグ*/ break; case 1: /*io=1のときの処理*/ tmp = PADR; tmp = tmp & (~0x02); PADR = tmp; /*partA-1bit目をL*/ io_flug = 0; /*flug反転*/ h_count = 0; /*h_countクリア*/ n_step --; /*残りstep-1*/ if (n_step ==0){n_flug --;} /*規定ステップを終えたらn_hlug --*/ if(k_step>n_step){ /*減速段階になったときの処理*/ count = count + a_count; /*減速*/ }else{ if(count > c_count){ /*加速段階の処理*/ if (a_count > count) { count = c_count; /*加速*/ }else{count = count - a_count;} if(count <c_count){count = c_count;}/*一定速化*/ }/*end else*/ } break;} }/*h_count end if*/
}while(n_flug >0);
/*使用ポートをLに戻す*/ tmp = PADR ; tmp = tmp | 0x04 ; /*PortA 2bit目出力をH*/ PADR = tmp ;
/*使ったPORTを入力に直しておく*/ tmp = PADDR; tmp =( tmp & (~0x07) ); /*PADDRの2,1,0bit目を入力に設定 0000 0111=0x07*/ PADDR =tmp;
return 0; } |
引数について説明しておきます。
step:回転ステップ数です。モーターによって1ステップあたりの回転角度が違うので、モーターの仕様をみて決めます。
houkou:右/左回転を決めます。
モーターは下図のように回りはじめはゆっくりと回し、同様に回転終了時も速度を下げてやります。この速度を決定するのが下記の引数。
s_count:回転開始、終了時の速度を決めます。大きくするほど遅くなります。
c_count:一定になった時の回転速度を決めます。大きくするほど遅くなります。
a_count:回転開始、終了時の回転加速度を決めます。大きくするほど大きくなります。
wait:全体的な速度を調整します。大きくするほど遅くなります。
一般的にはなるべく早くまわしたいのですが、早回ししすぎるとトルクが落ちて回らなくなってしまいます。取り付ける装置によってこれらの数値を調整してあげます。
この関数は1度に1つのモーターしか動かせませんが、処理を工夫すれば2軸同時に動かすこともできます。恒星時に同期してモーターを動かしたい場合は、タイマー割り込みを使った関数を使います。
ステッピングモーター制御基板上のマイコンに焼き込むプログラムは下です。上の関数を使った制御では必ずこのマイコンプログラムを制御の受け手として使います。
このプログラムはアセンブラをいう、このマイコン用の言葉で書いてあります。
;2001/3/20作成開始 ;H8からの信号を受けてSTEPMotorを駆動するプログラム ;TomoyukiIto ;4つの磁石のうち、1つだけに電流を流す。 ;出力制御信号がLの間だけStepmotorに電流を流す。 ;AKIH83048の関数y_xymotor()に対応している。 ;PORTB-5:出力制御信号を受信 ;PORTB-6:回転方向信号を受信 ;PORTB-7:回転指令を受信 ;PORTB-0,1,2,3:STEPMOTORへ出力 list p=16f84 ;プロセッサ種類の指定 include "p16f84.inc" ;インクルードファイルの指定
__CONFIG _HS_OSC & _PWRTE_ON & _WDT_OFF
org 0x000 ;ReSetstart nop ;何もしない
;変数の宣言 sig1 equ 0dh
Start
;Portの設定 bcf STATUS,RP0 ;BANK0へ移動 clrf PORTA ;fレジスタのPORTAを0にクリア clrf PORTB ;fレジスタのPORTBを0にクリア bsf STATUS,RP0 ;BANK1へ移動 movlw B'1111' ; movwf TRISA ;PORTAを入力に設定(PORTAは使わない) movlw B'11110000' ; movwf TRISB ;PORTBを7-4入力3-0出力に設定 bcf STATUS,RP0 ;BANK0へ移動 clrf PORTA ;fレジスタのPORTAを0にクリア movlw B'00000000' ; movwf PORTB ;PORTBに0000 0000を出力 movlw B'00000001' ; movwf sig1 ;sig1を00000001にSET
;LOOP開始
;出力許可信号のチェック LOOP100 ;5bit目(出力許可信号)が0になるのを待つ BTFSC PORTB ,5 ;5bit目が0だったら次の命令をスキップ GOTO ZERO ;5bit目1の処理 GOTO LOOP0 ;5bit目0の処理
;出力許可信号=Hであれば、Stepmotorへの出力はL ZERO ;PORTB に****0000を出力 movf PORTB ,w ;PortB内容を読み込む ANDlw B'11110000' ; 0の部分を0にする movwf PORTB ;PORTBに結果を出力 nop nop GOTO LOOP100
;STEP信号がL→Hに変わったとき、Motorのステップを行う。 LOOP0 ;7bit目(STEP信号)が0になるのを待つ nop BTFSC PORTB ,5 ;5bit目が0だったら次の命令をスキップ GOTO ZERO ;5bit目1だったら出力を取りやめる nop BTFSC PORTB ,7 ;7bit目が0だったら次の命令をスキップ GOTO LOOP0 LOOP1 ;7bit目(STEP信号)が1になるのを待つ nop BTFSC PORTB ,5 ;5bit目が0だったら次の命令をスキップ GOTO ZERO ;5bit目1だったら出力を取りやめる nop BTFSS PORTB ,7 ;7bit目が1だったら次の命令をスキップ GOTO LOOP1
;方向信号に従って、信号シフトの方向を変える。 LOOP2 ;6BIT目(方向信号)を確認 nop BTFSS PORTB ,6 ;6bit目が1だったら次の命令をスキップ GOTO GYAKUTEN ;6BIT=0 逆転 GOTO SEITEN ;6BIT=1 正転 GOTO LOOP1
;正転時の処理(左シフト) SEITEN rlf sig1 ,1 ;1BIT左シフト BTFSC sig1 ,4 ;4BIT目が0だったら次の命令をスキップ GOTO SEITYOUSEI SEIOK movf PORTB ,w ;PortB内容を読み込む ANDlw B'11110000' ;0の部分を0にする IORWF sig1,w ;sig1の部分を1にset movwf PORTB ;PORTに1Step進んだ状態を入力 GOTO LOOP100 SEITYOUSEI movlw B'00000001' ; movwf sig1 ;sig1を00000001にSET GOTO SEIOK
;逆転時の処理(右シフト) GYAKUTEN BTFSC sig1 ,0 ;0BIT目が0だったら次の命令をスキップ GOTO GTYOUSEI rrf sig1 ,1 ;1BIT右シフト GOK movf PORTB ,w ;PortB内容を読み込む ANDlw B'11110000' ;0の部分を0にする IORWF sig1,w ;sig1の部分を1にset movwf PORTB ;PORTに1Step進んだ状態を入力 GOTO LOOP100 GTYOUSEI movlw B'00001000' ; movwf sig1 ;sig1を00001000にSET GOTO GOK
END
|
最終更新日: 2012-04-05 05:32:49
ともさんのHP >ものつくり >2次元CCDを使った自作カメラ >天体写真用冷却CCDカメラの製作(ステッピングモーターを動かす)
ツイート