目錄
一、引言
二、28BYJ-48步進電機簡介
2.1? 基本特性
2.2? 內部結構
2.3? 工作模式
2.4? 驅動原理
2.5? 性能特點
2.6? 驅動方案
2.7? 使用注意事項
三、ULN2003驅動板簡介
3.1? 基本概述
3.2? 電路結構
3.3? 驅動原理
3.4? 接口定義
3.5? 使用注意事項
四、硬件準備
五、硬件連接
5.1 接線示意圖
5.2? 電源注意事項
六、軟件設計
6.1 開發環境配置
6.2 關鍵代碼實現
6.2.1 引腳定義與初始化
6.2.2 步進序列定義
6.2.3 定時器配置(TIM4)
6.2.4 運動控制核心邏輯
七、功能實現
7.1? 基本運動控制
7.2? 速度控制
7.3? 加減速控制
八、應用示例
8.1 簡單測試程序
8.2 帶加減速的位置控制
九、常見問題解決
十、總結
一、引言
????????28BYJ-48步進電機因其價格低廉、控制簡單等特點,在各類小型自動化項目中廣泛應用。本文將詳細介紹如何使用STM32F103C8T6單片機通過ULN2003驅動芯片控制這種步進電機,實現正反轉、調速和精確位置控制。
二、28BYJ-48步進電機簡介
2.1? 基本特性
電機類型:
- 永磁式步進電機(Unipolar)
- 內置1:64減速齒輪箱
電氣參數:
-
額定電壓:5V DC
-
相電流:約100-120mA/相
-
線圈電阻:50Ω/相
-
驅動方式:單極性驅動(ULN2003驅動板兼容)
機械參數:
-
步距角:5.625°(原始步距)
-
減速后步距角:5.625°/64 ≈ 0.0879°
-
輸出軸轉速范圍:0-15 RPM(建議工作范圍)
電機圖片:
2.2? 內部結構
電磁部分:
-
4相8極繞組結構
-
每組線圈中心抽頭接正極
齒輪箱結構:
-
四級行星齒輪減速
-
總減速比1:64
-
輸出軸扭矩:≥34.3mN·m(5V時)
2.3? 工作模式
模式 | 步數/轉 | 步距角 | 特點 |
---|---|---|---|
全步(單相) | 64步 | 5.625° | 低分辨率,振動較大 |
全步(雙相) | 64步 | 5.625° | 扭矩大,功耗高 |
半步 | 128步 | 2.8125° | 分辨率提高,運行更平穩 |
8步微步 | 512步 | 0.703° | 最高分辨率,需專用驅動 |
2.4? 驅動原理
勵磁順序(以全步雙相為例):
// 4相8拍驅動序列
const uint8_t seq[8] = {0b1000, // A0b1100, // A+B0b0100, // B0b0110, // B+C0b0010, // C0b0011, // C+D0b0001, // D0b1001 // D+A
};
轉速計算:?
例:每秒683脈沖 → 10 RPM (轉每分鐘)
2.5? 性能特點
優點:
-
價格低廉
-
驅動電路簡單(ULN2003即可)
-
低速大扭矩輸出
-
保持轉矩大(斷電后能保持位置)
局限性:
-
最高轉速較低(通常<15RPM)
-
齒輪箱存在回程差(約3°)
-
長時間工作可能發熱
2.6? 驅動方案
驅動方案對比:
驅動芯片 | 最大電流 | 特點 |
---|---|---|
ULN2003 | 500mA | 經濟,適合低速應用 |
DRV8825 | 2.5A | 支持微步,精度高 |
A4988 | 2A | 帶過熱保護 |
2.7? 使用注意事項
電氣保護:
-
反接保護二極管必接
-
避免長時間堵轉(>2秒)
機械安裝:
-
輸出軸避免徑向受力
-
齒輪箱需定期潤滑(硅脂)
????????該電機特別適合學生項目和原型開發,其優異的性價比使其成為入門級運動控制的首選。實際使用時建議配合光電編碼器實現閉環控制以提升精度。
三、ULN2003驅動板簡介
3.1? 基本概述
????????ULN2003驅動板是專為28BYJ-48等小型步進電機設計的低成本驅動模塊,核心采用ULN2003達林頓陣列芯片,具有以下特性:
關鍵參數:
-
工作電壓:5-12V(與電機電壓匹配)
-
單路最大電流:500mA
-
總功耗:1.5W(需配合散熱片)
-
輸入兼容性:3.3V/5V邏輯電平
板載資源:
-
4路LED指示燈(顯示相位狀態)
-
反接保護二極管
-
電機接口防插反設計
-
5.08mm間距接線端子
UNL2003驅動板示意圖:
ULN2003原理圖:?
3.2? 電路結構
核心芯片:
ULN2003包含7路達林頓管(實際使用4路)。
典型應用電路:
3.3? 驅動原理
相位控制真值表:
步序 | IN1 | IN2 | IN3 | IN4 | 勵磁相 |
---|---|---|---|---|---|
1 | 1 | 0 | 0 | 0 | A |
2 | 1 | 1 | 0 | 0 | AB |
3 | 0 | 1 | 0 | 0 | B |
... | ... | ... | ... | ... | ... |
電流路徑(以A相為例):
5V -> 線圈A -> ULN2003_OUT1 -> 達林頓管 -> GND
3.4? 接口定義
引腳標號 | 功能說明 | 連接目標 |
---|---|---|
IN1-IN4 | 相位控制輸入 | MCU GPIO |
VCC | 邏輯電源(可選) | MCU 5V |
GND | 公共地 | 電源地 |
A-D | 電機相線輸出 | 28BYJ-48對應相線 |
3.5? 使用注意事項
電源配置:
當電機電壓>5V時,建議:
- ? ? 邏輯電源(VCC)接MCU
- ? ? 5V電機電源單獨供電
保護措施:
-
電機斷電時產生的反電動勢可能達30V,必須保留板載續流二極管
-
長時間工作需監測芯片溫度(>70℃應停止使用)
典型問題處理:
-
電機抖動不轉:檢查相位順序是否正確
-
驅動芯片發燙:
? ? ? ? (1)降低PWM頻率(建議<2kHz)
? ? ? ? (2)增加散熱片
四、硬件準備
所需材料:
-
STM32F103C8T6最小系統板
-
28BYJ-48步進電機(帶ULN2003驅動板)
-
杜邦線若干
-
USB轉TTL模塊(用于程序下載)
-
電源(5V/2A)
五、硬件連接
5.1 接線示意圖
STM32F103C8T6 | ULN2003驅動板 |
PB6 | IN1 |
PB7 | IN2 |
PB8 | IN3 |
PB9 | IN4 |
GND | GND |
5V | VCC? |
5.2? 電源注意事項
建議為電機驅動單獨供電,避免單片機電源受干擾。
六、軟件設計
6.1 開發環境配置
-
安裝Keil MDK-ARM
-
安裝STM32標準外設庫
-
配置工程包含必要頭文件
6.2 關鍵代碼實現
6.2.1 引腳定義與初始化
// 引腳定義
#define IN1_PIN GPIO_Pin_6
#define IN2_PIN GPIO_Pin_7
#define IN3_PIN GPIO_Pin_8
#define IN4_PIN GPIO_Pin_9
#define MOTOR_PORT GPIOB// GPIO初始化
void GPIO_Init(void) {GPIO_InitTypeDef GPIO_InitStruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitStruct.GPIO_Pin = IN1_PIN | IN2_PIN | IN3_PIN | IN4_PIN;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(MOTOR_PORT, &GPIO_InitStruct);
}
6.2.2 步進序列定義
// 8步驅動序列(更高精度)
const uint8_t stepSequence[8] = {0b1000, // A0b1100, // AB0b0100, // B0b0110, // BC0b0010, // C0b0011, // CD0b0001, // D0b1001 // DA
};
6.2.3 定時器配置(TIM4)
void TIM4_Init(void) {TIM_TimeBaseInitTypeDef TIM_InitStruct;NVIC_InitTypeDef NVIC_InitStruct;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);// 1MHz計數頻率(1μs分辨率)TIM_InitStruct.TIM_Period = 1000; // 初始ARR值TIM_InitStruct.TIM_Prescaler = SystemCoreClock/1000000 - 1;TIM_InitStruct.TIM_ClockDivision = 0;TIM_InitStruct.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInit(TIM4, &TIM_InitStruct);TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);NVIC_InitStruct.NVIC_IRQChannel = TIM4_IRQn;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStruct);TIM_Cmd(TIM4, ENABLE);
}
6.2.4 運動控制核心邏輯
// 全局變量
volatile int32_t stepPosition = 0;
volatile int32_t targetSteps = 0;
volatile uint32_t stepDelay = 2000; // 初始延遲2000μs
volatile int8_t direction = 1;// 設置電機相位
void SetMotorPhase(uint8_t phase) {GPIO_WriteBit(MOTOR_PORT, IN1_PIN, (phase & 0x08) ? Bit_SET : Bit_RESET);GPIO_WriteBit(MOTOR_PORT, IN2_PIN, (phase & 0x04) ? Bit_SET : Bit_RESET);GPIO_WriteBit(MOTOR_PORT, IN3_PIN, (phase & 0x02) ? Bit_SET : Bit_RESET);GPIO_WriteBit(MOTOR_PORT, IN4_PIN, (phase & 0x01) ? Bit_SET : Bit_RESET);
}// 定時器中斷服務函數
void TIM4_IRQHandler(void) {static uint8_t currentPhase = 0;if (TIM_GetITStatus(TIM4, TIM_IT_Update)) {TIM_ClearITPendingBit(TIM4, TIM_IT_Update);if ((direction > 0 && stepPosition < targetSteps) || (direction < 0 && stepPosition > targetSteps)) {currentPhase = (currentPhase + direction + 8) % 8;SetMotorPhase(stepSequence[currentPhase]);stepPosition += direction;// 更新定時器TIM_SetAutoreload(TIM4, stepDelay);TIM_SetCounter(TIM4, 0);} else {SetMotorPhase(0x00); // 停止電機}}
}
七、功能實現
7.1? 基本運動控制
// 相對移動
void MoveSteps(int32_t steps) {targetSteps = stepPosition + steps;direction = (steps > 0) ? 1 : -1;
}// 絕對移動
void MoveToPosition(int32_t position) {targetSteps = position;direction = (position > stepPosition) ? 1 : -1;
}
7.2? 速度控制
// 設置轉速(RPM)
void SetSpeed(float rpm) {// RPM轉步進延遲(μs)uint32_t delay = (60 * 1000000) / (4096 * rpm);// 限制在合理范圍if (delay < 800) delay = 800; // 最大約15RPMif (delay > 10000) delay = 10000; // 最小約1.46RPMstepDelay = delay;
}
7.3? 加減速控制
// 梯形加減速控制
void UpdateSpeed(void) {static uint32_t acceleration = 100; // 加速度步/秒2int32_t remainingSteps = abs(targetSteps - stepPosition);// 加速階段(前1/3路程)if (remainingSteps > (2 * totalSteps / 3)) {if (stepDelay > minDelay + acceleration) {stepDelay -= acceleration;}} // 減速階段(后1/3路程)else if (remainingSteps < (totalSteps / 3)) {if (stepDelay < maxDelay - acceleration) {stepDelay += acceleration;}}
}
八、應用示例
8.1 簡單測試程序
實現正轉一圈然后反轉一圈循環。
int main(void) {SystemInit();GPIO_Init();TIM4_Init();// 設置轉速為10RPMSetSpeed(10.0);while(1) {// 正轉1圈MoveSteps(4096);while(stepPosition < targetSteps);Delay_ms(1000);// 反轉1圈MoveSteps(-4096);while(stepPosition > targetSteps);Delay_ms(1000);}
}
8.2 帶加減速的位置控制
可設置目標位置以及速度。
void ControlledMove(int32_t target, float speed) {SetSpeed(speed);MoveToPosition(target);while(stepPosition != target) {UpdateSpeed(); // 實時更新速度Delay_ms(1);}
}
九、常見問題解決
電機抖動但不轉動:
- 檢查電源是否充足(≥5V/1A)
-
驗證步進序列是否正確
-
確保接線牢固
轉速達不到預期:
- 適當減小minDelay
-
檢查ULN2003是否過熱
-
確認電機負載是否過大
位置控制不準確:
- 增加減速階段時間
-
考慮使用閉環控制(如加裝編碼器)
優化建議:
-
微步驅動:通過PWM實現更精細的256微步控制
-
閉環控制:增加編碼器反饋實現真正的位置閉環
-
電流控制:動態調整相電流以降低發熱
十、總結
????????本文詳細介紹了使用STM32F103C8T6控制28BYJ-48步進電機的完整方案,包括硬件連接、軟件實現和運動控制算法。通過合理設置參數,可以實現精確的位置控制和速度調節,滿足大多數小型自動化項目的需求。