STM32之28BYJ-48步進電機驅動

目錄

一、引言

二、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? 驅動方案

驅動方案對比:

驅動芯片最大電流特點
ULN2003500mA經濟,適合低速應用
DRV88252.5A支持微步,精度高
A49882A帶過熱保護

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? 驅動原理

相位控制真值表:

步序IN1IN2IN3IN4勵磁相
11000A
21100AB
30100B
..................

電流路徑(以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 接線示意圖

STM32F103C8T6ULN2003驅動板
PB6IN1
PB7IN2
PB8IN3
PB9IN4
GNDGND
5VVCC?

5.2? 電源注意事項

建議為電機驅動單獨供電,避免單片機電源受干擾。

六、軟件設計

6.1 開發環境配置

  1. 安裝Keil MDK-ARM

  2. 安裝STM32標準外設庫

  3. 配置工程包含必要頭文件

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);}
}

九、常見問題解決

電機抖動但不轉動:

  1. 檢查電源是否充足(≥5V/1A)
  2. 驗證步進序列是否正確

  3. 確保接線牢固

轉速達不到預期:

  1. 適當減小minDelay
  2. 檢查ULN2003是否過熱

  3. 確認電機負載是否過大

位置控制不準確:

  1. 增加減速階段時間
  2. 考慮使用閉環控制(如加裝編碼器)

優化建議:

  1. 微步驅動:通過PWM實現更精細的256微步控制

  2. 閉環控制:增加編碼器反饋實現真正的位置閉環

  3. 電流控制:動態調整相電流以降低發熱

十、總結

????????本文詳細介紹了使用STM32F103C8T6控制28BYJ-48步進電機的完整方案,包括硬件連接、軟件實現和運動控制算法。通過合理設置參數,可以實現精確的位置控制和速度調節,滿足大多數小型自動化項目的需求。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/912883.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/912883.shtml
英文地址,請注明出處:http://en.pswp.cn/news/912883.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

TDSQL如何查出某一列中的逗號數量

在 TDSQL 中&#xff0c;要統計某一列里逗號的數量&#xff0c;可借助字符串函數來實現。下面為你介紹具體的實現方法&#xff1a; sql SELECT your_column,LENGTH(your_column) - LENGTH(REPLACE(your_column, ,, )) AS comma_count FROM your_table;下面對這段 SQL 進行詳細…

如何避免服務器出現故障情況?

服務器作為存儲數據信息的重要網絡設備&#xff0c;能夠保護企業重要數據的安全性&#xff0c;但是隨著網絡攻擊的不斷拓展&#xff0c;各個行業中的服務器也會遭受到不同類型的網絡攻擊&#xff0c;嚴重的會導致服務器業務中斷出現故障&#xff0c;給企業帶來巨大的經濟損失。…

C++ 優先級隊列

一、引言 隊列的特性是先進先出。優先級隊列的本質是一個有序隊列&#xff0c;根據成員的優先級&#xff0c;對隊列中的成員進行排序。優先級隊列默認是大頂堆&#xff0c;即堆頂元素最大 二、常用函數 empty()size()top()push()emplace()pop()swap() 三、代碼示例 class …

學習筆記(27):線性回歸基礎與實戰:從原理到應用的簡易入門

線性回歸&#xff1a;通過擬合線性方程&#xff08;如 \(y w_1x_1 w_2x_2 b\)&#xff09;預測房價、銷售額等連續變量&#xff0c;需掌握特征標準化、正則化&#xff08;L1/L2&#xff09;防止過擬合。應用場景&#xff1a;金融領域的股價預測、電商用戶消費金額預估。 線性…

kubesphere安裝openelb

kubesphere安裝openelb 1.安裝openelb 2.修改配置文件 1.命令直接修改 $ kubectl edit configmap kube-proxy -n kube-system ipvs:strictARP: truemode: "ipvs"重啟kube-proxy組件 $ kubectl rollout restart daemonset kube-proxy -n kube-system 2.通過界面去修…

數據庫10:MySQL的數據類型與約束和屬性設置,數據模式

一.數據類型 整數類型&#xff08;integer types&#xff09; 數據類型字節有符號范圍無符號范圍說明tinyint1-128 ~ 1270 ~ 255非常小的整數smallint2-32,768 ~ 32,7670 ~ 65,535小整數mediumint3-8,388,608 ~ 8,388,6070 ~ 16,777,215中等整數int4-2,147,483,648 ~ 2,147,4…

uniapp項目中node_modules\sass\sass.dart.js的體積過大怎么處理

用Node-Sass替代&#xff08;如果適用&#xff09;&#xff1a;雖然Dart Sass是Sass的主要實現之一&#xff0c;但有時它可能會比Node-Sass占用更多的空間。如果你不需要Dart Sass特有的功能&#xff0c;可以考慮切換到Node-Sass&#xff08;注意Node-Sass已停止維護&#xff0…

界面組件DevExpress WPF中文教程:Grid - 如何獲取節點?

DevExpress WPF擁有120個控件和庫&#xff0c;將幫助您交付滿足甚至超出企業需求的高性能業務應用程序。通過DevExpress WPF能創建有著強大互動功能的XAML基礎應用程序&#xff0c;這些應用程序專注于當代客戶的需求和構建未來新一代支持觸摸的解決方案。 無論是Office辦公軟件…

Kalibr解毒填坑(一):相機標定失敗

文章目錄 ??簡介?? 解毒踩坑?? 主點錯誤??簡介 相機內參標定通常涉及確定焦距(fx, fy)、主點(cx, cy)、畸變系數(徑向和切向)等參數。Kalibr是一個開源的標定工具,支持多相機、IMU和聯合標定,適用于復雜的傳感器系統。 但kalibar標定相機內參受到數據和配置影…

Swift 的基礎設計哲學是 “通過模塊化組合實現安全與效率的平衡“,就像用標準化工業零件建造摩天大樓

一、基礎模塊&#xff1a;地基與鋼結構&#xff08;Basic Types & Collections&#xff09; 比喻&#xff1a;積木與工具箱&#xff0c;決定建筑的穩定性和容量。場景&#xff1a;搭建程序的基礎結構&#xff0c;如變量、數據類型、運算符。包含&#xff1a;基本語法、運算…

【RK3568+PG2L50H開發板實驗例程】Linux部分/FPGA dma_memcpy_demo 讀寫案例

本原創文章由深圳市小眼睛科技有限公司創作&#xff0c;版權歸本公司所有&#xff0c;如需轉載&#xff0c;需授權并注明出處&#xff08;www.meyesemi.com) 1.案例簡介 案例功能描述&#xff1a;ARM端利用 PCIe總線對 FPGA的 DRAM執行讀寫操作。應用程序通過 ioctl函數觸發 …

7.3實驗部分

一、HDFS基礎操作 以root用戶登錄&#xff0c;創建如下HDFS目錄&#xff1a; /dw/yourname/input hadoop fs -mkdir -p /dw/zhanggengchen/input /dw/yourname/output hadoop fs -mkdir -p /dw/zhanggengchen/output 輸出結果&#xff1a; [rootmaster hadoop-mapreduce]# ha…

[nett5: AddressedEnvelope]-源碼解析

AddressedEnvelope AddressedEnvelope<M, A> 表示一個帶有發送者和接收者地址的消息封裝&#xff0c;常用于處理如 UDP 數據報這類含地址信息的通信場景。 public interface AddressedEnvelope<M, A extends SocketAddress> {// 實際的消息內容M content();// 消…

基于 Drone CI 實現前端自動化打包并集成 Spug 自動發布流程

前言&#xff1a;代碼自動化部署目前使用的是Spug開源運維平臺&#xff0c;通過docker直接部署該平臺后&#xff0c;在前端自動化打包&#xff08;npm run build&#xff09;會遇見Node的版本問題&#xff0c;因為Spug容器使用的是Centos7&#xff0c;所以Node版本只支持V16&am…

【基礎】Golang語言開發環境搭建(Linux主機)

目錄 1. 下載并安裝Go語言2. 配置環境變量3. 驗證安裝4. 配置Go模塊5. 安裝常用開發工具6. 配置IDE&#xff08;可選&#xff09;7. 第一個Go程序 在Linux主機上搭建Golang開發環境&#xff0c;你可以按照以下步驟進行操作&#xff1a; 1. 下載并安裝Go語言 首先從官網下載Go…

MySQL安全加固:使用mysql_secure_installation

在安裝MySQL后&#xff0c;為了確保服務器的安全性&#xff0c;建議使用mysql_secure_installation工具對MySQL進行安全加固。這個工具可以幫助我們完成一些關鍵的安全配置&#xff0c;包括設置強密碼、移除匿名用戶、限制root用戶的遠程登錄以及清理默認的測試數據庫等。以下是…

設計模式之中介者模式 (Mediator Pattern) -聊天室-控制室

中介者模式用于減少多個對象之間的直接通信&#xff0c;而是通過一個中介對象來協調它們之間的交互。下面我用一個聊天室的例子來演示這個模式。 舉個栗子&#xff1a;聊天室系統 在這個系統中&#xff0c;用戶不直接相互發送消息&#xff0c;而是通過聊天室&#xff08;中介者…

SpringSecurity01

目錄 一、權限控制 二、相關框架 1、shiro 2、springsecurity 三、springsecurity使用流程 1、搭建環境實現默認用戶名和密碼登錄 2、使用數據庫表中定義好的用戶名和密碼訪問實現等值密碼匹配 1&#xff09;sql文件 2)搭建jdbc或者mybatis或者mybatis-plus環境 3&am…

解決git clone報錯:fatal unable to access xxx. Could not resolve host github.com

作者&#xff1a;唐叔在學習 專欄&#xff1a;問題百寶箱 文章目錄 問題描述問題診斷網絡連通性測試 解決方案1. 獲取GitHub最新IP地址2. 修改系統hosts文件 驗證解決方案常見問題解答總結 問題描述 當使用git clone命令克隆GitHub倉庫時&#xff0c;可能會遇到如下錯誤&#…

魔術方法__call__

__call__ 是一個特殊方法&#xff08;也稱為魔術方法&#xff09;&#xff0c;用于使一個類的實例能夠像函數一樣被調用。當定義了這個方法后&#xff0c;實例對象可以后接括號&#xff08;即 ()&#xff09;來觸發調用&#xff0c;這會讓實例表現得像函數一樣。 ?使實例可調…