步進電機是無刷直流電機,可以小角度旋轉,這些角度稱為步進。一般步進電機使用200步完成360度旋轉,意味著其每步旋轉1.8度。步進電機用于許多需要精確旋轉運動的設備,如機器人、天線、硬盤驅動器等。我們可以通過給出適當的說明將步進電機旋轉到任何特定角度。主要有兩種類型的步進電機可供選擇,單極和雙極。單極更容易操作、控制,也更容易獲得。在本教程中,我們將步進電機與STM32F103C8(藍色藥丸)板連接。
所需材料
STM32F103C8 (藍色藥丸)
步進電機(28BYJ-48)
ULN2003 集成電路
電位器 10k
面包板
跳線
步進電機 (28BYJ-48)
28BYJ-48 是一款單極步進電機,需要 5V 電源。電機具有4線圈單極性布置,每個線圈的額定電壓為+5V,因此使用Arduino,Raspberry Pi和STM32等任何微控制器都相對容易控制。但是我們需要像ULN2003這樣的電機驅動IC來驅動它,因為步進電機消耗大電流,可能會損壞微控制器。
另一個需要注意的重要數據是步幅角度:5.625°/64。這意味著電機按 8 步順序運行時每一步移動 5.625 度,完成一整圈需要 64 步(5.625*64=360)。以下數據表中提供了其他規格:
ULN2003 電機驅動器 IC
它用于根據從微控制器接收到的脈沖驅動電機。以下是ULN2003的圖片圖:
引腳(IN1 到 IN7)是輸入引腳,(OUT 1 到 OUT 7)是相應的輸出引腳。COM 被賦予輸出設備所需的正源電壓。步進電機的進一步連接在下面的電路圖部分給出。
電路圖和連接
以下是上述電路圖的連接說明。
STM32F103C8 (藍色藥丸)
如下圖所示,PWM引腳以波形(~)表示,有15個這樣的引腳可用于步進電機的脈沖輸出。我們只需要四個引腳,我們使用(PA0到PA3)。
STM32F103C8 帶 ULN2003 電機驅動器 IC
引腳(PA0 至 PA3)被視為與 ULN2003 IC 的輸入引腳 (IN1-IN4) 連接的輸出引腳。
STM32F103C8的引腳 | ULN2003 集成電路引腳 |
質保 | 合1 |
質量保證 | IN2 |
質量保證 | HNR |
卡塔爾里亞爾 | IN4 |
5V | .COM |
接地 | 接地 |
ULN2003 帶步進電機的集成電路 (28BYJ-48)
ULN2003 IC 的輸出引腳 (OUT1-OUT4) 連接到步進電機引腳(橙色、黃色、粉紅色和藍色)。
ULN2003 集成電路引腳 | 步進電機引腳 |
輸出1 | 橙 |
輸出2 | 黃色 |
輸出3 | 粉紅色 |
輸出4 | 藍 |
.COM | 紅 |
STM32F103C8 帶電位計
電位計用于設定步進電機的速度。
電位計 | STM32F103C8 |
左(輸入) | 3.3 |
中心(輸出) | 質保 |
右(接地) | 接地 |
采用STM32F103C8的旋轉步進電機
以下是操作步進電機的幾個步驟:
通過改變電位器設置步進電機的速度。
然后通過ARDUINO IDE(工具>串行監視器)或CTRL + SHIFT + M中的串行MONITER以順時針(+值)或逆時針方向(-值)手動輸入旋轉步驟。
根據串行監視器中給出的輸入值,步進電機中會發生某些旋轉步驟。
例如
串行監控器中給出的值 | 旋轉 |
2048 | (360) 克萊克·懷斯 |
1024 | (180)CLK WISE |
512 | (90)CLK WISE |
-2048 | (-360)反克利明智 |
-1024 | (-180)反克利明智 |
-512 | (-90)反克利明智 |
步進電機STM32編程
與前面的教程一樣,我們通過USB端口使用Arduino IDE對STM32F103C8進行了編程,而無需使用FTDI編程器。
首先,我們必須包含步進庫文件#include ,以便使用步進器函數。
#include
然后我們定義 no。旋轉時要完成的步驟,這里我們使用 32,因為我們使用的是全步(4 步序列)所以 (360/32 = 11.25 度)。因此,對于一步,軸移動 11.25 度,即步幅角。在 4 步序列中,一個完整的旋轉需要 4 個步驟。
#define STEPS 32
我們還可以使用半步模式,其中有 8 步序列 (360/64=5.625) 步幅。
Steps per revolution = 360 / STEP ANGLE
當我們設置速度時,我們必須從連接到電位計的PA4中獲取模擬值。所以我們必須為此聲明 pin
const int speedm = PA4
然后,我們將模擬值轉換為數字值,將這些值存儲在整數類型的變量中,之后我們必須映射ADC值以設置速度,因此我們使用以下語句。在此處了解有關將ADC與STM32配合使用的更多信息。
int adc = analogRead(speedm);
int result = map(adc, 0, 4096, 1, 1023);
為了設置速度,我們使用stepper.setSpeed(result);我們的速度范圍為 (1-1023)。
我們必須創建如下所示的實例來設置連接到電機的引腳。在這些步驟中要小心,因為大多數步驟在此模式中都會出錯。它們給出了錯誤的模式,因此線圈無法通電。
Stepper stepper(STEPS, PA0, PA2, PA1, PA3);
以下語句用于從串行監視器獲取步驟的值。例如,我們需要 2048 個值進行一次完整旋轉 (32*64 = 2048),即 64 將是齒輪比,32 將是一次旋轉的半步序列。
rotate = Serial.parseInt();
下面的代碼用于調用實例并運行電機。如果旋轉值為 1,則調用函數步進器一次,完成一次移動。
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
}
}
-
步進電機
+關注
關注
151文章
3118瀏覽量
147718 -
STM32F103C8
+關注
關注
1文章
23瀏覽量
8103
發布評論請先 登錄
相關推薦
評論