回路&ソフト検討

自作CNC加工機

モータドライバIC L293D に送る信号は、2つのHブリッジに対してそれぞれ二本、Enableが1本の5本です。そして、MACH3とやり取りする信号は、Enable、Direction、Pulse の3入力(MACH3→モータ)と、リミットスイッチの1出力ですので、少なくともI/Oは9本必要です。さらに、モニタ用のLED4本、予備の入出力などを考えると18ピンのPICを使うことになります。
で、使うことにしたのは 16F1827 です。初めて使うものです。構成は16F84Aをベースにあらん限りの機能を満載した進化の最終形といった風情で、使う機能を考えるとすごくもったいないのですが、秋月で安かったものをたくさん買ってしまったのでまあいいかと。

とりあえずのテスト用プログラムは以下の通り。
新しくなった Hitech XC8 コンパイラ用に書いています。リミットスイッチ割り込み周りはまだ書いておりません。

***************************************************************

// BiPolar Stepping Motor Driver for 16F1827
// compiler: MPLAB XC8 Compiler
// 2012/10

// Configration
// RA0,1,6,7: LED indicator or second input
// RA2: Enable input
// RA3: Direction input
// RA4: Rotation Pulse input
// RA5: Option (input only)
// RB0: INT Limit switch input
// RB1,2: Optional out put
// RB3: Enable out put to motor driver
// RB4,5,6,7: OUTPUT

// Driving method: 1-2 phase

#include <pic.h>

__CONFIG(CLKOUTEN_OFF & FOSC_INTOSC & FCMEN_OFF & IESO_OFF & BOREN_ON &
                PWRTE_ON & WDTE_OFF & MCLRE_OFF & CP_OFF & CPD_OFF) ;
__CONFIG(PLLEN_OFF & STVREN_ON & WRT_OFF & BORV_HI & LVP_OFF);

short PulseLevel=1; // memory rotation pulse level in last loop: active low
int StepNumber=0; // increment or decrement by every rotation pulse
// according to the direction

void main()
{
    OSCCON=0b01110010; // internal clock 8MHz
    ANSELA=0b00000000; // No analog for PORTA
    ANSELB=0b00000000; // No analog for PORTB
    TRISA=0b00111100; // Set I/O according to configuration
    TRISB=0b00000001; // Set I/O according to configuration
    PORTA=0b00000000; // reset out put
    PORTB=0b00000000; // reset out put

    while(1)
{
if(RA2==0) // check enable/disable
{
RB3=1; // put enable signal to motor driver

if((RA4==0) && (PulseLevel==1))
{
PulseLevel=0;
if(RA3==0)
StepNumber++;
else
StepNumber–;

switch(StepNumber%8)
{
case 0:
PORTB = (0b10010000);
PORTA = (0b01000010);
break;
case 1:
PORTB = (0b10000000);
PORTA = (0b00000010);
break;
case 2:
PORTB = (0b10010000);
PORTA = (0b10000010);
break;
case 3:
PORTB = (0b00100000);
PORTA = (0b10000000);
break;
case 4:
PORTB = (0b01100000);
PORTA = (0b10000001);
break;
case 5:
PORTB = (0b01000000);
PORTA = (0b00000001);
break;
case 6:
PORTB = (0b01010000);
PORTA = (0b01000001);
break;
case 7:
PORTB = (0b00010000);
PORTA = (0b01000000);
break;
}
}
else if((RA4==1) && (PulseLevel==0))
PulseLevel=1;
}
if(RA2==1)
RB3=0; // check & put enable/disable
}
}

*******************************************************************

で、ブレッドボードにさくっと組み立てて動作させます。
とか言いながら、実際はいつもどおりデバッグで数時間のた打ち回ります(笑

タクトスイッチでポチポチ1ステップずつ進める動作がうまくいきましたので、555を使って可変周波数の発振回路を作り、高速動作させて見ました。動作スキームは1-2相駆動です。
回路図は全体を固めてから描くつもりです。

ブレッドボードはこんな感じ。右が555です。

動作の様子を動画にしました。
半固定VRをいじるとLEDの点滅速度が変化するのがわかります。

コメント