000000 ランダム
 HOME | DIARY | PROFILE 【お気に入りブログ登録】 【ログイン】

CPUを作ろう ~計算機教材とマイコンと電子工作~

ステップモータ制御



ステップモータ制御


PICでプログラムを組んで,バイポーラ型のステッピングモータを回してみました.
1相,2相励磁の切り替えと,ステップ動作と,スピードの加減速ができるようにしました.


DCF_0346.JPG
実験した回路

IMG.jpg
回路図


動画はこちら.

プログラムは以下の通り.
最初,加速するまで何度も加速ボタンRA3を押さないといけませんが.

#include "pic.h"
#include "delay.h"
__CONFIG(HS & WDTDIS & PWRTDIS & UNPROTECT);

unsigned char fr; // moter direction, forward:1, reverse:0
unsigned char moter; // variable for moter rotation
unsigned char phase; // phase: 1 or 2
unsigned long speed; // couter for delay
unsigned char i,j;
unsigned char ph1[]={17,34,68,136}; // output pattern for phase 1
unsigned char ph2[]={51,102,204,153}; // output pattern for phase 2

main(){

/*
RA0: LED, off-> 1 phase, on-> 2 phase
RA1: change direction, forward -> reverse -> forward ....
RA2: step rotation
RA3: speed up
RA4: speed down
RB0-3: moter 1
RB4-7: moter 2
*/
TRISA=0b11111110;
TRISB=0b10000000;
RA0=0; RB0=0; RB1=0; RB2=0; RB3=0; RB4=0; RB5=0; RB6=0; RB7=0; // initiallize output off
fr=1;
phase=1;
speed=0;
moter=0;

while (1){
if (phase==1) RA0=0; else RA0=1; // LED ON-OFF to show phase 1 or 2

if (!RA1){ if (phase==1) phase=2; else phase=1;} // change phase
while (!RA1); // wait untouch RA1

if (!RA2){ // step ratation
speed =0;
rotation();
}
while (!RA2); // wait untouch RA1

if (!RA3){
if (speed<255) speed++;
}
while (!RA3);

if (!RA4){
if (speed>2) speed--;
}
while (!RA4);

if (speed!=0){
for(i=speed; i<255; i++){DelayUs(250); DelayUs(250);}
rotation();
}
}
}

rotation(){
if (fr){
if (moter==3) moter=0; else moter++;
} else {
if (moter==0) moter=3; else moter--;
}
if (phase==1) PORTB=ph1[moter]; else PORTB=ph2[moter];
}


Copyright (c) 1997-2018 Rakuten, Inc. All Rights Reserved.