導航:首頁 > 操作系統 > 基於單片機的電機控制

基於單片機的電機控制

發布時間:2022-05-28 11:47:55

⑴ 基於單片機步進電機控制系統設計

單片機驅動步進電機很簡單,一般都是4線的,還有5線的,單片機最好用AT89C51,這個晶元很可靠,不用看門狗,並且每個P口都有鎖定功能。電源買個開關電源,如果是演示,買個變壓器,要兩路的,一路
5V,一路12V的(根據步進電機的電壓,一般都是12V的),5V用個大的7805就可以了,12V只要整流一下,後面加一個4700u的大電容,主要是驅動步進電機,選個小一點的步進電機,驅動電路用TIP41就可以了,每個線可以加個蓄流二極體,A,B,C,D四個線順序別接錯。單片機和步進電機驅動最好用光耦隔離,TLP521-4正好4路,驅動TIP41中間加一個2K
的電阻。驅動程序和硬體連接網上到處可以找的到。

⑵ 基於51單片機的步進電機控制系統設計

//-AVR的--------------------------------
//正反轉可控的步進電機ULN2003A(atmega16)AVR
#include <avr/io.h>
#include <avr/delay.h>
#define INT8U unsigned char
#define INT16U unsigned int//四相步進八拍方式
//正轉勵磁序列為A->AB->B->BC->C->CD->D->DA
const INT8U zheng[]={0x01,0x03,0x02,0x06,0x04,0x0C,0x08,0x09};//反轉勵磁序列為A->AD->D->CD->C->BC->B->ABconst INT8U fan[]={0x01,0x09,0x08,0x0C,0x04,0x06,0x02,0x03};//按鍵定義
#define k1() ((PIND & (1<<PD0))==0x00)
#define k2() ((PIND & (1<<PD1))==0x00)
#define k3() ((PIND & (1<<PD2))==0x00)
//-----------------------------------------------------------------
// 步進電機正轉或反轉n圈
//-----------------------------------------------------------------
void STEP_MOTOR_RUN(INT8U Direction,INT8U n)
{
INT8U i,j;
for (i=0;i<n;i++)
{
for(j=0;j<8;j++)
{
if(k3()) return;
if(Direction==0) PORTB=zheng[j];
if(Direction==1) PORTB= fan[j];
_delay_ms(200);
}
PORTB=0x01;

}
}

// 主程序
//-----------------------------------------------------------------
int main()
{
INT8U r=1;
DDRB=0XFF;PORTB=zheng[0];
DDRD=0X00;PORTD=0XFF;
while(1)
{
if(k1())
{while(k1());STEP_MOTOR_RUN(0,r);} //STEP_MOTOR_RUN(INT8U Direction,INT8U n)
if(k2())
{while(k2());STEP_MOTOR_RUN(1,r);}

}
}

⑶ 如何用單片機實現對四個步進電機的速度控制呢

推薦你使用表控,型號TPC4-4TD就可以滿足你的要求。

表控可以同時控制4個步進電機,對於你說的速度控制講解如下:

上圖是表控的表格設置界面,省去了麻煩的編程,輕松實現步進電機控制。

圖中,第2行工作模式設置為「脈沖」模式,游標在脈沖模式的第2行時,脈沖頻率項及脈沖個數輸入項分別顯示脈沖個數的單位,數據輸入框顯示為綠色。脈沖輸出單位為:百萬、十萬、萬、千、百、十、個,脈沖頻率的單位為赫茲。示例中頻率設置為500赫茲,脈沖個數為1101616個脈沖(一百一十萬一千六百一十六)。

⑷ 基於51單片機步進電機的控制及細分驅動電路

參考:
http://hi..com/chary8088/blog/item/177332ce39cef70a92457ea9.html

接觸單片機快兩年了,不過只是非常業余的興趣,實踐卻不多,到現在還算是個初學者吧。這幾天給自己的任務就是搞定步進電機的單片機控制。以前曾看過有關步進電機原理和控制的資料,畢竟自己沒有做過,對其具體原理還不是很清楚。今天從淘寶網買了一個EPSON的UMX-1型步進電機,此步進電機為雙極性四相,接線共有六根,外形如下圖所示:

拿到步進電機,根據以前看書對四相步進電機的了解,我對它進行了初步的測試,就是將5伏電源的正端接上最邊上兩根褐色的線,然後用5伏電源的地線分別和另外四根線(紅、蘭、白、橙)依次接觸,發現每接觸一下,步進電機便轉動一個角度,來回五次,電機剛好轉一圈,說明此步進電機的步進角度為360/(4×5)=18度。地線與四線接觸的順序相反,電機的轉向也相反。

如果用單片機來控制此步進電機,則只需分別依次給四線一定時間的脈沖電流,電機便可連續轉動起來。通過改變脈沖電流的時間間隔,就可以實現對轉速的控制;通過改變給四線脈沖電流的順序,則可實現對轉向的控制。所以,設計了如下電路圖:

C51程序代碼為:

代碼一

#include <AT89X51.h>

static unsigned int count;
static unsigned int endcount;

void delay();

void main(void)
{
count = 0;
P1_0 = 0;
P1_1 = 0;
P1_2 = 0;
P1_3 = 0;

EA = 1; //允許CPU中斷
TMOD = 0x11; //設定時器0和1為16位模式1
ET0 = 1; //定時器0中斷允許

TH0 = 0xFC;
TL0 = 0x18; //設定時每隔1ms中斷一次
TR0 = 1; //開始計數

startrun:

P1_3 = 0;
P1_0 = 1;
delay();
P1_0 = 0;
P1_1 = 1;
delay();
P1_1 = 0;
P1_2 = 1;
delay();
P1_2 = 0;
P1_3 = 1;
delay();
goto startrun;
}

//定時器0中斷處理
void timeint(void) interrupt 1
{
TH0=0xFC;
TL0=0x18; //設定時每隔1ms中斷一次
count++;
}

void delay()
{
endcount=2;
count=0;
do{}while(count<endcount);
}

將上面的程序編譯,用ISP下載線下載至單片機運行,步進電機便轉動起來了,初步告捷!

不過,上面的程序還只是實現了步進電機的初步控制,速度和方向的控制還不夠靈活,另外,由於沒有利用步進電機內線圈之間的「中間狀態」,步進電機的步進角度為18度。所以,我將程序代碼改進了一下,如下:

代碼二

#include <AT89X51.h>

static unsigned int count;
static int step_index;

void delay(unsigned int endcount);
void gorun(bit turn, unsigned int speedlevel);

void main(void)
{
count = 0;
step_index = 0;
P1_0 = 0;
P1_1 = 0;
P1_2 = 0;
P1_3 = 0;

EA = 1; //允許CPU中斷
TMOD = 0x11; //設定時器0和1為16位模式1
ET0 = 1; //定時器0中斷允許

TH0 = 0xFE;
TL0 = 0x0C; //設定時每隔0.5ms中斷一次
TR0 = 1; //開始計數

do{
gorun(1,60);
}while(1);

}

//定時器0中斷處理
void timeint(void) interrupt 1
{
TH0=0xFE;
TL0=0x0C; //設定時每隔0.5ms中斷一次
count++;
}

void delay(unsigned int endcount)
{
count=0;
do{}while(count<endcount);
}

void gorun(bit turn,unsigned int speedlevel)
{
switch(step_index)
{
case 0:
P1_0 = 1;
P1_1 = 0;
P1_2 = 0;
P1_3 = 0;
break;
case 1:
P1_0 = 1;
P1_1 = 1;
P1_2 = 0;
P1_3 = 0;
break;
case 2:
P1_0 = 0;
P1_1 = 1;
P1_2 = 0;
P1_3 = 0;
break;
case 3:
P1_0 = 0;
P1_1 = 1;
P1_2 = 1;
P1_3 = 0;
break;
case 4:
P1_0 = 0;
P1_1 = 0;
P1_2 = 1;
P1_3 = 0;
break;
case 5:
P1_0 = 0;
P1_1 = 0;
P1_2 = 1;
P1_3 = 1;
break;
case 6:
P1_0 = 0;
P1_1 = 0;
P1_2 = 0;
P1_3 = 1;
break;
case 7:
P1_0 = 1;
P1_1 = 0;
P1_2 = 0;
P1_3 = 1;
}

delay(speedlevel);

if (turn==0)
{
step_index++;
if (step_index>7)
step_index=0;
}
else
{
step_index--;
if (step_index<0)
step_index=7;
}

}

改進的代碼能實現速度和方向的控制,而且,通過step_index靜態全局變數能「記住」步進電機的步進位置,下次調用 gorun()函數時則可直接從上次步進位置繼續轉動,從而實現精確步進;另外,由於利用了步進電機內線圈之間的「中間狀態」,步進角度減小了一半,只為9度,低速運轉也相對穩定一些了。

但是,在代碼二中,步進電機的運轉控制是在主函數中,如果程序還需執行其它任務,則有可能使步進電機的運轉收到影響,另外還有其它方面的不便,總之不是很完美的控制。所以我又將代碼再次改進:

代碼三

#include <AT89X51.h>

static unsigned int count; //計數
static int step_index; //步進索引數,值為0-7

static bit turn; //步進電機轉動方向
static bit stop_flag; //步進電機停止標志
static int speedlevel; //步進電機轉速參數,數值越大速度越慢,最小值為1,速度最快
static int spcount; //步進電機轉速參數計數
void delay(unsigned int endcount); //延時函數,延時為endcount*0.5毫秒
void gorun(); //步進電機控制步進函數

void main(void)
{
count = 0;
step_index = 0;
spcount = 0;
stop_flag = 0;

P1_0 = 0;
P1_1 = 0;
P1_2 = 0;
P1_3 = 0;

EA = 1; //允許CPU中斷
TMOD = 0x11; //設定時器0和1為16位模式1
ET0 = 1; //定時器0中斷允許

TH0 = 0xFE;
TL0 = 0x0C; //設定時每隔0.5ms中斷一次
TR0 = 1; //開始計數

turn = 0;

speedlevel = 2;
delay(10000);
speedlevel = 1;
do{
speedlevel = 2;
delay(10000);
speedlevel = 1;
delay(10000);
stop_flag=1;
delay(10000);
stop_flag=0;
}while(1);

}

//定時器0中斷處理
void timeint(void) interrupt 1
{
TH0=0xFE;
TL0=0x0C; //設定時每隔0.5ms中斷一次

count++;

spcount--;
if(spcount<=0)
{
spcount = speedlevel;
gorun();
}

}

void delay(unsigned int endcount)
{
count=0;
do{}while(count<endcount);
}

void gorun()
{
if (stop_flag==1)
{
P1_0 = 0;
P1_1 = 0;
P1_2 = 0;
P1_3 = 0;
return;
}

switch(step_index)
{
case 0: //0
P1_0 = 1;
P1_1 = 0;
P1_2 = 0;
P1_3 = 0;
break;
case 1: //0、1
P1_0 = 1;
P1_1 = 1;
P1_2 = 0;
P1_3 = 0;
break;
case 2: //1
P1_0 = 0;
P1_1 = 1;
P1_2 = 0;
P1_3 = 0;
break;
case 3: //1、2
P1_0 = 0;
P1_1 = 1;
P1_2 = 1;
P1_3 = 0;
break;
case 4: //2
P1_0 = 0;
P1_1 = 0;
P1_2 = 1;
P1_3 = 0;
break;
case 5: //2、3
P1_0 = 0;
P1_1 = 0;
P1_2 = 1;
P1_3 = 1;
break;
case 6: //3
P1_0 = 0;
P1_1 = 0;
P1_2 = 0;
P1_3 = 1;
break;
case 7: //3、0
P1_0 = 1;
P1_1 = 0;
P1_2 = 0;
P1_3 = 1;
}

if (turn==0)
{
step_index++;
if (step_index>7)
step_index=0;
}
else
{
step_index--;
if (step_index<0)
step_index=7;
}

}

在代碼三中,我將步進電機的運轉控制放在時間中斷函數之中,這樣主函數就能很方便的加入其它任務的執行,而對步進電機的運轉不產生影響。在此代碼中,不但實現了步進電機的轉速和轉向的控制,另外還加了一個停止的功能,呵呵,這肯定是需要的。

步進電機從靜止到高速轉動需要一個加速的過程,否則電機很容易被「卡住」,代碼一、二實現加速不是很方便,而在代碼三中,加速則很容易了。在此代碼中,當轉速參數speedlevel 為2時,可以算出,此時步進電機的轉速為1500RPM,而當轉速參數speedlevel 1時,轉速為3000RPM。當步進電機停止,如果直接將speedlevel 設為1,此時步進電機將被「卡住」,而如果先把speedlevel 設為2,讓電機以1500RPM的轉速轉起來,幾秒種後,再把speedlevel 設為1,此時電機就能以3000RPM的轉速高速轉動,這就是「加速」的效果。

在此電路中,考慮到電流的緣故,我用的NPN三極體是S8050,它的電流最大可達1500mA,而在實際運轉中,我用萬用表測了一下,當轉速為1500RPM時,步進電機的電流只有90mA左右,電機發熱量較小,當轉速為60RPM時,步進電機的電流為200mA左右,電機發熱量較大,所以NPN三極體也可以選用9013,對於電機發熱量大的問題,可加一個10歐到20歐的限流電阻,不過這樣步進電機的功率將會變小。

由於在下淺薄,錯誤和問題難免,請各位不吝賜教!

⑸ 用單片機控制電動機的原理

樓上的落後啦!現在變頻器都出來幾十年了,還用可控硅控制?現在的主流是IGBT.現在只有少數的直流電機控制器還用可控硅控制.單片機控制電機,必須要合適的驅動來實行.如果是交流電機需要無級調速,那麼只有用變頻器來實現.改變頻率的同時改變電壓,這就是V/F控制模式,更高級的是矢量控制模式.這就比較復雜了,他會自動檢測電機的數值,以達到最精確的驅動方式.一般是由DSP來實現的.我有全套變頻器技術,簡易的和復雜的都有.希望能給你帶來幫助.

⑹ 基於單片機的PWM控制直流電機調速

如果是pwm控制的話,d/a部分可以不要,單片機直接控制驅動電路就行了,可用光耦隔離。不過你的直流電機和單片機共用5v電源的話,電機端電容要大一點。調速要求不高的話用8位單片機就行了。
單片機的編譯環境用什麼取決於你用什麼單片機,調速要求不高的話,用51單片機,編程可以用keil。驅動電路硬體自己做的話可用protel
,orcad,powerpcb等繪制電路板。
框圖推薦用microsoft
office
visio畫,比較簡單。

⑺ 基於單片機步進電機控制系統設計/謝謝拉

由於不知道怎麼發圖片,沒有圖片。如果想要你採用我的回答,你發EMAIL到[email protected]我回復你。同時再給你1-2篇關於步進電機驅動的論文和資料。希望對你有所幫助

基於L297/L298晶元步進電機的單片機控制
1 引言
步進電動機是一種將電脈沖信號轉換成角位移或線位移的精密執行元件,由於步進電機具有控制方便、體積小等特點,所以在數控系統、自動生產線、自動化儀表、繪圖機和計算機外圍設備中得到廣泛應用。微電子學的迅速發展和微型計算機的普及與應用,為步進電動機的應用開辟了廣闊前景,使得以往用硬體電路構成的龐大復雜的控制器得以用軟體實現,既降低了硬體成本又提高了控制的靈活性,可靠性及多功能性。市場上有很多現成的步進電機控制機構,但價格都偏高。應用SGS公司推出的L297和L298兩晶元可方便的組成步進電機驅動器,並結合AT89C52單片機進行控制,即可以實現用相對便宜的價格組成一個性能不錯的步進電機驅動電路。
2 工作原理
由於步進電機是一種將電脈沖信號轉換成直線或角位移的執行元件,它不能直接接到交直流電源上,而必須使用專用設備-步進電機控制驅動器 典型步進電機控制系統如圖1所示:控制器可以發出脈沖頻率從幾赫茲到幾十千赫茲可以連續變化的脈沖信號,它為環形分配器提供脈沖序列。環形分配器的主要功能是把來自控制環節的脈沖序列按一定的規律分配後,經過功率放大器的放大加到步進電機驅動電源的各項輸人端,以驅動步進電機的轉動。環形分配器主要有兩大類:一類是用計算機軟體設計的方法實現環分器要求的功能,通常稱軟環形分配器。另一類是用硬體構成的環形分配器,通常稱為硬環形分配器。功率放大器主要對環形分配器的較小輸出信號進行放大.以達到驅動步進電機目的。

圖1 典型步進電機控制框圖
3 硬體組成
文中所控制的步進電機是四相單極式35BY48HJ120減速步進電動機。本文所設計的步進電機控制驅動器的框圖如圖2所示。它由AT89C52單片機、光電耦和器、集成晶元L297和L298組成。AT89C52是美國ATMEL的低電壓、高性能8位CMOS單片機。片內置8K位元組可重復擦寫的
Flash閃速存儲器。256位元組RAM。3個16位定時器.可編程串列UART通道。對完成步進電機的簡單控制已足以勝任。

圖2 本文提出的步進電機控制驅動器框圖
L297是步進電動機控制器(包括環形分配器)。L298是雙H橋式驅動器。它們所組成的微處理器至雙橋式步進電動機的介面如圖3所示。這種方式結合的優點是,需要的元件很少.從而使得裝配成本低,可靠性高和占空間少。並且通過軟體開發。可以簡化和減輕微型計算機的負擔。另外,L297和L298都是獨立的晶元.所以應用是十分靈活的。

L297晶元是一種硬體環分集成晶元.它可產生四相驅動信號,用於計算機控制的兩相雙極或四相單極步進電機 它的心臟部分是一組解碼器它能產生各種所需的相序.這一部分是由兩種輸入模式控制,方向控制(CW/CCW) 和HALF/FULL 以及步進式時鍾CLOCK.它將解碼器從一階梯推進至另一階梯。解碼器有四個輸出點連接到輸出邏輯部分,提供抑制和斬波功能所需的相序。因此L297能產生三種相序信號,對應於三種不同的工作方式:即半步方式(HALF STEP);基本步距(FULL STEP,整步)一相激勵方式;基本步距兩相激勵方式。脈沖分配器內部是一個3bit可逆計數器,加上一些組合邏輯.產生每周期8步格雷碼時序信號,這也就是半步工作方式的時序信號。此時HALF/FULL信號為高電。若HALF/FULL取低電平,得到基本步距工作方式。即雙四拍全階梯工作方式。
L297另一個重要組成是由兩個PWM 斬波器來控制相繞組電流,實現恆流斬波控制以獲得良好的矩頻特性。每個斬波器由一個比較器、一個RS觸發器和外接采樣電阻組成,並設有一個公用振盪器,向兩個斬波器提供觸發脈沖信號。圖3中,頻率f是由外接16腳的RC網路決定的, 當R>10kΩ 時,f=1/0.69RC。當時鍾振盪器脈沖使觸發器置1,電機繞組相電流上升,采樣電阻的R 上電壓上升到基準電壓Uref時,比
較器翻轉,使觸發器復位,功率晶體管關斷,電流下降,等待下一個振盪脈沖的到來。這樣,觸發器輸出的是恆頻PWM信號,調制L297的輸出信號,繞組相電流峰值由Uref確定。L297的CONTROL端的輸入決定斬波器對相位線A、B、C、D或抑制線INH1和INH2起作用。CONTROL為高電平時,對A、B、C、D有控製作用;而為低電平時,則對INH1和INH2起控製作用,從而可對電動機轉向和轉矩進行控制。
L298晶元是一種高壓、大電流雙全橋式驅動器,其設計是為接受標准TTL邏輯電平信號和驅動電感負載的,例如繼電器、圓筒形線圈、直流電動機和步進電動機 具有兩抑制輸入來使器件不受輸入信號影響。每橋的三級管的射極是連接在一起的,相應外接線端可用來連接外設感測電阻。可安置另一輸入電源,使邏輯能在低電壓下工作。L298晶元是具有15個引出腳的多瓦數直插式封裝的集成晶元。
圖3中.AT89C52通過串口經MAX232電平轉換之後與微機相連.接受上位機指令。向L297發出時鍾信號、正反轉信號、復位信號及使能控制等信號。電路中,電阻R13,R15用來調節斬波器電路的參考電壓,該電壓將與通過管腳13,14所反饋的電位的大小比較,來確定是否進行斬波控制,以達到控制電機繞組電流峰值、保護步進電機的目的
由於L297內部帶有斬波恆流電路,繞組相電流峰值由Uref確定。當採用兩片L297通過L298分別驅動步進電機的兩繞組,且通過兩個D/A轉換器改變每相繞組的Uref時,即組成了步進電機細分驅動電路。另外,為了有效地抑制電磁干擾,提高系統的可靠性,在單片機與步進電動機驅動迴路中利用兩個16引腳光電耦合器件TLP521-4組成如圖3所示的隔離電路。其作用是切斷了單片機與步進電動機驅動迴路之間電的直接聯系,實現了單片機與驅動迴路系統地線的分別聯接.防止處於大電流感性負載下工作的驅動電路產生的干擾信號以及電網負載突變產生的干擾信號通過線路串入單片機,影響單片機的正常工作。
4 軟體組成
在該電路中,將P1.0口設為電機開始按鈕,P1.1,P1.2,P1.3為速度選擇按鈕。速度由低到高,P1.4為電機停止按鈕。並設三檔速度的最高速度依次為500pps、1000pps、2000pps 。RXD,TXD 已由MAX232電平轉換接出串口。此外,步進電機其啟動,停止的頻率較低,一般在100-250Hz之間,而最高運行頻率要求較高。通常為1-3kHz,為使其在啟動、運行和停止整個過程中,既不會失步,又能夠盡快精確地達到目標位置,運行速度都要有一個加速一恆速減速的過程。這里採用常用的離散辦法來逼近理想的近似梯形的升降速曲線,如圖5所示。即利用定時器中斷方式來不斷改變定時器裝載值的大小.

本例中.為計算方便,把各離散點的速度所需的裝載值用公式轉化為各自所需的定時時間固化在系統的ROM 中,這里用TH0=(65536-time)/256,TL0=(65536-time)%256來計算裝載值,time表示各階梯所需定時時間。系統在運行中用查表法查出所需的時間,從而大幅度減少佔用CPU的時間,提高系統的相應速度。因此.該程序主要由控制主程序、加減速子程序組成,主程序框圖如圖4所示。

5 結論
本文創新點在於提出應用單片機和L297、L298集成電路構成步進電機控制驅動器。使之具有元件少.可靠性高、占空間少、裝配成本低等優點。通過軟體開發,可以簡化和減輕微型計算機的負擔。另外。在上面提出的在加減速程序中定時器的裝載值用式子計算不精確,這兩條賦值要執行不少的時間.具體做的時候.可直接把初值計算出來或把除號用相加來計算.以達到精確的目的。

⑻ 如何利用51系列單片機控制電機

方法一、單片機接三極體做一個全橋控制小功率直流電機正反轉,檢測到紅色的狀態標記下來,電機轉動,綠色時候標記下來,反向轉動。
方法二、淘寶上購買一小的步進電機,一般直接驅動電路帶著的,可以直接接在單片機的IO口上,程序的控制原理一樣,電機控製做for循環,步進電機,步數即for循環次數定好,正反轉的區別無非就是IO口輸出的邏輯順序不同就可以實現了。
兩個方法,一個硬體上有個難度,一個是軟體上。但是都是很簡單的,正常的情況下花1天時間就能學會和應用。預祝成功。
ps:純手打。。

⑼ 基於單片機的步進電機控制,有高手懂嗎本人的畢業論文.學哥學姐.懂的都說幾句..謝謝啦..

為1,TH1的預設值為0CH,TL1的預設值為00H。
③ PC機與AT89C51單片機均採用串列口方式3。
④ 幀格式為:1位起始位,8位數據位,1位偶效驗位,1位停
止位。
⑤ PC機發送的數據幀為:
表1 PC機發送數據幀表
幀起始標志為 02H,假設電動機的運行標號為5號,對應的
ASCII碼值為30H,35H兩個位元組表示。若命令為傳送命令MOV
則用0表示,其對應的ASCII碼值為30H,用一個位元組表示。D
表示步進電動機運行的方向標志,若為0則表示電動機正轉,其
對應的ASCII碼值為30H;若為1,則表示電動機反轉,其對應的
ASCII碼值為31H。P表示PC機傳送給單片機的總的走的脈沖
數。若傳送的命令為設置命令SET則用1表示,其對應的ASCII
碼值為31H,用一個位元組表示。需要單片機設置的參數有:a, V
和 L;為了便於PC機與AT89C51的通信編程,數據的長度取6
個位元組。傳送的數據只有5個位元組,剩餘的1個位元組均用ASCII
碼值30H補足,對應的為0。這樣做不影響效驗和。若為傳送命
令幀,則效驗和定義為方向信號D與總的脈沖數P的十六進制之
和再轉換為相對應的ASCII碼值。若為設置命令幀,則效驗和定
義為a、V與L的十六進制之和再轉換為D對應的ASCII碼值。
幀結束標志為03H。
⑥ PC機採用查詢的方式發送和接收數據,AT89C51單片機
採用串列口中斷的方式接收和發送數據。
3.3 控制軟體的設計
控制步進電動機勻加速、恆速、勻減速運行的程序流
程圖如圖2。
圖2 控制步進電機的程序流程圖
4 結束語
參考文獻:
[1] 韓全立。單片機控制技術及應用[M]。北京:電子工業出
採用本方案可以很好的實現對步進電動機的控制。目前此
版社,2004
方案已經成功應用於電機控制的工廠等並取得了良好的效益,並
[2] 求是科技。單片機典型模塊設計實例導航[M]。北京:人
正試圖將其進一步完善以應用於壓縮機、洗衣機等日常設備中。
民郵電出版社,2004
[3] 胡漢才,單片機原理及系統設計[M]。北京:清華大學出
當然,隨著控制產品與控制技術的發展,步進電機的控制也會得到
版社,2002
進一步完善。
[4] 王曉明。電動機的單片機控制[M]。北京:北京航天航空
大學出版社,2002
[5] 楊金岩,鄭應強,張振仁。8051單片機數據傳輸介面擴展
技術與應用實例[M]。北京:人民郵電出版社,2005

⑽ 如何用單片機控制直流電機

通過與單片機相連的按鍵控制直流電機停啟的電路如下圖所示,通過P3.6口按鍵觸發啟動直流電機,P3.7口的按鍵觸發停止直流電機的運行。由圖可知,當P1.0輸出高電平「1」時,NPN型三極體導通,直流電機得電轉動;當P1.0輸出低電平「0」時,NPN型三極體截止,直流電機停止轉動。

(10)基於單片機的電機控制擴展閱讀:

通過單片機產生PWM波控制直流電機程序

#include "reg52.h"


#define uchar unsigned char


#define uint unsigned int


uchar code table[10]={0x3f,0x06,0x5b,


0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共陰數碼管顯示碼(0-9)


sbit xiaoshudian=P0^7;


sbit wei1=P2^4; //數碼管位選定義


sbit wei2=P2^5;


sbit wei3=P2^6;


sbit wei4=P2^7;


sbit beep=P2^3; //蜂鳴器控制端


sbit motor = P1^0; //電機控制


sbit s1_jiasu = P1^4; //加速按鍵


sbit s2_jiansu= P1^5; //減速按鍵


sbit s3_jiting=P1^6; //停止/開始按鍵


uint pulse_count; //INT0接收到的脈沖數


uint num=0; //num相當於占空比調節的精度


uchar speed[3]; //四位速度值存儲


float bianhuasu; //當前速度(理論計算值)


float reallyspeed; //實際測得的速度


float vv_min=0.0;vv_max=250.0;


float vi_Ref=60.0; //給定值


float vi_PreError,vi_PreDerror;


uint pwm=100; //相當於占空比標志變數


int sample_time=0; //采樣標志


float v_kp=1.2,v_ki=0.6,v_kd=0.2; //比例,積分,微分常數


void delay (uint z)


{


uint x,y;


for(x=z;x>0;x--)


for (y=20;y>0;y--);


}


void time_init()


{


ET1=1; //允許定時器T1中斷


ET0=1; //允許定時器T0中斷


TMOD = 0x15; //定時器0計數,模式1;定時器1定時,模式1


TH1 = (65536-100)/256; //定時器1值,負責PID中斷 ,0.1ms定時


TL1 = (65536-100)%6;


TR0 = 1; //開定時器


TR1 = 1;


IP=0X08; //定時器1為高優級


EA=1; //開總中斷


}


void keyscan()


{


float j;


if(s1_jiasu==0) //加速


{


delay(20);


if(s1_jiasu==0)


vi_Ref+=10;


j=vi_Ref;


}


while(s1_jiasu==0);


if(s2_jiansu==0) //減速


{


delay(20);


if(s2_jiansu==0)


vi_Ref-=10;


j=vi_Ref;


}


while(s2_jiansu==0);


if(s3_jiting==0)


{


delay(20);


motor=0;


P1=0X00;


P3=0X00;


P0=0x00;


}


while(s3_jiting==0);


}


float v_PIDCalc(float vi_Ref,float vi_SpeedBack)


{


register float error1,d_error,dd_error;


error1=vi_Ref-vi_SpeedBack; //偏差的計算


d_error=error1-vi_PreError; //誤差的偏差


dd_error=d_error-vi_PreDerror; //誤差變化率


vi_PreError=error1; //存儲當前偏差


vi_PreDerror=d_error;


bianhuasu=(v_kp*d_error+v_ki*vi_PreError+v_kd*dd_error);


return (bianhuasu);


}


void v_Display()


{


uint su;


su=(int)(reallyspeed*10); //乘以10之後強制轉化成整型


speed[3]=su/1000; //百位


speed[2]=(su00)/100; //十位


speed[1]=(su0)/10; //個位


speed[0]=su; //小數點後一位


wei1=0; //第一位打開


P0=table[speed[3]];


delay(5);


wei1=1; //第一位關閉


wei2=0;


P0=table[speed[2]];


delay(5);


wei2=1;


wei3=0;


P0=table[speed[1]];


xiaoshudian=1;


delay(5);


wei3=1;


wei4=0;


P0=table[speed[0]];


delay(5);


wei4=1;


}


void BEEP()


{


if((reallyspeed)>=vi_Ref+5||(reallyspeed


{


beep=~beep;


delay(4);


}


}


void main()


{


time_init();


motor=0;


while(1)


{


v_Display();


BEEP();


}


if(s3_jiting==0) //對按鍵3進行掃描,增強急停效果


{


delay(20);


motor=0;


P1=0X00;


P3=0X00;


P0=0x00;


}


while(s3_jiting==0);


}


void timer0() interrupt 1


{


}


void timer1() interrupt 3


{


TH1 = (65536-100)/256; //1ms定時


TL1 = (65536-100)%6;


sample_time++;


if(sample_time==5000) //采樣時間0.1ms*5000=0.5s


{


TR0=0; //關閉定時器0


sample_time=0;


pulse_count=TH0*255+TL0; //保存當前脈沖數


keyscan(); //掃描按鍵


reallyspeed=pulse_count/(4*0.6); //計算速度


pwm=pwm+v_PIDCalc(vi_Ref,reallyspeed);


if(pwm


if(pwm>100)pwm=100;


TH0=TL0=0;


TR0=1; //開啟定時器0


}


num++;


if(num==pwm) //此處的num值,就是占空比


{


motor=0;


}


if(num==100) //100相當於占空比調節的精度


{


num=0;


motor=1;


}


}



閱讀全文

與基於單片機的電機控制相關的資料

熱點內容
自己購買雲主伺服器推薦 瀏覽:422
個人所得稅java 瀏覽:761
多餘的伺服器滑道還有什麼用 瀏覽:192
pdf劈開合並 瀏覽:28
不能修改的pdf 瀏覽:752
同城公眾源碼 瀏覽:489
一個伺服器2個埠怎麼映射 瀏覽:298
java字元串ascii碼 瀏覽:79
台灣雲伺服器怎麼租伺服器 瀏覽:475
旅遊手機網站源碼 瀏覽:332
android關聯表 瀏覽:946
安卓導航無聲音怎麼維修 瀏覽:333
app怎麼裝視頻 瀏覽:431
安卓系統下的軟體怎麼移到桌面 瀏覽:96
windows拷貝到linux 瀏覽:772
mdr軟體解壓和別人不一樣 瀏覽:904
單片機串列通信有什麼好處 瀏覽:340
游戲開發程序員書籍 瀏覽:860
pdf中圖片修改 瀏覽:288
匯編編譯後 瀏覽:491