hi,大家好啊,好久沒更新了,有人擔心e哥會不會不運營公眾號了。e哥的回答是:不會的。e哥以前是個程式設計師,現在e哥打算找份電子設計方面的工作,所以做了些調整,希望以後能給大家分享更多更專業的電子設計知識。
七月份,e哥和QQ群(143867886)內的小夥伴談論了平衡小車的設計,本來計劃在八月份設計出一臺平衡小車的,現在看來得延期了。製作平衡小車牽涉的內容比較多,e哥打算把這些內容先拆開來發表,然後再整合出一臺平衡小車。
平衡小車單片機處理可以用Arduino或Stm32,驅動電機可以用直流電機或步進電機。直流電機使用較為簡單,電機的轉速與電壓(電流)大小有關,電壓(電流)越大轉速越快,也可以通過PWM控制它的轉速。步進電機使用較為複雜,相比於直流電機步進電機具有瞬間啟動和急速停止的優越特性。接下來就著重介紹一下步進電機的使用方法。
步進電機是將電脈衝信號轉變為角位移或線位移的開環控制電機,它的旋轉是以固定的角度一步一步運行的。可以通過控制脈衝個數來控制角位移量,從而達到準確定位的目的;同時可以通過控制脈衝頻率來控制電機轉動的速度和加速度,從而達到調速的目的。
步進電機分類和型號很多下面將於28BYJ-48型號的步進電機來講解步進電機的組成結構、工作原理、驅動電路和程序實現。如果需要了解其他類別的步進電機可查看文章最下方的「閱讀原文」。
28BYJ-48型步進電機
步進電機組成結構
▼
一個典型的步進電機內部由轉子、定子和繞組組成。上圖中繞組線圈繞在定子上形成了A、B、C三相勵磁,該步進電機被稱為三相步進電機。
簡化的步進電機:
上圖步進電機定子有三相、轉子齒數為6個。
接下來讓我們來逐步拆解28BYJ-48步進電機看看其內部的結構。
拆開的第一步我們可以看到四個變速齒輪。28BYJ-48是減速步進電機,利用四個齒輪減緩步進電機的轉速,減速比例有1:64、1:32、1:16,本文使用的是1:64,也就是步進電機內部旋轉了64圈,外部軸只旋轉1圈。
繼續往下拆就可以看到定子和轉子。定子由四排犬牙狀的鐵片交替排列組成,這相對於A、B、C、D四相勵磁。轉子從表面上看是一個圓筒形永磁體,當你用鐵塊測試就能發現它其實由8部分組成,這相對於轉子擁有的齒數為8。
再往下拆解就能找到繞組了。繞組共有四組線圈分別給A、B、C、D四相勵磁提供磁力。
步進電機工作原理
▼
當給定子上的繞組線圈通電時,該線圈對應的相勵磁就會產生磁力吸引轉子的齒牙並與之吻合,從而帶動轉子旋轉。上圖中當A相勵磁通電時會使A上齒牙和轉子上的齒牙吻合,同理當B相勵磁通電時會使B上齒牙和轉子上的齒牙吻合,由此轉子就轉動了3°,以此類推C通電再轉動3°,我們把轉的3°稱為「步距角」。
由上面分析可知如果想要步進電機旋轉就需要給定子繞組有序通電。由於通電時間可以很短,所以通電過程可以理解為是發送一個正脈衝,如下圖所示。
上圖的通電方式可以稱為:單相輪流通電(A→B→C→A),如果需要反轉通電順序可以改為A→C→B→A。除了單相輪流通電方式,還有雙相輪流通電(AB→BC→CA→AB),單雙相輪流通電(A→AB→B→BC→C→CA→A)。單相輪流通電和雙相輪流通電的步距角相等,單雙相輪流通電的步距角是單相輪流通電的一半。
28BYJ-48型步進電機(命名解釋:28—電機外觀直徑28mm,B—步進電機,Y—轉子使用永磁體,J—減速電機,4—四相,8—八拍)是四相八拍減速步進電機。它的減速比例有1/64、1/32、1/16三種,本文使用的是1/64,工作電壓有5v、6v、12v、24v四種,本文使用的是5v,在八拍(A→AB→B→BC→C→CD→D→DA→A)方式下步距角為5.625°,減速後為0.087890625°,那麼在四拍(A→B→C→D→A)方式下步距角為11.25°,減速後為0.17578125°。
28BYJ-48型步進電機外部軸旋轉一周,在八拍方式下A、B、C、D相分別需要1024個脈衝,總共就需要4096個脈衝;在四拍方式下A、B、C、D相分別需要512個脈衝,總共就需要2048個脈衝。
步進電機的步距角是可以通過定子的相數m、轉子的齒數z以及通電方式c計算出來的。當步進電機為單相輪流通電或雙相輪流通電時c=1,當步進電機為單雙相輪流通電時c=2。那麼步距角Q就可以用下列等式計算了。
Q=360/(m*z*c)
28BYJ-48型步進電機m=4,z=8,當在八拍方式下c=2,那麼Q=360/(4*8*2)=5.625。
由Q=360/(m*z*c)公式可知,步進電機的相數越多步距角越小,定子齒數越多步距角越小。
步進電機驅動電路
▼
由於驅動步進電機旋轉需要比較大的電流,而單片機引腳的驅動能力非常有限,所以就需要加驅動電路。可以使用ULN2003晶片來驅動步進電機,也可以用三極體驅動。
ULN003驅動電路:
三極體驅動電路:
當然也可以直接購買驅動模塊。
ULN2003驅動模塊
步進電機程序實現
▼
單片機控制步進電機轉動時需要單片機引腳有序的發送脈衝。28BYJ-48型步進電機有四相,需要四個引腳控制。接下來將分別編寫51和STM32單片機控制28BYJ-48型步進電機的C程序代碼。
51單片機:
使用STC15F104E單片機,控制步進電機引腳為P3.2、P3.3、P3.4、P3.5。
void stepperMotor(bit flag, uint16 times, uint8 speed)
{
uint16 T = 600000 / (2048 * speed);
static uint8 step;
P32 = P33 = P34 = P35 = 0;
while(times--)
{
if(flag == 0)
{
//A->B->C->D->A
switch(step)
{
case 0:
P35 = 0;
P32 = 1;
break;
case 1:
P32 = 0;
P33 = 1;
break;
case 2:
P33 = 0;
P34 = 1;
break;
case 3:
P34 = 0;
P35 = 1;
break;
}
}
else
{
//A->D->C->B->A
switch(step)
{
case 0:
P33 = 0;
P32 = 1;
break;
case 1:
P32 = 0;
P35 = 1;
break;
case 2:
P35 = 0;
P34 = 1;
break;
case 3:
P34 = 0;
P33 = 1;
break;
}
}
step = ++step >=4 ? 0 : step;
delay_100us(T);
}
P32 = P33 = P34 = P35 = 0;
}
STM32單片機:
使用STM32F103C8T6單片機,控制步進電機引腳為PA0、PA1、PA2、PA3。
void stepperMotor(uint8_t flag, uint16_t times, uint8_t speed)
{
uint16_t T = 600000 / (2048 * speed);
static uint8_t step;
GPIO_ResetBits(GPIOA, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3);
while(times--)
{
if(flag == 0)
{
//A->B->C->D->A
switch(step)
{
case 0:
GPIO_ResetBits(GPIOA, GPIO_Pin_3);
GPIO_SetBits(GPIOA, GPIO_Pin_0);
break;
case 1:
GPIO_ResetBits(GPIOA, GPIO_Pin_0);
GPIO_SetBits(GPIOA, GPIO_Pin_1);
break;
case 2:
GPIO_ResetBits(GPIOA, GPIO_Pin_1);
GPIO_SetBits(GPIOA, GPIO_Pin_2);
break;
case 3:
GPIO_ResetBits(GPIOA, GPIO_Pin_2);
GPIO_SetBits(GPIOA, GPIO_Pin_3);
break;
}
}
else
{
//A->D->C->B->A
switch(step)
{
case 0:
GPIO_ResetBits(GPIOA, GPIO_Pin_1);
GPIO_SetBits(GPIOA, GPIO_Pin_0);
break;
case 1:
GPIO_ResetBits(GPIOA, GPIO_Pin_0);
GPIO_SetBits(GPIOA, GPIO_Pin_3);
break;
case 2:
GPIO_ResetBits(GPIOA, GPIO_Pin_3);
GPIO_SetBits(GPIOA, GPIO_Pin_2);
break;
case 3:
GPIO_ResetBits(GPIOA, GPIO_Pin_2);
GPIO_SetBits(GPIOA, GPIO_Pin_1);
break;
}
}
step = ++step >= 4 ? 0 : step;
delay_100us(T);
}
GPIO_ResetBits(GPIOA, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3);
}
程序採用單拍輪流通電方式(A->B->C->D->A或A->D->C->B->A),步距角為11.25°,減速後為0.17578125°。其中輸入參數flag:轉動方向,0-順時針(A->B->C->D->A)、1-逆時針(A->D->C->B->A),times:脈衝個數,speed:轉動速度,1-每分鐘轉1圈,取值範圍1-15。
程序中靜態變量step代表步進電機相勵磁,其中0對應A,1對應B,2對應C,3對應D。設置step的目的是為了讓控制步進電機轉動的脈衝能在各個相勵磁中順序執行,保證轉子的轉動方向一致。
由於步距角為11.25°,減速後為0.17578125°,所以旋轉一圈需要2048個脈衝,也就是每相需要512個脈衝。步進電機對脈衝寬度是有一定要求,脈衝持續時間不能太短,28BYJ-48型步進電機脈衝持續時間最好大於1ms。
在之前公眾號發表過直流電機和舵機的文章,今天又寫了篇步進電機的文章,看上去它們還有些相似的地方。下面來簡單敘述下三者的特點:直流電機可以控制轉速,舵機可以控制旋轉角度,步進電機既可以控制轉速也可以控制旋轉角度。舵機旋轉角度有範圍(0°~180°),步進電機沒有;舵機有伺服電位每次的旋轉不受上一次旋轉情況影響,步進電機旋轉是步距角累加過程每次的旋轉會受上一次旋轉情況影響。比方說當舵機受外力影響導致其未能旋轉到正確角度,當外力消失後,舵機的下一次旋轉操作不會因為上一次旋轉失敗而不能到達正確角度。而步進電機如果受到外力阻擾轉動,那麼接下來的旋轉操作都會受到影響而不能旋轉到正確角度,此時就需要重新矯正了。
以上程序只列舉了步進電機的控制函數部分,完整的51、STM32單片機測試程序可在QQ群(143867886)群文件內下載。
舵機使用介紹