So-net無料ブログ作成

ドライバボードを使用 モーターガイド guide motor [顕微鏡・機材など]

よくよく考えると、家のそばで、例えばベランダなどを使用する場合、
12Vとか24VのACアダプターでもOKかなっと思いまして・・・汗、だいぶ前に作りました、
2相用のモーターガイドを5相用に改造してご紹介です。
ドライバをちょっと変更しただけですが。

入出力が、まだ3個あまっていますので色々応用可能でしょう?
なおかつ非常にコンパクトに組みあがります。

参考までに、回路図をご紹介しておきましょう。5Vに変換する部分は図示していません。
モーターガイド.png
こんな簡単な感じで、ワンチップは今更ながらに便利ですね。

PIC16F84A のHITEC-Cによるソースです。

#define _LEGACY_HEADERS
#include "PIC.h"
#define _XTAL_FREQ 4000000 //4MHz
__CONFIG(HS & WDTDIS & PWRTDIS & UNPROTECT);

/************************************
16F84A  HI-TECH C v.9.83 
	
CPU			ドライバ	
PIC16F84A		SD5107P (内部フォトカプラの[ON:通電=L:シンク][OFF:非通電=H])
					接続しないとOFF=H
RA0		 →	CW		L→H	 CWに1step
RA1		 →	CCW		L→H	 CCWに1step
RA2		 →	AW		L=出力電流オフ H=出力電流オン	出力電流オフ入力
RA3		 →	F/H		L=HALF(0.36°) H=FULL(0.72°)
RA4		 →	CDin		カレントダウン解除信号の入力
					H=CWorCCWパルス停止後約0.1秒でモータへの出力電流を自動的に低下させる

switch (プルアップなので L=押す)
RB0		 →	Start
RB1		 →	Stop
RB2		 →	Right
RB3		 →	Left

LED
RB8		 →	H = Light ON

ウオームホイール144歯 10分でウオームギア1回転

1ステップ=0.018°(ハーフステップ)とするので、
360/0.018=20000step 10分 ⇔ 600s/20000=30ms 1step 

TIMER0割り込み
クロック4MHz→1クロック0.25μs→1命令サイクル1μs
プリスケーラレートを2とする
TMR0割り込み 1μs×2×256=0.512ms
30ms/0.512ms/2=29.296875

実際にはカウンタを1000倍として誤差をなくす???
***********************************/
//unsigned int	16	0 ~ 65,535
//unsigned long	32	0 ~ 4,294,967,295

static	bit m_Flag;				//動いているフラグ 
static	unsigned int m_ff;		//
static	unsigned int m_time;		//
static	unsigned int m_led;

static void interrupt warikomi(void) //割り込み処理
{
	//もし、タイマー割り込みなら…
	if(T0IF){
		T0IF = 0;	// TMR0割り込み禁止
		//m_timeが14648(30ms/2)になったら
		m_time = m_time+512;
		if (m_time>14648){	//14648*0.512/1000*2=14999.552msごとにH→L
			m_time=m_time-14648;
			//H or Lの切り替え 4回?で1step(L→H→L→H)
			if (m_ff==0) 	m_ff=1;
			else m_ff=0;
		}
		m_led++;
		if (m_led>976){		//976*0.512*1000=499.712ms*1000
			m_led=m_led-976;
			if (RB7==0) RB7 = 1;			// LEDon
			else RB7 = 0;					// LEDoff
		}
		return;
	}
}

//PIC16F84でないとだめ(PIC16CL84はだめ)


main(void)
{
	//入出力設定
	//		I/O ポート設定値 0=出力 1=入力
	INTCON = 0;		//bit7(~3)=0 全ての割り込みを使用不可にする
	RBPU = 1;
	PORTA = 0;
	TRISA=0b00000000;          // PORTA IO を出力に設定
	PORTB = 0;
	TRISB=0b00001111;          // PORTB IO 0-3を入力 4-7出力に設定

	RA0 = 1;			// CWoff
	RA1 = 1;			// CCWoff
	RA2 = 0;			// 出力電流オフ
	RA3 = 0;			// ハーフステップ(1step = 0.018°)
	RA4 = 1;			// カレントダウン


	RB7 = 0;			// LEDチカチカチカ
	__delay_ms(250);
	RB7 = 1;
	__delay_ms(250);
	RB7 = 0;
	__delay_ms(250);
	RB7 = 1;
	__delay_ms(250);
	RB7 = 0;
	__delay_ms(250);
	RB7 = 1;
	__delay_ms(250);
	RB7 = 0;



	GIE = 1;			//すべての割り込み許可
	T0IE = 0;			//タイマー割り込みを禁止

	T0CS = 0;			//TIMER0モジュールをタイマーとして使用
	PSA = 0;			//プリスケーラをTIMER0モジュール用にセット。

	OPTION &= 0xF8;
	OPTION |= 0x00;//CPUクロックを2分周

	TMR0 = 0x00;		//カウンタ値をリセット

	m_Flag = 0;
//	T0IE = 1;			//タイマー割り込みを許可

	int ii = 0;
	m_ff=0;
	while(1)
	{
		if ((RB1!=0)&&(m_Flag==1)) {	// RB1 が H の時 stop
			T0IE = 0;					// TMR0割り込み禁止
			RA0 = 1;			// CWoff
			RA1 = 1;			// CCWoff
			RB7 = 0;			// LEDoff
			m_Flag=0;
			m_led = 0;
			m_time=0;
			RA2 = 0;			// 出力電流オフ
			RB7 = 0;
			__delay_ms(100);
			RB7 = 1;
			__delay_ms(100);
			RB7 = 0;
			__delay_ms(100);
			RB7 = 1;
			__delay_ms(100);
			RB7 = 0;
		}
		if ((RB0!=0)&&(m_Flag==0)) {	// RB0 が H の時 start
			RA0 = 1;			// CWoff
			RA1 = 1;			// CCWoff
			RB7 = 1;			// LEDon
//			__delay_ms(100);
//			RB7 = 0;
			TMR0 = 0x00;				//カウンタ値をリセット
			T0IE = 1;					// TMR0割り込み許可
			m_Flag=1;
			m_led = 0;
			m_time=0;
			RA2 = 1;			// 出力電流オン
		}

		if ((RB2!=0)&&(m_Flag==0)) {	// RB2が H の時 1分ぶん=36°Fast_move
			RA2 = 1;			// 出力電流オン
			RA0 = 1;			// CWoff
			RA1 = 1;			// CCWoff
											//144歯で24h ウォーム1回転で10分なので
			for (ii=0;ii<2000;ii++){			//0.018*2000=36°→ 360°/36°=1分進む
				RB7 = 1;			// LEDon
				__delay_us(250);
				RB7 = 0;			// LEDoff
				//
				RA0 = 0;			// CW
				__delay_us(250);
				RB7 = 1;			// LEDon
				__delay_us(250);
				RB7 = 0;			// LEDoff
				//
				RA0 = 1;
				__delay_us(250);
			}
			m_time=0;
		}
		if ((RB3!=0)&&(m_Flag==0)) {	//RB3 が H の時 1分ぶん=36°Fast_move
			RA2 = 1;			// 出力電流オン
			RA0 = 1;			// CWoff
			RA1 = 1;			// CCWoff
			for (ii=0;ii<2000;ii++){
				RB7 = 1;			// LEDon
				__delay_us(250);
				RB7 = 0;			// LEDoff
				//
				RA1 = 0;			// CCW
				__delay_us(250);
				RB7 = 1;			// LEDon
				__delay_us(250);
				RB7 = 0;			// LEDoff
				//
				RA1 = 1;
				__delay_us(250);
			}
			m_time=0;
		}
		//タイマ作動中
		if (m_Flag==1){
//			RA0 = 1;			// CWoff
			RA1 = 1;			// CCWoff
			RA2 = 1;			// 出力電流オン
			//
			// CW pulse
			if (m_ff==0) 	RA0=0;
			else RA0=1;
		}
		else{
			RA0 = 1;			// CWoff
			RA1 = 1;			// CCWoff
			RB7 = 0;			// LEDoff
		}
	}

}


12/12追記)上のプログラムの修正はこちら

どの程度正確なのか10分計測してみました。早送りの動画です。

movは
若干ずれていますね。

はじめと、モーター1回転後(10分後で時計の秒針も重なるはず)を重ねますと、
モーターガイド10分計測.jpg
十数秒のずれが・・・アセンブラで組むともうちょっと正確になるのでしょうか。

普通、捨ててしまう少数以下を1000倍して先送りしているのですが。
計算違い?それとも、外部トリガーにすべきでしょうか。


うーん、ものづくりって難しいですね。tohoho

簡単なものですが、商用にはならないと思いますので、ソース、回路図はご自由にお使い下さい。
もし、ご紹介頂くのでしたら、参照かリンクしていただくとうれしいですね。
では

2019.12.10(C)dumbo
nice!(15)  コメント(0) 
共通テーマ:趣味・カルチャー

nice! 15

にほんブログ村 教育ブログへ

コメント 0

コメントを書く

お名前:
URL:[必須]
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。