(開源)基於51單片機的步進電機控制

2021-01-16 51單片機設計


//數碼管位 高位低位

//四個按鍵控制步進電機:正轉,反轉,加1,減1

//上電時電機啟動,數碼管上顯示速度最小檔1,加減檔位均能通過數碼管顯示出來,電機採用單雙八拍方式

//電機轉速一共10檔,通過按鍵調節轉速 

//電機正轉時最高位數碼管顯示0,反轉時顯示1  

#include<reg51.h>

#define uchar unsigned char

#define uint unsigned int

#define led P0//數碼管段選

#define haha P2

sbit s1 = P1^0;

sbit s2 = P1^1;

sbit s3 = P3^0;

sbit s4 = P3^1;

sbit s5 = P3^2;//按鍵定義,s1正轉,s2反轉,s3加1,s4減1

sbit wei3 = P2^3;sbit wei2 = P2^2;sbit wei1 = P2^1;sbit wei0 = P2^0;//數碼管位選定義

sbit a = P2^7;sbit b = P2^6;sbit c = P2^5;sbit d = P2^4;//脈衝信號輸入端定義


uchar code tab[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//共陽數碼管驅動信號0---9,不顯示

uchar code time_counter[10][2]={{0xda,0x1c},{0xde,0xe4},{0xe1,0xec},{0xe5,0xd4},{0xe9,0xbc},  //9.7 ----1ms

    {0xed,0xa4},{0xf1,0x8c},{0xf5,0x74},{0xf9,0x5c},{0xfc,0x18}};

uchar code qudong[8]={0x80,0xc0,0x40,0x60,0x20,0x30,0x10,0x90};  

uchar num1 = 0;//控制取勵磁信號變量   

uchar num2 = 8;


char k=0;//加減檔位控制,1為最小檔

char pause=1;//暫停時保存之前的轉速,開機默認1

bit flag1 = 0;//初始正轉,正反轉標誌

uchar buf[4]={0,10,0,0};//數碼管顯示緩存,正轉,不顯示,不顯示,顯示1檔位,高----低  

//================================定時器0/1初始化函數================================

void T0_T1_init()

{

TMOD = 0x11;//定時器0/1均工作於方式1,16位計時方式

    TH1 = time_counter[k-1][0];

TL1 = time_counter[k-1][1];//定時器1,定時10ms用於步進電機轉速控制

TR1 = 0;

ET1= 1;//開定時器中斷

EA = 1;//開總中斷

}

//================================ms級延時函數=======================================

void delay1m(uint x)

{

    uint i,j;

    for(i=0;i<x;i++)      //連數x次,約 x ms

     for(j=0;j<120;j++);   //數120 次,約1 ms

void display()

{

wei3=1;wei2=1;wei1=1;wei0=0;led = tab[buf[3]];delay1m(1);led=0xff;

    wei3=1;wei2=1;wei1=0;wei0=1;led = tab[buf[2]];delay1m(1);led=0xff;

    wei3=1;wei2=0;wei1=1;wei0=1;led = tab[buf[1]];delay1m(1);led=0xff;

wei3=0;wei2=1;wei1=1;wei0=1;led = tab[buf[0]];delay1m(1);led=0xff;

}

//================================主函數=============================================

void main()

{

T0_T1_init();

buf[1] = 10;//不顯示

while(1)

{

display();

if(s1 == 0)

{

delay1m(3);

if(s1 == 0)

{

flag1 = 0;//正轉

buf[0] = 0;//最高位顯示0

// haha = 0x00;//停止

 

}

while(!s1) display();

}

if(s2 == 0 )

{

delay1m(3);

if(s2 == 0)

{

flag1 = 1;//反轉

buf[0] = 1;//最高位顯示1

// haha = 0x00;//停止

}

while(!s2) display();

}

if(s3 == 0)    //速度加1檔

{

delay1m(3);

if(s3 == 0)

{

k++;

TR1=1;

if(k > 10 )

{

k = 1;

}

buf[2]= k/10;

buf[3]= k%10;

while(!s3) display();

}

if(s4 == 0) //速度減1檔

{

delay1m(3);

if(s4 == 0)

{

k--;

TR1=1;

if(k <= 0)

{

k = 10;

}

buf[2]= k/10;

buf[3]= k%10;

}

while(!s4) display();

}

if(s5==0)

{

delay1m(3);

if(s5==0)

{

if(TR1==1)

{

pause=k;

k=0;

TR1=0;

a=b=c=d=0;

}

else if(TR1==0)

{

k=pause;

TR1=1;

}

buf[2]= k/10;

buf[3]= k%10;

while(!s5) display();

}

}


}

//==================================定時器1中斷函數,用於脈衝頻率控制=====================================

void time1_interrupt()interrupt 3

{

static num1 = 0;

static num2 = 0;

TH1 = time_counter[k-1][0];

TL1 = time_counter[k-1][1];//定時器1,定時1 用於步進電機轉速控制

if(flag1 == 0)//正轉

{

switch(num1)

{

case 0:a = 1;b = 0;c = 0;d = 0;break;

case 1:a = 1;b = 1;c = 0;d = 0;break;

case 2:a = 0;b = 1;c = 0;d = 0;break;

case 3:a = 0;b = 1;c = 1;d = 0;break;

case 4:a = 0;b = 0;c = 1;d = 0;break;

case 5:a = 0;b = 0;c = 1;d = 1;break;

case 6:a = 0;b = 0;c = 0;d = 1;break;

case 7:a = 1;b = 0;c = 0;d = 1;break;

}

num1++;

if(num1 == 8)num1 = 0; 

}

else   //反轉

{

switch(num2)

{

case 0:a = 1;b = 0;c = 0;d = 1;break;

case 1:a = 0;b = 0;c = 0;d = 1;break;

case 2:a = 0;b = 0;c = 1;d = 1;break;

case 3:a = 0;b = 0;c = 1;d = 0;break;

case 4:a = 0;b = 1;c = 1;d = 0;break;

case 5:a = 0;b = 1;c = 0;d = 0;break;

case 6:a = 1;b = 1;c = 0;d = 0;break;

case 7:a = 1;b = 0;c = 0;d = 0;break;

}

num2++;

if(num2 == 8)num2 = 0;

}

}

相關焦點

  • 51單片機精確控制步進電機(有TB6600驅動)
    設備:51單片機開發板、TB6600驅動器、57BYG250B步進電機(二相)、直流開關電源。直流電源給驅動器供電,單片機給驅動器輸入脈衝,驅動器驅動步進電機。程序使用定時器中斷精確控制電機轉動(不考慮失步)。比如我採用16倍細分,則需給驅動輸入3200個脈衝,驅動才會使電機轉一圈,下面程序中1秒發送200個脈衝,則相應的電機16秒轉一圈。
  • 基於單片機的步進電機開環控制系統
    摘要: 通過ATMEL89C51單片機對步進電機進行控制,主要介紹了步進電機控制器、驅動電路和LED顯示電路的設計,實現了步進電機的開環控制。
  • 單片機控制步進電機的原理
    本資料詳細介紹鄧步進電機的工作原理以及單片機控制步進電機的特點。步進電機是數字控制電機,它將脈衝信號轉變成角位移,即給一個脈衝信號,步進電機就轉動一個角度,因此非常適合於單片機控制。    步進電機可分為反應式步進電機、永磁式步進電機和混合式步進電機。
  • 基於MCS-51單片機和步進電機實現鍋爐筒壁孔加工控制系統的設計
    基於MCS-51單片機和步進電機實現鍋爐筒壁孔加工控制系統的設計 佚名 發表於 2020-04-15 09:28:34 1、前 言 為實現鍋爐筒壁孔加工自動化而設計的數控系統
  • 51單片機控制四相步進電機
    接觸單片機快兩年了,不過只是非常業餘的興趣,實踐卻不多,到現在還算是個初學者吧。這幾天給自己的任務就是搞定步進電機的單片機控制。以前曾看過有關步進電機原理和控制的資料,畢竟自己沒有做過,對其具體原理還不是很清楚。
  • 步進電機控制程序(c語言+51單片機)
    #includereg51.h>本文引用地址:http://www.eepw.com.cn/article/162126.htm#define uint unsigned int
  • 51單片機驅動步進電機__終極(完整版)
    在這裡介紹一下用51單片機驅動步進電機的方法。 這款步進電機的驅動電壓12V,步進角為 7.5度 . 一圈 360 度 , 需要 48 個脈衝完成!!! 該步進電機有6根引線,排列次序如下:1:紅色、2:紅色、3:橙色、4:棕色、5:黃色、6:黑色。
  • 51單片機控制步進電機驅動器工作原理
    步進電機在控制系統中具有廣泛的應用。它可以把脈衝信號轉換成角位移,並且可用作電磁製動輪、電磁差分器、或角位移發生器等。有時從一些舊設備上拆下的步進電機(這種電機一般沒有損壞)要改作它用,一般需自己設計驅動器。本文介紹的就是為從一日本產舊式印表機上拆下的步進電機而設計的驅動器。
  • 51單片機與TA8435的步進電機細分控制
    1 步進電機   步進電動機是純粹的數字控制電動機,它將電脈衝信號轉變為角位移,即給一個脈衝,步進電機就轉一個角度,因此非常合適單片機控制,在非超載的情況下,
  • 51單片機學習之3-步進電機
    用於增強單片機IO口的驅動能力。ULN2003是高耐壓、大電流達林頓陳列,由七個矽NPN達林頓管組成。ULN2003是大電流驅動陣列,多用於單片機、智能儀表、PLC、數字量輸出卡等控制電路中。可直接驅動繼電器等負載。
  • 用51單片機控制兩相四線步進電機
    最近學習步進電機的驅動原理,照著教材自己實踐了一下用ULN2003驅動28BYJ-48兩相5線步進電機,可以正常轉動。手頭有一個舊光碟機,拆開發現裡面有三個電機,其中有一個控制雷射頭尋跡的兩相四線步進電機,我就用51的單片機讓它也轉起來。一開始照葫蘆畫瓢用ULN2003驅動,結果發現無論如何也不行。
  • 51單片機驅動步進電機電路及程序
    在這裡介紹一下用51單片機驅動步進電機的方法。本文引用地址:http://www.eepw.com.cn/article/173250.htm  這款步進電機的驅動電壓12V,步進角為 7.5度 .
  • 51單片機PWM細分控制步進電機的研究
    因為這樣可以是步進電機運行平穩、減小噪音、增大轉速(MAX的)、增加力矩……為什麼要強調是51單片機呢?因為51單片機沒有硬體PWM模塊,所以只能軟體模擬了……研究這玩意兒,我走了許多彎路,看了許多文獻,最後發現,盡信書不如無書……就用28系列4相5線電機來說吧。
  • 基於單片機的步進電機加減速控制
    步進電機(脈衝電動機)是一種將電脈衝轉化為角位移的執行機構,是數字控制的一種執行元件,其可以通過控制脈衝頻率來控制電機轉動的速度和加速度,從而達到調速的目的。
  • 基於ATMEGA48單片機的儀表步進電機的細分控制
    儀表步進電機本文引用地址:http://www.eepw.com.cn/article/162587.htm  步進電機是將電脈衝信號轉變為角位移或線位移的開環控制元件。
  • 基於THB6064H的步進電機閉環控制電路設計
    單片機接收來自上位機的時序脈衝信號和方向信號,經驅動放大後送往步進電機來控制步進電機工作;步進電機帶動編碼器同軸旋轉,由編碼器檢測轉角度,並以脈衝的形式反饋到單片機進行核步計數;單片機根據脈衝反饋當量值與給定值進行比較,按照核步算法發出控制指令。如果發生丟步,單片機就會根據差值繼續發送脈衝,把丟掉的步數補上,從而完成步進電機轉動位置的閉環控制。
  • 51單片機ULN2003驅動步進電機的典型應用電路圖解
    打開APP 51單片機ULN2003驅動步進電機的典型應用電路圖解 發表於 2017-10-24 10:19:31   51單片機是對所有兼容Intel 8031指令系統的單片機的統稱。該系列單片機的始祖是Intel的8004單片機,後來隨著Flash rom技術的發展,8004單片機取得了長足的進展,成為應用最廣泛的8位單片機之一,其代表型號是ATMEL公司的AT89系列,它廣泛應用於工業測控系統之中。很多公司都有51系列的兼容機型推出,今後很長的一段時間內將佔有大量市場。
  • 以單片機為核心的步進電機控制系統驅動設計
    步進電機精度高,慣性小,在不失步的情況下沒有步距誤差積累,特別適用於數字控制的定位系統。本文利用A3967SLB作為步進電機微控晶片,簡化了步進電機的控制實現。由於單片機資源沒有PC豐富,人機界面也沒有PC友好,因此,本文採用了主從式結構,即PC用於管理,單片機用於執行。 由A3967SLB構成步進電機的驅動部分 A3967SLB是美國Allegro公司生產的PWM恆流控制微步距驅動二相步進電機專用驅動器。
  • 單片機對儀表步進電機的細分控制
    是將電脈衝信號轉變為角位移或線位移的開環控制元件。在非超載的情況下,電機轉速、停止的位置只取決於脈衝信號的頻率和脈衝數,而不受負載變化的影響,即給電機某相線圈加一脈衝信號,電機則轉過一個步距角。這一線性關係的存在,加上步進電機只有周期性的誤差而無累積誤差等特點,使得在速度、位置等控制領域用步進電機來控制變得非常簡單。雖然步進電機已被廣泛地應用,但步進電機並不像普通的直流電機、交流電機那樣在常規下使用。
  • 單片機控制步進電機驅動器工作原理
    步進電機在控制系統中具有廣泛的應用。它可以把脈衝信號轉換成角位移,並且可用作電磁製動輪、電磁差分器、或角位移發生器等。  有時從一些舊設備上拆下的步進電機(這種電機一般沒有損壞)要改作它用,一般需自己設計驅動器。