步進(jìn)電機(jī)是無刷直流電機(jī),可以小角度旋轉(zhuǎn),這些角度稱為步進(jìn)。一般步進(jìn)電機(jī)使用200步完成360度旋轉(zhuǎn),意味著其每步旋轉(zhuǎn)1.8度。步進(jìn)電機(jī)用于許多需要精確旋轉(zhuǎn)運(yùn)動(dòng)的設(shè)備,如機(jī)器人、天線、硬盤驅(qū)動(dòng)器等。我們可以通過給出適當(dāng)?shù)恼f明將步進(jìn)電機(jī)旋轉(zhuǎn)到任何特定角度。主要有兩種類型的步進(jìn)電機(jī)可供選擇,單極和雙極。單極更容易操作、控制,也更容易獲得。在本教程中,我們將步進(jìn)電機(jī)與STM32F103C8(藍(lán)色藥丸)板連接。
所需材料
STM32F103C8 (藍(lán)色藥丸)
步進(jìn)電機(jī)(28BYJ-48)
ULN2003 集成電路
電位器 10k
面包板
跳線
步進(jìn)電機(jī) (28BYJ-48)
28BYJ-48 是一款單極步進(jìn)電機(jī),需要 5V 電源。電機(jī)具有4線圈單極性布置,每個(gè)線圈的額定電壓為+5V,因此使用Arduino,Raspberry Pi和STM32等任何微控制器都相對(duì)容易控制。但是我們需要像ULN2003這樣的電機(jī)驅(qū)動(dòng)IC來驅(qū)動(dòng)它,因?yàn)椴竭M(jìn)電機(jī)消耗大電流,可能會(huì)損壞微控制器。
另一個(gè)需要注意的重要數(shù)據(jù)是步幅角度:5.625°/64。這意味著電機(jī)按 8 步順序運(yùn)行時(shí)每一步移動(dòng) 5.625 度,完成一整圈需要 64 步(5.625*64=360)。以下數(shù)據(jù)表中提供了其他規(guī)格:
ULN2003 電機(jī)驅(qū)動(dòng)器 IC
它用于根據(jù)從微控制器接收到的脈沖驅(qū)動(dòng)電機(jī)。以下是ULN2003的圖片圖:
引腳(IN1 到 IN7)是輸入引腳,(OUT 1 到 OUT 7)是相應(yīng)的輸出引腳。COM 被賦予輸出設(shè)備所需的正源電壓。步進(jìn)電機(jī)的進(jìn)一步連接在下面的電路圖部分給出。
電路圖和連接
以下是上述電路圖的連接說明。
STM32F103C8 (藍(lán)色藥丸)
如下圖所示,PWM引腳以波形(~)表示,有15個(gè)這樣的引腳可用于步進(jìn)電機(jī)的脈沖輸出。我們只需要四個(gè)引腳,我們使用(PA0到PA3)。
STM32F103C8 帶 ULN2003 電機(jī)驅(qū)動(dòng)器 IC
引腳(PA0 至 PA3)被視為與 ULN2003 IC 的輸入引腳 (IN1-IN4) 連接的輸出引腳。
STM32F103C8的引腳 | ULN2003 集成電路引腳 |
質(zhì)保 | 合1 |
質(zhì)量保證 | IN2 |
質(zhì)量保證 | HNR |
卡塔爾里亞爾 | IN4 |
5V | .COM |
接地 | 接地 |
ULN2003 帶步進(jìn)電機(jī)的集成電路 (28BYJ-48)
ULN2003 IC 的輸出引腳 (OUT1-OUT4) 連接到步進(jìn)電機(jī)引腳(橙色、黃色、粉紅色和藍(lán)色)。
ULN2003 集成電路引腳 | 步進(jìn)電機(jī)引腳 |
輸出1 | 橙 |
輸出2 | 黃色 |
輸出3 | 粉紅色 |
輸出4 | 藍(lán) |
.COM | 紅 |
STM32F103C8 帶電位計(jì)
電位計(jì)用于設(shè)定步進(jìn)電機(jī)的速度。
電位計(jì) | STM32F103C8 |
左(輸入) | 3.3 |
中心(輸出) | 質(zhì)保 |
右(接地) | 接地 |
采用STM32F103C8的旋轉(zhuǎn)步進(jìn)電機(jī)
以下是操作步進(jìn)電機(jī)的幾個(gè)步驟:
通過改變電位器設(shè)置步進(jìn)電機(jī)的速度。
然后通過ARDUINO IDE(工具>串行監(jiān)視器)或CTRL + SHIFT + M中的串行MONITER以順時(shí)針(+值)或逆時(shí)針方向(-值)手動(dòng)輸入旋轉(zhuǎn)步驟。
根據(jù)串行監(jiān)視器中給出的輸入值,步進(jìn)電機(jī)中會(huì)發(fā)生某些旋轉(zhuǎn)步驟。
例如
串行監(jiān)控器中給出的值 | 旋轉(zhuǎn) |
2048 | (360) 克萊克·懷斯 |
1024 | (180)CLK WISE |
512 | (90)CLK WISE |
-2048 | (-360)反克利明智 |
-1024 | (-180)反克利明智 |
-512 | (-90)反克利明智 |
步進(jìn)電機(jī)STM32編程
與前面的教程一樣,我們通過USB端口使用Arduino IDE對(duì)STM32F103C8進(jìn)行了編程,而無需使用FTDI編程器。
首先,我們必須包含步進(jìn)庫文件#include ,以便使用步進(jìn)器函數(shù)。
#include
然后我們定義 no。旋轉(zhuǎn)時(shí)要完成的步驟,這里我們使用 32,因?yàn)槲覀兪褂玫氖侨剑? 步序列)所以 (360/32 = 11.25 度)。因此,對(duì)于一步,軸移動(dòng) 11.25 度,即步幅角。在 4 步序列中,一個(gè)完整的旋轉(zhuǎn)需要 4 個(gè)步驟。
#define STEPS 32
我們還可以使用半步模式,其中有 8 步序列 (360/64=5.625) 步幅。
Steps per revolution = 360 / STEP ANGLE
當(dāng)我們?cè)O(shè)置速度時(shí),我們必須從連接到電位計(jì)的PA4中獲取模擬值。所以我們必須為此聲明 pin
const int speedm = PA4
然后,我們將模擬值轉(zhuǎn)換為數(shù)字值,將這些值存儲(chǔ)在整數(shù)類型的變量中,之后我們必須映射ADC值以設(shè)置速度,因此我們使用以下語句。在此處了解有關(guān)將ADC與STM32配合使用的更多信息。
int adc = analogRead(speedm);
int result = map(adc, 0, 4096, 1, 1023);
為了設(shè)置速度,我們使用stepper.setSpeed(result);我們的速度范圍為 (1-1023)。
我們必須創(chuàng)建如下所示的實(shí)例來設(shè)置連接到電機(jī)的引腳。在這些步驟中要小心,因?yàn)榇蠖鄶?shù)步驟在此模式中都會(huì)出錯(cuò)。它們給出了錯(cuò)誤的模式,因此線圈無法通電。
Stepper stepper(STEPS, PA0, PA2, PA1, PA3);
以下語句用于從串行監(jiān)視器獲取步驟的值。例如,我們需要 2048 個(gè)值進(jìn)行一次完整旋轉(zhuǎn) (32*64 = 2048),即 64 將是齒輪比,32 將是一次旋轉(zhuǎn)的半步序列。
rotate = Serial.parseInt();
下面的代碼用于調(diào)用實(shí)例并運(yùn)行電機(jī)。如果旋轉(zhuǎn)值為 1,則調(diào)用函數(shù)步進(jìn)器一次,完成一次移動(dòng)。
stepper.step(rotate);
/STM32 stepper motor control code
//CIRCUIT DIGEST
#include // Include the Stepper motor header file
#define STEPS 32 // change this to the number of steps on your motor
const int speedm = PA4; // Pin for input speed
Stepper stepper(STEPS, PA0, PA2, PA1, PA3); // create an instance of the stepper class using the steps and pins
int rotate = 0; //declare variable rotate with 0 for input rotation.
void setup() //Setup() runs only once
{
Serial.begin(9600); //begins serial communication at 9600baud rate
pinMode(speedm,INPUT); //set pin PA4 as input
}
void loop() //loop() runs infinitely
{
if (Serial.available()>0) //Checks if serial data is entered or not in serial monitor
{
rotate = Serial.parseInt(); //gets the value for rotation from serial monitor
int adc = analogRead(speedm); //read analog value from pin PA0
int result = map(adc, 0, 4096, 0, 1023); //maps the result of ADC from (0to4096)with (0to1023)
stepper.setSpeed(result); //sets the speed of motor
stepper.step(rotate); //makes the motor to rotate
Serial.println(rotate); //prints the value you specified to rotate
}
}
-
步進(jìn)電機(jī)
+關(guān)注
關(guān)注
150文章
3095瀏覽量
147347 -
STM32F103C8
+關(guān)注
關(guān)注
1文章
23瀏覽量
8074
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論