ともさんの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カメラの製作(ステッピングモーターを動かす)

このエントリーをはてなブックマークに追加
広告
おすすめ記事
新着ページ

グラジオラスの栽培、手入れ、増やしかた  
カタクリの栽培、手入れ、増やしかた  
ズボンの持ち出しの作りかた  
オオイヌノフグリ  
ものつくり  
アロエの株分け  
屋根から作り始めて最後に基礎を作る建物  
メッシュアニメーション  
JavaFX アニメーション  
バードフィーダーの自作  
平坦なTriangleMesh作成Class  

私の他のサイト

ともさんの箱庭(ブログ)
家庭菜園
3D-CAD
洋裁CAD

いいねなど

 RSS 
PageSpeedInsights
html5チェック

Author: Tomoyuki Ito

このサイトの文章・写真の無断転載を禁じます