程序源碼提取鏈接放置文章底部,自行提取即可。
前言
采用STM32驅(qū)動28BYJ4步進電機,實現(xiàn)正轉(zhuǎn)反轉(zhuǎn),完成角度調(diào)整。步進電機是一種將電脈沖轉(zhuǎn)化為角位移的執(zhí)行機構(gòu)。當步進驅(qū)動器接收到一個脈沖信號,它就驅(qū)動步進電機按設定的方向轉(zhuǎn)動------一個固定的角度(及步進角)。可以通過控制脈沖個來控制角位移量,從而達到準確定位的目的;同時可以通過控制脈沖頻率來控制電機轉(zhuǎn)動的速度和加速度,從而達到調(diào)速的目的。
一、步進電機
1. 基本概念
步進電機是一種將電脈沖信號轉(zhuǎn)換成相應角位移或線位移的電動機。每輸入一個脈沖信號,轉(zhuǎn)子就轉(zhuǎn)動一個角度或前進一步,其輸出的角位移或線位移與輸入的脈沖數(shù)成正比,轉(zhuǎn)速與脈沖頻率成正比。因此,步進電動機又稱脈沖電動機。
步進電機控制特點:
- 它是通過輸入脈沖信號來進行控制的。
- 電機的總轉(zhuǎn)動角度由輸入脈沖數(shù)決定。
- 電機的轉(zhuǎn)速由脈沖信號頻率決定。
相數(shù):產(chǎn)生不同對極N、S磁場的激磁線圈對數(shù)。常用m表示。
拍數(shù):完成一個磁場周期性變化所需脈沖數(shù)或?qū)щ姞顟B(tài)用n表示,或指電機轉(zhuǎn)過一個齒距角所需脈沖數(shù),以四相電機為例,有四相四拍運行方式即AB-BC-CD-DA-AB,四相八拍運行方式即A-AB-B-BC-C-CD-D-DA-A。
步距角:也叫步進角,對應一個脈沖信號,電機轉(zhuǎn)子轉(zhuǎn)過的角位移用0表示。0=360度/(轉(zhuǎn)子齒數(shù)J運行拍數(shù)),以常規(guī)二、四相,轉(zhuǎn)子齒為50齒電機為例。四拍運行時步距角為0=360度/(504) =1.8度(俗稱整步),八拍運行時步距角為0=360度/(50*8)=0.9度(俗稱半步)。
保持轉(zhuǎn)矩:(HOLDING TORQUE)是指步進電機通電但沒有轉(zhuǎn)動時,定子鎖住轉(zhuǎn)子的力矩。它是步進電機最重要的參數(shù)之一,通常步進電機在低速時的力矩接近保持轉(zhuǎn)矩。
空載啟動頻率:步進電機有一個技術(shù)參數(shù):空載啟動頻率,即步進電機在空載情況下能夠正常啟動的脈沖頻率,如果脈沖頻率高于該值,電機不能正常啟動,可能發(fā)生丟步或堵轉(zhuǎn)。在有負載的情況下,啟動頻率應更低。如果要使電機達到高速轉(zhuǎn)動,脈沖頻率應該有加速過程,即啟動頻率較低,然后按一定加速度升到所希望的高頻(電機轉(zhuǎn)速從低速升到高速)。
2. 電機結(jié)構(gòu)
原理圖:
3. 工作原理
驅(qū)動節(jié)拍模式:
4. 產(chǎn)品參數(shù)
1. 技術(shù)參數(shù)
2. 外形尺寸(單位mm)
二、ULN2003驅(qū)動板
ULN2003是最常見的電機驅(qū)動器IC之一,由7對達林頓晶體管對的陣列組成,每對能夠驅(qū)動高達500mA和50V的負載。該板上使用了七對中的四對。
連接器:可以完美地匹配電動機的電線,這使得將電動機輕松連接到板上非常容易;還有用于四個控制輸入的連接以及電源連接。
四個LED:在四根控制輸入線上顯示活動(以指示步進狀態(tài)),它們在電機運行時提供良好的視覺效果。
ON / OFF跳線:用于隔離步進電機的電源。
引腳排列
IN1 – IN4腳:用于驅(qū)動電動機。將它們連接到stm32上的數(shù)字輸出引腳。
GND:是常見的接地引腳。
VCC:為電動機供電。將其連接到外部5V電源。由于電機消耗的功率過多,因此切勿使用Arduino的5V電源為步進電機供電。
馬達接頭:電機插入的地方。該連接器是帶鍵的,因此只能以一種方式進入。
原理圖:
三、驅(qū)動程序
motor
unsigned int Zz_flag = 0;
unsigned int Fz_flag = 0;
unsigned int Zz_Value = 0;
unsigned int Fz_Value = 0;
void Motor_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStruct);
//GPIO_ResetBits(GPIOC,GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9);
}
void Motor_Zz(void)//正轉(zhuǎn)
{
Zz_Value = 1;
Fz_Value = 0;
}
void Motor_Fz(void)//反轉(zhuǎn)
{
Fz_Value = 1;
Zz_Value = 0;
}
void Motor_Stop(void)
{
Zz_Value = 0;
Fz_Value = 0;
Motor_A = 0;
Motor_B = 0;
Motor_C = 0;
Motor_D = 0;
}
void Motor_Zz_Function(void)
{
switch(Zz_flag)//八拍
{
case 0 : Motor_A = 1;Motor_B = 0;Motor_C = 0; Motor_D = 0;Zz_flag++;break;//A
case 1 : Motor_A = 1;Motor_B = 1;Motor_C = 0; Motor_D = 0;Zz_flag++;break;//AB
case 2 : Motor_A = 0;Motor_B = 1;Motor_C = 0; Motor_D = 0;Zz_flag++;break;//B
case 3 : Motor_A = 0;Motor_B = 1;Motor_C = 1; Motor_D = 0;Zz_flag++;break;//BC
case 4 : Motor_A = 0;Motor_B = 0;Motor_C = 1; Motor_D = 0;Zz_flag++;break;//C
case 5 : Motor_A = 0;Motor_B = 0;Motor_C = 1; Motor_D = 1;Zz_flag++;break;//CD
case 6 : Motor_A = 0;Motor_B = 0;Motor_C = 0; Motor_D = 1;Zz_flag++;break;//D
case 7 : Motor_A = 1;Motor_B = 0;Motor_C = 0; Motor_D = 1;Zz_flag = 0;break;//DA
default : break;
}
}
void Motor_Fz_Function(void)
{
switch(Fz_flag)
{
case 0 : Motor_A = 1;Motor_B = 0;Motor_C = 0; Motor_D = 1;Fz_flag++;break;//DA
case 1 : Motor_A = 0;Motor_B = 0;Motor_C = 0; Motor_D = 1;Fz_flag++;break;//D
case 2 : Motor_A = 0;Motor_B = 0;Motor_C = 1; Motor_D = 1;Fz_flag++;break;//CD
case 3 : Motor_A = 0;Motor_B = 0;Motor_C = 1; Motor_D = 0;Fz_flag++;break;//C
case 4 : Motor_A = 0;Motor_B = 1;Motor_C = 1; Motor_D = 0;Fz_flag++;break;//BC
case 5 : Motor_A = 0;Motor_B = 1;Motor_C = 0; Motor_D = 0;Fz_flag++;break;//B
case 6 : Motor_A = 1;Motor_B = 1;Motor_C = 0; Motor_D = 0;Fz_flag++;break;//AB
case 7 : Motor_A = 1;Motor_B = 0;Motor_C = 0; Motor_D = 0;Fz_flag=0;break;//A
default : break;
}
}
main文章來源:http://www.zghlxwxcb.cn/news/detail-785514.html
int main()
{
int key = 0;
int arr = 50;
int Motor_flag = 0;
TIM3_init(99,7199);
Motor_Init();
KEY_Init();
Motor_Zz();
while(1)
{
key = Get_Indepedent_Key_Value();
if(key)
{
switch(key)
{
case KEY0_BASE : arr += 10; TIM_SetAutoreload(TIM3,arr);break;
case KEY1_BASE : arr -= 10; TIM_SetAutoreload(TIM3,arr);break;
case KEY_UP_BASE : if(Motor_flag % 2 == 0) Motor_Fz(); else Motor_Zz(); Motor_flag++;break;
default : break;
}
}
}
}
程序源碼
鏈接https://pan.baidu.com/s/1KsX2D5oYvQDmoAIYaDnINQ
提取碼:ettg文章來源地址http://www.zghlxwxcb.cn/news/detail-785514.html
到了這里,關(guān)于基于STM32的步進電機驅(qū)動設計的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!