標題: 我的單片機步進電機設計 含源程序,模擬電路圖,Proteus仿真圖 [打印本頁]
作者: RoLain 時間: 2025-12-8 20:40
標題: 我的單片機步進電機設計 含源程序,模擬電路圖,Proteus仿真圖
這是我最近做的一個步進電機設計
使用的單片機是AT89C51
需要用到軟件Keil5,Proteus8.9
是根據我們的設計要求做的
附件里包含步進電機的單片機源代碼,以及Proteus模擬電路圖,設計文件
對該作品的介紹可能不是很嚴謹,還請大家多包涵
如果該設計存在學術性錯誤,還請為我指正!
以下是設計內容,希望它可以幫到你:
所涉及到的知識:
一、步進電機是什么?
步進電機是將電脈沖信號轉變為角位移或線位移的開環控制元件。在非超載的情況下,電機的轉速、停止的位置只取決于脈沖信號的頻率和脈沖數,而不受負載變化的影響,即給電機加一個脈沖信號,電機則轉過一個步距角。這一線性關系的存在,加上步進電機只有周期性的誤差而無累積誤差等特點。使得在速度、位置等控制領域用步進電
機來控制變的非常的簡單。
二、步進電機的主要特性有哪些?
1. 步進電機必須加驅動才可以運轉,驅動信號必須為脈沖信號,沒有脈沖的時候,步進電機靜止,如果加入適當的脈沖信號,就會以一定的角度(稱為步角)轉動。轉動的速度和脈沖的頻率成正比。
2. 本次使用的步進電機是 28BYJ48 5V 驅動的 4 相 5 線的步進電機,而且是減速步進電機,減速比為 1:64,步進角為 5.625/64 度。如果需要轉動 1 圈,那么需要 360/5.625*64=4096 個脈沖信號。
3. 步進電機具有瞬間啟動和急速停止的優越特性。
4. 改變脈沖的順序,可以方便的改變轉動的方向。
本設計將通過實現一個基于單片機的,可以通過按鍵精確控制電機正反轉,加減速,開始和停止的控制電路,來說明單片機如何工作
具體操作步驟如下:
第一步:Keil編程(此處省略了文件創建步驟)
第一部分 這一串代碼可以控制電機的轉向
#include<reg51.h>
#define uchar unsigned char
bit flag;
uchar a= 1,t = 100;
uchar code tab1[] = {0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9};
uchar code tab2[] = {0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1};
sfr P1M1 = 0X91;
sfr P1M0 = 0X92;
sfr P2M1 = 0X95;
sfr P2M0 = 0X96;
第二部分 這一串代碼可以實現對電機的接近毫秒級延時的控制,原理是通過嵌套循環消耗 CPU 時間實現延時
void delay(uchar ms)
{ uchar j;
while(ms--)
for(j=0;j<100;j++);}
第三部分 這一串代碼可以實現電機的轉向切換、調速、啟停控制
void keyscan()
{ P1M1 = 0;
P2M1 = 0;
P1M0 = 0XFF;
P2M0 = 0XFF;
if(P2!=0xff)
{ delay(5);
if(P2!=0xff)
{ switch(P2)
{
case 0xfe:a=1;break;//正轉
case 0xfd:a=2;break;//反轉
case 0xfb:if(t>50)t=t-10;else t=50;break;//加速
case 0xf7:if(t<150)t=t+10;else t=150;break;//減速
case 0xef:flag=1;break;//開始
case 0xdf:flag=0;break;//停止
}
while(P2!=0xff);
}
}
}
第四部分 這一段代碼可以通過定時器 0 實現定時中斷
void time0_init() //定時器T0初始化
{
TMOD=0x01; //設置定時器0工作方式1
TH0=(65536-50000)/256;//定時50ms取高八位
TL0=(65536-50000)%256; //取低八位
ET0=1; //開定時器0中斷使能
EA=1; //開總中斷使能
TR0=1; //開啟中斷
}
void time0() interrupt 1 //定時器T0入口函數
{
TH0=(65536-50000)/256; //定時50ms重新賦初值
TL0=(65536-50000)%256;
keyscan();
}
第五部分 這一段是主函數,根據flag(啟停標志)和a(轉向標志)控制電機運行
void main()
{ uchar i;
time0_init();
while(1)
{ if(flag)
{ if(a==1)
{ for(i=0;i<8;i++)
{ P1=tab1;
delay(t);}
}
if(a==2)
{ for(i=0;i<8;i++)
{ P1=tab2;
delay(t);
}
}
}
else
P1=0x00;
}
}
Keil5內的代碼如下圖
51hei圖片_20251208204512_169_18.jpg (97.41 KB, 下載次數: 0)
下載附件
代碼
2025-12-8 20:46 上傳
51hei圖片_20251208204512_170_18.jpg (111.78 KB, 下載次數: 0)
下載附件
代碼
2025-12-8 20:46 上傳
51hei圖片_20251208204512_171_18.jpg (69.21 KB, 下載次數: 0)
下載附件
代碼
2025-12-8 20:46 上傳
第二步:使用Proteus仿真電路(此處省略了文件創建步驟)
放置元件AT89C51(單片機)與L298(電機驅動芯片)
將單片機的P1 口(P1.0~P1.5)連接 L298 的IN1~IN4和ENA/ENB(使能端),用于輸出步進電機的相序控制信號和使能信號
將單片機的P2 口(P2.0~P2.5)連接 6 個按鍵(正轉、反轉、加速、減速、啟動、停止),用于接收用戶操作指令
XTAL1/XTAL2 預留晶振接口(外接晶振和電容構成時鐘電路)
RST 為復位引腳(外接復位電路)
L298 電機驅動芯片的IN1~IN4接口連接單片機 P1 口,接收相序控制信號;ENA/ENB連接單片機 P1 口,控制驅動模塊的使能(可用于調速)
VCC接 5V 邏輯電源,VS接電機驅動電源(需根據電機功率選擇,通常≥12V);OUT1~OUT4連接步進電機的 4 個繞組,輸出驅動電流。
SENSA/SENSB為電流檢測引腳(本電路中未使用,直接接地),可用于過流保護。
電機的 4 個繞組對應連接 L298 的OUT1~OUT4,由驅動芯片輸出的相序電流驅動轉動。
Proteus內的電路連接情況如下圖
51hei圖片_20251208204520_172_18.png (286.54 KB, 下載次數: 0)
下載附件
模擬電路圖
2025-12-8 20:46 上傳
實驗模型搭建完成,接下來進行第三步
第三步:在Proteus內進行模擬實驗
點擊左下角的按鍵啟動模擬,點擊各個按鈕,觀察電機的旋轉情況
點擊“啟動”,電機開始旋轉
51hei圖片_20251208204527_173_18.png (57.73 KB, 下載次數: 0)
下載附件
啟動
2025-12-8 20:46 上傳
點擊“加速”,電機轉速變快
51hei圖片_20251208204530_174_18.png (16.08 KB, 下載次數: 0)
下載附件
2025-12-8 20:46 上傳
點擊“反轉”,電機朝反方向轉動
51hei圖片_20251208204535_175_18.png (58.1 KB, 下載次數: 0)
下載附件
反轉
2025-12-8 20:46 上傳
點擊“停止”,電機停轉
51hei圖片_20251208204539_176_18.png (63.43 KB, 下載次數: 0)
下載附件
停止
2025-12-8 20:46 上傳
實驗成功
由上述結果證明:
步進電機必須加驅動才可以運轉,驅動信號必須為脈沖信號,沒有脈沖的時候,步進電機靜止,如果加入適當的脈沖信號,就會以一定的角度轉動。轉動的速度和脈沖的頻率成正比,而且改變脈沖的順序,可以改變電機轉動的方向。
本設計到此結束,謝謝您的觀看!
仿真程序下載:
步進電機.zip
(939.21 KB, 下載次數: 0)
2025-12-8 21:04 上傳
點擊文件名下載附件
附件
下載積分: 黑幣 -5
作者: kpffq 時間: 2025-12-10 09:06
T0定時器初值是不是搞反了,以12M主頻為例,如果定時50ms,應該是65536-15536吧?
作者: RoLain 時間: 2025-12-10 12:24
我用人工智能搜了一下,它告訴我應該是65536-50000,說是“需要計數 50000 次才能達到 50ms 定時”這樣
作者: kpffq 時間: 2025-12-10 19:58
你是對的,不好意思我搞錯了。
作者: RoLain 時間: 2025-12-11 10:34
沒事,謝謝你能提出問題
作者: 白水大蝦2016 時間: 2025-12-11 11:54
能運行嗎?
作者: RoLain 時間: 2025-12-11 15:46
我在Proteus里成功運行了,是遇到什么問題了嗎?
作者: 白水大蝦2016 時間: 2025-12-12 10:34
我做了實驗速度可調但快不了
作者: RoLain 時間: 2025-12-13 14:19
按加速鍵也轉不了更快嗎?還請詳細說明
| 歡迎光臨 (http://m.raoushi.com/bbs/) |
Powered by Discuz! X3.1 |