一、硬件設(shè)計
硬件使用了51單片機,L297和L298。
CW/CWW是控制電機方向,高電平正轉(zhuǎn),低電平反轉(zhuǎn)。
CLOCK是時鐘信號,給一個脈沖,便會有一個步進(jìn)。
HALF/FULL是選擇一次半步進(jìn)還是全步進(jìn)。假如電機步進(jìn)一次90°,那么半步進(jìn)就是45°。
仿真圖
二、軟件設(shè)計
使用定時器來進(jìn)行精確的定時,然后在定時器中斷中改變步進(jìn)電機狀態(tài)。
- #include <reg52.h>
- #include "main.h"
- sbit DIR1 = P1^0;
- sbit CLK1 = P1^1;
- #define CW 0
- #define CCW 1
- #define STOP 2
- u8 motorState = 0;
- void Timer0Init(void) //5毫秒@12.000MHz
- {
- TMOD = 0x01; //設(shè)置定時器模式
- TL0 = 0x78; //設(shè)置定時初始值
- TH0 = 0xEC; //設(shè)置定時初始值
- TF0 = 0; //清除TF0標(biāo)志
- TR0 = 1; //定時器0開始計時
- ET0 = 1;
- EA = 1;
- }
- void main()
- {
- Timer0Init();
- motorState = CCW;
- while(1)
- {
- }
- }
- void Timer0() interrupt 1
- {
- static int counts = 0;
- TL0 = 0x78; //設(shè)置定時初始值
- TH0 = 0xEC; //設(shè)置定時初始值
- counts++;
- if(counts>10)//每隔10*5*2ms電機轉(zhuǎn)動一個步距
- {
- if(motorState == CW)
- {
- DIR1 = 1;
- CLK1 = !CLK1;
- }else if(motorState == CCW)
- {
- DIR1 = 0;
- CLK1 = !CLK1;
- }else
- {
- CLK1=0;
- }
- counts=0;
- }
- }
復(fù)制代碼
若有收獲,就點個贊吧