單片機(jī)控制步進(jìn)電機(jī)系統(tǒng)
掃描二維碼
隨時(shí)隨地手機(jī)看文章
學(xué)習(xí)了單片機(jī)在的基本輸入輸出和在數(shù)據(jù)采集領(lǐng)域的應(yīng)用,接著學(xué)習(xí)了單片機(jī)在控制領(lǐng)域的應(yīng)用。在控制系統(tǒng)中,通常要控制機(jī)械部件的平移和轉(zhuǎn)動(dòng),這些機(jī)械部件的驅(qū)動(dòng)大都采用交流電機(jī)、直流電機(jī)和步進(jìn)電機(jī)等,其中步進(jìn)電機(jī)最適合與數(shù)字控制。因此在了解單片機(jī)在控制系統(tǒng)中的應(yīng)用時(shí),首先了解了單片機(jī)控制步進(jìn)電機(jī)的設(shè)計(jì)。
主要器件:
1、 AT89C52單片機(jī)芯片,用與接受鍵盤(pán)輸入和控制步進(jìn)電機(jī)。
2、 4相步進(jìn)電機(jī)驅(qū)動(dòng)芯片STK672-040,內(nèi)含有硬件脈沖分配電路和功率驅(qū)動(dòng)動(dòng)能。
3、 4×4行列式鍵盤(pán)。
試驗(yàn)流程圖:
試驗(yàn)電路圖:
試驗(yàn)程序代碼:
//Stepper.h程序
#ifndef _STEPPER_H // 防止Stepper.h被重復(fù)引用
#define _STEPPER_H
#include
#define uchar unsigned char
#define uint unsigned int
#define T 10000 // 10ms定時(shí)常量宏定義
sbit M1=P2^0;
sbit M2=P2^1;
sbit M4=P2^2;
sbit M5=P2^3;
sbit EN=P2^4;
sbit CWB=P2^5;
sbit RET=P2^6;
sbit CLK=P2^7;
#endif
//Stepper.c 程序
#include "Stepper.h"
/* 定時(shí)器0服務(wù)子程序 */
void time0() interrupt 1 using 1 // 用定時(shí)器0中斷來(lái)產(chǎn)生CLK時(shí)鐘
{
/* 定時(shí)10ms,產(chǎn)生20ms周期的時(shí)鐘,也就是50Hz的時(shí)鐘 */
TH0 = -T/256;
TL0 = -T%256;
CLK = ~CLK;
}
/* 鍵消抖延時(shí)函數(shù) */
void delay(void)
{
uchar i;
for (i=300;i>0;i--);
}
/* 鍵掃描函數(shù) */
uchar keyscan(void)
{
uchar scancode,tmpcode;
P1 = 0xf0; // 發(fā)全0行掃描碼
if ((P1&0xf0)!=0xf0) // 若有鍵按下
{
delay(); // 延時(shí)去抖動(dòng)
if ((P1&0xf0)!=0xf0) // 延時(shí)后再判斷一次,去除抖動(dòng)影響
{
scancode = 0xfe;
while((scancode&0x10)!=0) // 逐行掃描
{
P1 = scancode; // 輸出行掃描碼
if ((P1&0xf0)!=0xf0) // 本行有鍵按下
{
tmpcode = (P1&0xf0)|0x0f;
/* 返回特征字節(jié)碼,為1的位即對(duì)應(yīng)于行和列 */
return((~scancode)+(~tmpcode));
}
else scancode = (scancode<<1)|0x01; // 行掃描碼左移一位
}
}
}
return(0); // 無(wú)鍵按下,返回值為0
}
/* 主程序 */
void main()
{
uchar key;
TMOD = 0x01; // 設(shè)置定時(shí)器0工作模式
EA = 1;
ET0 = 1;
/* 設(shè)置為2相激勵(lì) */
M1 = 0;
M2 = 0;
/* 設(shè)置為環(huán)形轉(zhuǎn)向軌跡 */
M4 = 1;
M5 = 1;
EN = 0; // 切斷驅(qū)動(dòng)輸出
RET = 0; // 歸位輸入無(wú)效
CWB = 1; // 初始設(shè)置為順時(shí)針?lè)较?/p>
while(1)
{
key = keyscan(); // 調(diào)用鍵盤(pán)掃描函數(shù)
switch(key)
{
case 0x11: // 0行0列,啟動(dòng)鍵
EN = 1; // 打開(kāi)驅(qū)動(dòng)輸出
TH0 = -T/256; // 改變T可以改變步進(jìn)電機(jī)轉(zhuǎn)動(dòng)速度
TL0 = -T%256;
TR0 = 1; // 定時(shí)器0開(kāi)始計(jì)數(shù)
break;
case 0x21: // 0行1列,停止鍵
TR0 = 0; // 定時(shí)器0停止計(jì)數(shù)
EN = 0; // 切斷驅(qū)動(dòng)輸出
break;
case 0x41: // 0行2列,切換轉(zhuǎn)向按鍵
CWB = ~CWB;
break;
case 0x81: // 0行3列,歸位鍵
RET = 1;
delay();
RET = 0;
break;
default:break;
}
}
}