淺談步進電機的用法及STM32代碼實現思路

這兩天,在實驗室搞了搞步進電機,可能只後會在電賽上用到,就弄了一個步進電機大體瞭解了一下。
我手上的是二相四線步進電機,步距角爲1.8°,轉矩爲1.2N(這個我也不是很有概念),拿到手了我查了一下步進電機的工作原理

步進電機是將電脈衝信號轉變爲角位移或線位移的開環控制電機,是現代數字程序控制系統中的主要執行元件,應用極爲廣泛。在非超載的情況下,電機的轉速、停止的位置只取決於脈衝信號的頻率和脈衝數,而不受負載變化的影響,當步進驅動器接收到一個脈衝信號,它就驅動步進電機按設定的方向轉動一個固定的角度,稱爲“步距角”,它的旋轉是以固定的角度一步一步運行的。可以通過控制脈衝個數來控制角位移量,從而達到準確定位的目的;同時可以通過控制脈衝頻率來控制電機轉動的速度和加速度,從而達到調速的目的。

看完總結一下好像就是這個步進電機和舵機差別還挺大的,步進電機只看脈衝,有一個脈衝,就轉一個角,脈衝頻率越高,電機速度越快,脈衝個數越多,轉的角度越多。

然後就是步進電機的四線分別是紅綠黃藍,可以測一下,發現紅綠導通,藍黃導通,(到現在我也是一臉懵逼,到底咋控制它動)紅綠黃藍分別是A1 A2 B1 B2正好分成兩組。
我又查了一下它的驅動,L298N!這個我熟。接線簡單一說A1 A2接OUT1 2,B1 B2接OUT3 4。工作電壓5v,L298N直接接12v直流電源就ok
接下來就是代碼環節,我發現他居然分拍,又八拍和四拍
(1)四拍:A 1000,A- 0010,B 0100,B- 0001.
(2)八拍:A 1000,AA- 1010,A- 0010,A-B 0110,B 0100,BB- 0101,B- 0001,B-A 1001.
區別就是轉子齒爲50齒電機。四拍運行時步距角爲θ=360度/(504)=1.8度(俗稱整步),八拍運行時步距角爲θ=360度/(508)=0.9度(俗稱半步)。這兩個概念清楚後,我們再來計算轉速,以基本步距角1.8°的步進電機爲例(現在市場上常規的二、四相混合式步進電機基本步距角都是1.8°),四相八拍運行方式下,每接收一個脈衝信號,轉過0.9°,如果每秒鐘接收400個脈衝,那麼轉速爲每秒400X0.9°=360°,相當與每秒鐘轉一圈,每分鐘60轉。其他情況同理可以計算得出。 (自我感覺沒啥區別)

我用的是stm32f103,不細說,貼一下那個子文件吧

#include "bj.h"
#include "sys.h"
void BJ_Init(void)
{
 
 GPIO_InitTypeDef  GPIO_InitStructure;
  
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);  
 
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;     
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;    
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   
 GPIO_Init(GPIOE, &GPIO_InitStructure);   
GPIO_SetBits(GPIOE,GPIO_Pin_0);       
 GPIO_SetBits(GPIOE,GPIO_Pin_1);       
 GPIO_SetBits(GPIOE,GPIO_Pin_2);      
 GPIO_SetBits(GPIOE,GPIO_Pin_3); 
}
#ifndef __BJ_H
#define __BJ_H  
#include "sys.h"
#define AIN1_1 PEout(0)// PE0
#define AIN1_2 PEout(1)// PE1 
#define BIN1_1 PEout(2)// PE2 
#define BIN1_2 PEout(3)// PE3 
void BJ_Init(void);//初始化
#endif
for(i=0;i<25;i++)
 //第一拍
{  AIN1_1=1;
  AIN1_2=0;
  BIN1_1=0;
  BIN1_2=0;
  delay_us(6000);
  //第二拍
  AIN1_1=0;
  AIN1_2=0;
  BIN1_1=1;
  BIN1_2=0;
  delay_us(6000);
  //第三拍
  AIN1_1=0;
  AIN1_2=1;
  BIN1_1=0;
  BIN1_2=0;
  delay_us(6000);
 //第四拍
  AIN1_1=0;
  AIN1_2=0;
  BIN1_1=0;
  BIN1_2=1;
  delay_us(6000);}
 for(i=0;i<25;i++)
  //第一拍
 { AIN1_1=0;
  AIN1_2=0;
  BIN1_1=0;
  BIN1_2=1;
  delay_us(6000);
  //第二拍
  AIN1_1=0;
  AIN1_2=1;
  BIN1_1=0;
  BIN1_2=0;
  delay_us(6000);
  //第三拍
  AIN1_1=0;
  AIN1_2=0;
  BIN1_1=1;
  BIN1_2=0;
  delay_us(6000);
 //第四拍
  AIN1_1=1;
  AIN1_2=0;
  BIN1_1=0;
  BIN1_2=0;
  delay_us(6000);
}

我用的是四拍,代碼實現即正轉180°再反轉180°如此循環,延時就是控制它的頻率,不太清楚它的最大頻率,也就是最快轉速,但不過轉速越快帶負載能力越差。
步進電機主要是精度高,正反轉響應速度快,之前基本都是舵機,或者空心杯,直流減速電機,估計電賽可能用上步進所以看看(_)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章