最近有好多小夥伴私信我說,導師給他們布置了關於四線步進電機控制的相關設計,問我能不能寫個類似的文章,今天我剛好有點時間,我們就一起探討一下吧。

想要弄清楚步進電機的控制方式先要弄清楚它的接線方式和工作原理
步進電機結構和工作原理:
1.步進電機是將電脈衝信號轉變為角位移或線位移的開環控制元件。在非超載的情況下,電動機的轉速、停止的位置只取決於控制脈衝信號的頻率和脈衝數。
2.脈衝數越多,電機轉動的角度越大。
3.脈衝的頻率越高,電機轉速越快,但不能超過最高頻率,否則電機的力矩迅速減小,電機不轉。按力矩產生的原理可以分為:
(1)反應式:轉子無繞組,由被激磁的定子繞組產生反應力矩實現步進運行
(2)激磁式:定、轉子均有激磁繞組(或轉子用永久磁鋼),由電磁力矩實現步進運行按輸出力矩大小可分為:
(1)伺服式:輸出力矩在百分之幾之幾至十分之幾(N.m)只能驅動較小的負載,要與液壓扭矩放大器配用,才能驅動機床工作台等較大的負載
(2)功率式:輸出力矩在5~50 N.m以上,可以直接驅動機床工作台等較大的負載按定子數可分為:
(1)單定子式(2)雙定子式(3)三定子式(4)多定子式按各相繞組分布可分為;
(1)徑向分布式:電機各相按圓周依次排列
步進電機和驅動板的連接方式:

鑒於時間原因我就用仿真軟件做了一個單片機四線步進電機驅動項目 供大家參考學習,希望你看完後會有所收穫。
項目軟件程序功能:當按下SW1時步進電機正轉,按下SW2後步進電機反轉,並可以根據源碼任意調節旋轉速度和每一個脈衝旋轉角度
以下是仿真圖:



程序參考源代碼如下:經過實際驗證,軟硬件可以實現設計功能,實驗成功。
/C語言程序:/
#include <reg52.h> //
#define uchar unsigned char
#define uint unsigned int
uchar table_begin;
uint maichong; //脈衝
uchar zhuansu; //轉速
uchar flag; //方向
sbit key_fuwei=P3^0; //複位鍵
sbit key_z=P3^1; //正轉鍵
sbit key_f=P3^2; //反轉鍵
sbit key_jia=P3^3; //加速鍵
sbit key_jian=P3^6; //減速鍵
sbit A1=P2^0;
sbit A2=P2^1;
sbit A3=P2^2;
sbit A4=P2^3;
void display();
void delayms(xms);
void delay(uchar x)
{
uchar i,j; //延時
for(i=0;i<x;i++)
for(j=100;j>0;j–);
}
void fuwei(void) //複位
{
flag=2;
zhuansu=0;
}
/*void Display(void) //顯示
{
unsigned char b1, b2;
b1=zhuansu/10;
b2=zhuansu%10;
if(flag == 0) //0
P0=0x71;//顯示F
else
P0=0x79;
A1=0;
delayms(3);
A1=1;
P0=0x40;
A2=0; //顯示–
delayms(3);
A2=1;
P0=table2[b1];
A3=0; //顯示十位
delayms(3);
A3=1;
P0=table2[b2];
A4=0;
delayms(3); //顯示個位
A4=1;
void display()
{
uchar b1,b2,b3,b4;
if(flag0)
P0=0x71;//顯示F
else
P0=0x79;
if(flag1)
P0=0x7c;//顯示b
else
P0=0x71;
b1=10;
b2=0x3f;
b3=zhuansu/10;
b4=zhuansu%10;
//P0=table2;
A1=0; //P2.0
delay(1);
A1=1;
P0=b2;
A2=0; //P2.1
delay(1);
A2=1;
P0=table2[b3];
A3=0; //P2.3
delay(1);
A3=1;
P0=table2[b4];
A4=0; //P2.4
delay(1);
A4=1;
}
void key() //按鍵掃描
{
if(key_fuwei0)
{
delay(5);
if(key_fuwei0)
fuwei();
}
if(key_z0)
{
delay(5);
if(key_z0)
{
flag=0;
zhuansu=10;
while(key_z0);
}
}
if(key_f0)
{
delay(5);
if(key_f0)
{
flag=1;
zhuansu=10;
while(key_f0);
}
}
if(key_jia0)
{
delay(5);
if(key_jia0)
{
zhuansu++;
if(zhuansu21)
zhuansu=20;
while(key_jia0);
}
}
if(key_jian0)
{
delay(5);
if(key_jian0)
{
zhuansu–;
if(zhuansu<=0)
zhuansu=0;
while(key_jian==0);
}
}
}
void dispose() //脈衝函數
{
switch(zhuansu)
{
case 0: flag=2; break;
case 1: maichong=300; break;
case 2: maichong=295; break;
case 3: maichong=290; break;
case 4: maichong=280; break;
case 5: maichong=260; break;
case 6: maichong=240; break;
case 7: maichong=200; break;
case 8: maichong=180; break;
case 9: maichong=160; break;
case 10: maichong=120; break;
case 11: maichong=80; break;
case 12: maichong=70; break;
case 13: maichong=60; break;
case 14: maichong=40; break;
case 15: maichong=35; break;
case 16: maichong=30; break;
case 17: maichong=25; break;
case 18: maichong=20; break;
case 19: maichong=15; break;
case 20: maichong=10; break;
}
if(flag0)
table_begin=0;
else
if(flag1)
table_begin=4;
}
void zhuandong(void)
{
uint i,j;
if(zhuansu>0&&zhuansu<=20)
{
for(j=0+table_begin;j<4+table_begin;j++)
{
P1=table1[j];
for(i=0;i<maichong;i++)
display();
}
}
}
……………………
原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/218948.html
微信掃一掃
支付寶掃一掃