??資料下載:待更新。。。。
先驅動起來再說,干中學!!!
1、實現功能
STM32同時驅動4個步進電機,支持單獨調速與正反轉控制
需要資源:16個任意IO口+1ms定時器中斷
目錄
- ??資料下載:待更新。。。。
- 先驅動起來再說,干中學!!!
- 1、實現功能
- 一、28BYJ-48 步進電機
- 二、ULN2003 驅動模塊
- 三、STM32 驅動代碼實現
- 3、修改引腳
【28BYJ-48】STM32同4個步進電機正反轉與調速
一、28BYJ-48 步進電機
??28BYJ-48 是一款常見的四相八拍式步進電機,它由定子和轉子兩部分組成。定子上有四組繞組,按照一定的順序通電,就能產生旋轉磁場,吸引轉子轉動。
??其步距角通常為 5.625°/64(約 0.08789°,這里的 64 是八拍驅動方式下細分后的步數),這意味著電機每接收到一個脈沖信號,轉子就會精確地轉動一個微小的角度,通過連續不斷地給脈沖,實現電機的連續旋轉。
電機參數
??工作電壓:一般為 5V - 12V,常見的是 5V 供電,這使得它可以方便地與微控制器(如 STM32)直接配合使用,無需復雜的電壓轉換電路。
??相電阻:每相繞組的電阻值在幾十歐姆到上百歐姆不等,例如典型值約為 200Ω 左右,這個參數影響電機的電流和驅動電路的設計。
??扭矩:它的扭矩相對較小,適用于一些對驅動力要求不高的輕載場合,如小型自動化設備的指針轉動、簡易機器人關節的微調等,一般啟動力矩在 30 - 40gf.cm 左右。
二、ULN2003 驅動模塊
功能概述
??ULN2003 是一個高耐壓、大電流達林頓陣列集成電路,主要用于驅動感性負載,如步進電機、繼電器等。它內部集成了 7 個 NPN 達林頓復合晶體管,在驅動 28BYJ-48 步進電機時,通常只用其中 4 個通道對應電機的四相繞組。
工作原理
??當微控制器(如 STM32)的引腳輸出高電平信號給 ULN2003 的輸入端時,對應的達林頓管導通,將電機繞組與電源接通;當輸入低電平時,達林頓管截止,繞組斷電。通過控制 4 個輸入引腳的電平序列,按照特定的時序給電機繞組通電,就能驅動電機旋轉。
??它還具有續流二極管,當電機繞組斷電時,為繞組產生的感應電動勢提供泄放回路,保護驅動芯片和其他電路元件,防止反向電壓擊穿。
電氣特性
??輸出電流能力:每路輸出可承受最大 500mA 的電流,足以驅動 28BYJ-48 電機,因為該電機在正常運行時每相電流一般在幾十毫安。
??耐壓值:集電極 - 發射極耐壓可達 50V,這為電機在不同電壓供電情況下提供了足夠的電壓裕量,確保可靠工作。
三、STM32 驅動代碼實現
#include "stm32f10x.h" //STM32庫函數的頭文件
#include "timer.h" //STM32定時器
#include "step_motor.h" //步進電機驅動
int main(void) //主函數
{ SystemInit();delay_init();NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 2組中斷分RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOA,ENABLE); //打開GPIO口時鐘,先打開復用才能修改是否停用復用功能GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); //能用PB3,PB4,PA15做普通IO,PA13&14用于SWD調試 TIM2_Int_Init(99,719); //72000000HZ/(99+1)/(719+1)=1000HZ 1ms中斷Step_Motor_Init1();stepmotor_speed1 = 4; //5ms一個脈沖 stepmotor_set1 = -4096; //4096為一圈,設置電機反轉一圈Step_Motor_Init2();stepmotor_speed2 = 3; //4ms一個脈沖stepmotor_set2 = 4096;Step_Motor_Init3();stepmotor_speed3 = 2; //3ms一個脈沖stepmotor_set3 = 4096;Step_Motor_Init4();stepmotor_speed4 = 1; //2ms一個脈沖//速度 360*1000/(1+1)*4096 = 43.965°/sstepmotor_set4 = 4096;while(1){ }
}
void TIM2_IRQHandler(void) //TIM2中斷
{if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) //檢查TIM2更新中斷發生與否{TIM_ClearITPendingBit(TIM2, TIM_IT_Update ); //清除TIMx更新中斷標志stepmotor_run1();stepmotor_run2();stepmotor_run3();stepmotor_run4();}
}
3、修改引腳
??通過宏定義快速修改引腳
/* 步進電機1參數宏 */
/* A相 */
#define LA_GPIO_PORT1 GPIOA
#define LA_GPIO_PIN1 GPIO_Pin_9
#define LA_GPIO_CLK1 RCC_APB2Periph_GPIOA
/* B相 */
#define LB_GPIO_PORT1 GPIOA
#define LB_GPIO_PIN1 GPIO_Pin_10
#define LB_GPIO_CLK1 RCC_APB2Periph_GPIOA
/* C相 */
#define LC_GPIO_PORT1 GPIOA
#define LC_GPIO_PIN1 GPIO_Pin_11
#define LC_GPIO_CLK1 RCC_APB2Periph_GPIOA
/* D相 */
#define LD_GPIO_PORT1 GPIOA
#define LD_GPIO_PIN1 GPIO_Pin_12
#define LD_GPIO_CLK1 RCC_APB2Periph_GPIOA