モータドライバ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の点滅速度が変化するのがわかります。
コメント