ドライバボードを使用 モーターガイド guide motor [望遠鏡、天体観測]
よくよく考えると、家のそばで、例えばベランダなどを使用する場合、
12Vとか24VのACアダプターでもOKかなっと思いまして・・・汗、だいぶ前に作りました、
2相用のモーターガイドを5相用に改造してご紹介です。
ドライバをちょっと変更しただけですが。
入出力が、まだ3個あまっていますので色々応用可能でしょう?
なおかつ非常にコンパクトに組みあがります。
参考までに、回路図をご紹介しておきましょう。5Vに変換する部分は図示していません。
こんな簡単な感じで、ワンチップは今更ながらに便利ですね。
PIC16F84A のHITEC-Cによるソースです。
12/12追記)上のプログラムの修正はこちら。
どの程度正確なのか10分計測してみました。早送りの動画です。
再生できない場合、ダウンロードは🎥こちら
movは
若干ずれていますね。
はじめと、モーター1回転後(10分後で時計の秒針も重なるはず)を重ねますと、
十数秒のずれが・・・アセンブラで組むともうちょっと正確になるのでしょうか。
普通、捨ててしまう少数以下を1000倍して先送りしているのですが。
計算違い?それとも、外部トリガーにすべきでしょうか。
うーん、ものづくりって難しいですね。tohoho
簡単なものですが、商用にはならないと思いますので、ソース、回路図はご自由にお使い下さい。
もし、ご紹介頂くのでしたら、参照かリンクしていただくとうれしいですね。
では
2019.12.10(C)dumbo
12Vとか24VのACアダプターでもOKかなっと思いまして・・・汗、だいぶ前に作りました、
2相用のモーターガイドを5相用に改造してご紹介です。
ドライバをちょっと変更しただけですが。
入出力が、まだ3個あまっていますので色々応用可能でしょう?
なおかつ非常にコンパクトに組みあがります。
参考までに、回路図をご紹介しておきましょう。5Vに変換する部分は図示していません。
こんな簡単な感じで、ワンチップは今更ながらに便利ですね。
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分後で時計の秒針も重なるはず)を重ねますと、
十数秒のずれが・・・アセンブラで組むともうちょっと正確になるのでしょうか。
普通、捨ててしまう少数以下を1000倍して先送りしているのですが。
計算違い?それとも、外部トリガーにすべきでしょうか。
うーん、ものづくりって難しいですね。tohoho
簡単なものですが、商用にはならないと思いますので、ソース、回路図はご自由にお使い下さい。
もし、ご紹介頂くのでしたら、参照かリンクしていただくとうれしいですね。
では
2019.12.10(C)dumbo
コメント 0