ステップモータ制御
PICでプログラムを組んで,バイポーラ型のステッピングモータを回してみました.
1相,2相励磁の切り替えと,ステップ動作と,スピードの加減速ができるようにしました.
実験した回路
回路図
動画はこちら.
プログラムは以下の通り. 最初,加速するまで何度も加速ボタン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]; }
ESP32 Wifi Bluetooth開発ボード |
Arduino Nano Every |
Raspberry Pi pico |
FPGA XILINX Artix-7 |