單片機-STM32部分:15、直流電機與步進電機 PWM/IO

飛書文檔https://x509p6c8to.feishu.cn/wiki/InUfwEeJNimqctkyW1mcImianLh

一、步進電機與直流電機:

1-1、什么是直流電機?

直流電機是最常見的電機類型。直流電動機通常只有兩個引線,一個正極和一個負極。直流電機的轉速控制主要依靠改變輸入電壓的大小來實現,電壓越高,電機轉速越快。

1-2、什么是步進電機?

步進電機是一種將電脈沖信號轉換成相應角位移的電機,每個脈沖使電機轉動一個固定的角度(步進角),它可以實現更精準的位置控制。

1-3、直流電機與步進電機的對比:

直流電機:

優點:價格低、控制方便
缺點:精確的位置控制相對困難,除非采用額外的編碼器反饋

步進電機:

優點:低速扭矩大,控制更精準;
缺點:成本相對高,轉速相對較低。

二、思考?為什么STM32芯片引腳不能直接接步進電機或直流電機?但可以直接接舵機?

這要從舵機的構造說起,控制芯片+電機組成,stm32實際接的是控制芯片引腳,而不是電機本身。

而步進電機和直流電機內部是沒有控制芯片的,如果使用stm32直接接電機,因為stm32芯片引腳驅動能力弱而驅動不起甚至損壞芯片,stm32每個IO的最大電流為40mA,一般步進電機跑起來可能需要幾百mA到幾A。

驅動能力可以理解為引腳的可以輸出的力氣,如果力氣過小,當然推不動電機運行。

三、如何提升驅動能力呢?

下圖就是應用三極管的開關功能,使芯片IO的驅動能力提高。

上圖可以簡單理解為三極管開關電路,通過控制輸入口的電平高低,就可以控制后端電路的開啟關閉。

四、直流電機的控制?

4-1、控制轉/

4-2、控制轉速

直流電機的速度可以通過改變其輸入電壓來控制,使用單片機控制轉速可以通過PWM控制。

PWM是一種通過發送一系列ON-OFF脈沖來調整輸入電壓平均值的技術。該平均電壓與脈沖的寬度成正比,稱為占空比。

占空比越高,施加到直流電機的平均電壓就越高,從而導致電機速度增加。占空比越短,施加到直流電機的平均電壓越低,導致電機速度降低。

下圖顯示了具有各種占空比和平均電壓的PWM技術。

4-3、控制方向

前面我們都只是控制電機往一個方向轉動,如果需要更換方向,就需要重新接線,那如果需要自動控制電機的正反轉呢?這就需要升級下電路。

下面電路被稱為H橋,是因為它使用四個晶體管連接,使示意圖看起來像一個“H”。

為了控制直流電機的旋轉方向,無需互換引線,可以使用稱為H的電路。H橋是可以雙向驅動電機的電子電路。H橋用于許多不同的應用中。最常見的應用之一是控制機器人中的電機。

如果需要使用多個三極管,一個一個連接太麻煩了,有沒有更好的方式呢?當然有,L293D、L298、和課程用的TC118S都是集成H橋的芯片。

直流驅動芯片TC118S

https://item.szlcsc.com/89487.html

應用電路圖

原理圖:

新建工程,設置PB14 PB15為GPIO輸出

修改IO名稱為DC_AN1、DC_AN2,這里PB14命名應該是DC_AN1,PB15應該是DC_AN2,不過這個命名錯不影響控制效果,只影響電機旋轉方向,大家留意下即可。

方向控制:

main.cwhile (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 *///正轉HAL_GPIO_WritePin(GPIOB,DC_AN1_Pin,GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOB,DC_AN2_Pin,GPIO_PIN_RESET);HAL_Delay(5000);//停止HAL_GPIO_WritePin(GPIOB,DC_AN1_Pin,GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOB,DC_AN2_Pin,GPIO_PIN_RESET);HAL_Delay(5000);//反轉HAL_GPIO_WritePin(GPIOB,DC_AN1_Pin,GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOB,DC_AN2_Pin,GPIO_PIN_SET);HAL_Delay(5000);//停止HAL_GPIO_WritePin(GPIOB,DC_AN1_Pin,GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOB,DC_AN2_Pin,GPIO_PIN_RESET);HAL_Delay(5000);}/* USER CODE END 3 */

速度控制:

如果需要對直流電機進行速度控制,我們可以使用PWM,我們可以在STM32CUBEMX中看到PB15是支持綁定TIM1_CH3N這個通道的

TIM1_CH3N與TIM1_CH3為互補輸出,例如黃色是TIM1_CH3,TIM1_CH3N則為藍色部分


?

設置完成后,IO變為黃色
?

我們在左側設置TIM1的CH3N為PWM模式即可

需要注意的是:
普通PWM開啟的函數為
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_3);
CH3N由于是高級定時器才有的通道,開啟函數為:
HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_3);

最終代碼

main.c/* USER CODE BEGIN 2 */uint16_t pwm_value = 0;?? //占空比?HAL_TIMEx_PWMN_Start(&htim1,TIM_CHANNEL_3); //開啟PWM輸出HAL_GPIO_WritePin(GPIOB,DC_AN2_Pin,GPIO_PIN_RESET); //設置DC_AN2為低,只保持一個方向轉動/* USER CODE END 2 */while (1){/* USER CODE BEGIN 3 */while (pwm_value < 150){pwm_value++;//修改比較值,修改占空比,占空比為pwm_value/500__HAL_TIM_SetCompare(&htim1, TIM_CHANNEL_3, pwm_value);???HAL_Delay(10);}HAL_Delay(1000);while (pwm_value){pwm_value--;__HAL_TIM_SetCompare(&htim1, TIM_CHANNEL_3, pwm_value);??HAL_Delay(10);}HAL_Delay(1000);}/* USER CODE END 3 */

參考工程:參考飛書文檔

五、步進電機的控制?

右手法則

步進電機工作原理

步進電機的基本工作原理為:給一個或多個定子相位通電,線圈中通過的電流會產生磁場,而轉子會與該磁場對齊;依次給不同的相位施加電壓,轉子將旋轉特定的角度并最終到達需要的位置。

步進電機中間的轉子是一個磁鐵,周圍線圈在通電時會形成磁場,然后把轉子吸過來,如果周圍線圈按照一定的順序逐個通電斷電時,轉子就會被帶動轉起來。

電機類型

步進電機又分為單極性的步進電機和雙極性的步進電機

其中左側為單極性步進電機,右側為雙極性的步進電機。

單雙極性是指一個步進電機里面有幾種電流的流向
單極性是指電機線圈只有一個方向的電流流向。
雙極性是指電機線圈有兩個電流的回路。

單級性電機驅動

下圖是單極性步進電機整步旋轉的過程,其中,在圖示中分為5根線,分別為A、B、C、D和公共端(+),公共端需要一直通電, 剩下ABCD相中只要有一個相通電,即可形成回路產生磁場,圖中的通電順序為A->B->C->D,即可完成上圖中的順時針旋轉, 如果想要逆時針旋轉只需要將其倒序即可。

雙極性的步進電機

下圖是一個雙極性的步進電機整步,步進順序。 在第一步中:將A相通電,根據電磁鐵原理,產生磁性,并且因異性相吸,所以磁場將轉子固定在第一步的位置; 第二步:當A相關閉,B相通電時,轉子會旋轉90°; 第三步:B相關閉、A相通電,但極性與第1步相反,這促使轉子再次旋轉90°。 在第四步中:A相關閉、B相通電,極性與第2步相反。重復該順序促使轉子按90°的步距角順時針旋轉。

滿步驅動:

單拍滿步驅動??????????????????????????????????????????????? 雙拍滿步驅動
?

半步驅動:

半步驅動的好處是提高分辨率,但是缺點是扭矩只有滿步驅動的70%,當然,也可以通過優化線圈中電流大小,來提高半步驅動扭矩。

總結:

步距角:改變一次通電狀態(或者說一個脈沖信號)電機轉子對應轉過的角度。θ=360°/(z*n),θ是步距角,z是轉子齒數,n是工作拍數。
在非超載情況下,電機的轉速和停止位置只取決于控制脈沖信號的頻率和脈沖數;
脈沖數越多,轉動角度越大;頻率越高,轉動速度越快(不能超過電機規定的最高頻率)。
42步進電機

這里的42一般指電機的安裝尺寸42mm*42mm,同理,還有28、35、57、60,一般來說尺寸和扭矩成正比

  • 兩相:2組線圈
  • 步距角:每走一步的角度為1.8度

步進驅動芯片BDR6622T

https://item.szlcsc.com/769389.html

芯片框圖

內部一個橋的框圖:

控制:

  1. 半步模式:1-4步
  2. 滿步模式:1-8步

有了上面的理論基礎后

我們可以編寫代碼用全步或半步控制步進電機了,

接線說明

綠色A-
黑色A+
藍色B-
紅色B+

參考代碼如下

main.c/* USER CODE BEGIN 0 */void motor_run(uint8_t direction,uint8_t step){if(direction == 0){//正轉switch(step){case 0:HAL_GPIO_WritePin(AN1_GPIO_Port,AN1_Pin,GPIO_PIN_SET);HAL_GPIO_WritePin(BN1_GPIO_Port,BN1_Pin,GPIO_PIN_SET);HAL_GPIO_WritePin(AN2_GPIO_Port,AN2_Pin,GPIO_PIN_RESET);HAL_GPIO_WritePin(BN2_GPIO_Port,BN2_Pin,GPIO_PIN_RESET);break;case 1:HAL_GPIO_WritePin(AN1_GPIO_Port,AN1_Pin,GPIO_PIN_RESET);HAL_GPIO_WritePin(BN1_GPIO_Port,BN1_Pin,GPIO_PIN_SET);HAL_GPIO_WritePin(AN2_GPIO_Port,AN2_Pin,GPIO_PIN_SET);HAL_GPIO_WritePin(BN2_GPIO_Port,BN2_Pin,GPIO_PIN_RESET);break;case 2:HAL_GPIO_WritePin(AN1_GPIO_Port,AN1_Pin,GPIO_PIN_RESET);HAL_GPIO_WritePin(BN1_GPIO_Port,BN1_Pin,GPIO_PIN_RESET);HAL_GPIO_WritePin(AN2_GPIO_Port,AN2_Pin,GPIO_PIN_SET);HAL_GPIO_WritePin(BN2_GPIO_Port,BN2_Pin,GPIO_PIN_SET);break;case 3:HAL_GPIO_WritePin(AN1_GPIO_Port,AN1_Pin,GPIO_PIN_SET);HAL_GPIO_WritePin(BN1_GPIO_Port,BN1_Pin,GPIO_PIN_RESET);HAL_GPIO_WritePin(AN2_GPIO_Port,AN2_Pin,GPIO_PIN_RESET);HAL_GPIO_WritePin(BN2_GPIO_Port,BN2_Pin,GPIO_PIN_SET);break;}}else{//反轉switch(step){case 0:HAL_GPIO_WritePin(AN1_GPIO_Port,AN1_Pin,GPIO_PIN_SET);HAL_GPIO_WritePin(BN1_GPIO_Port,BN1_Pin,GPIO_PIN_RESET);HAL_GPIO_WritePin(AN2_GPIO_Port,AN2_Pin,GPIO_PIN_RESET);HAL_GPIO_WritePin(BN2_GPIO_Port,BN2_Pin,GPIO_PIN_SET);break;case 1:HAL_GPIO_WritePin(AN1_GPIO_Port,AN1_Pin,GPIO_PIN_RESET);HAL_GPIO_WritePin(BN1_GPIO_Port,BN1_Pin,GPIO_PIN_RESET);HAL_GPIO_WritePin(AN2_GPIO_Port,AN2_Pin,GPIO_PIN_SET);HAL_GPIO_WritePin(BN2_GPIO_Port,BN2_Pin,GPIO_PIN_SET);break;case 2:HAL_GPIO_WritePin(AN1_GPIO_Port,AN1_Pin,GPIO_PIN_RESET);HAL_GPIO_WritePin(BN1_GPIO_Port,BN1_Pin,GPIO_PIN_SET);HAL_GPIO_WritePin(AN2_GPIO_Port,AN2_Pin,GPIO_PIN_SET);HAL_GPIO_WritePin(BN2_GPIO_Port,BN2_Pin,GPIO_PIN_RESET);break;case 3:HAL_GPIO_WritePin(AN1_GPIO_Port,AN1_Pin,GPIO_PIN_SET);HAL_GPIO_WritePin(BN1_GPIO_Port,BN1_Pin,GPIO_PIN_SET);HAL_GPIO_WritePin(AN2_GPIO_Port,AN2_Pin,GPIO_PIN_RESET);HAL_GPIO_WritePin(BN2_GPIO_Port,BN2_Pin,GPIO_PIN_RESET);break;}}}void runstep(){uint8_t direction = 0;int step = 500;for(int i = 0;i < step ;i++){motor_run(direction,i%4);HAL_Delay(1);}HAL_GPIO_WritePin(AN1_GPIO_Port,AN1_Pin,GPIO_PIN_RESET);HAL_GPIO_WritePin(BN1_GPIO_Port,BN1_Pin,GPIO_PIN_RESET);HAL_GPIO_WritePin(AN2_GPIO_Port,AN2_Pin,GPIO_PIN_RESET);HAL_GPIO_WritePin(BN2_GPIO_Port,BN2_Pin,GPIO_PIN_RESET);}
/* USER CODE END 0 *//* USER CODE BEGIN 2 */runstep();/* USER CODE END 2 *///改變runstep()中的direction就是改變方向,改變step就是改變步數。

示例工程

參考飛書文檔

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

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

相關文章

「佰傲再生醫學」攜手企企通,解鎖企業采購供應鏈數字化新體驗

健康&#xff0c;是人類美好生活的基石。隨著“健康中國2030”規劃的深入推進&#xff0c;生物醫藥和再生醫學等前沿技術快速崛起&#xff0c;已成為促進全民健康、提升生命質量的重要支撐&#xff0c;為健康事業注入了新的希望和動力。 一、佰傲再生醫學&#xff0c;讓每個人…

PyTorch Geometric(PyG):基于PyTorch的圖神經網絡(GNN)開發框架

PyTorch Geometric&#xff08;PyG&#xff09;&#xff1a;基于PyTorch的圖神經網絡&#xff08;GNN&#xff09;開發框架 一、PyG核心功能全景圖 PyTorch Geometric&#xff08;PyG&#xff09;是基于PyTorch的圖神經網絡&#xff08;GNN&#xff09;開發框架&#xff0c;專…

亮相戛納電影節、北京電影節的影星

?17日&#xff0c;由高圓圓、古天樂主演的《風林火山》劇組&#xff0c;在第78屆戛納影展上走紅毯亮相&#xff0c;記者爭相拍照&#xff0c;風光無限。 值得關注的是&#xff0c;導演麥浚龍以一身黑色晚禮服踏上紅毯&#xff0c;微笑間顯得躊躇滿志&#xff1b;古天樂則以白色…

Django框架的前端部分使用Ajax請求一

Ajax請求 目錄 1.ajax請求使用 2.增加任務列表功能(只有查看和新增) 3.代碼展示集合 這篇文章, 要開始講關于ajax請求的內容了。這個和以前文章中寫道的Vue框架里面的axios請求, 很相似。后端代碼, 會有一些細節點, 跟前幾節文章寫的有些區別。 一、ajax請求使用 我們先…

IP地址代理公司:服務模式與行業應用探析

隨著數據驅動型經濟的快速發展和互聯網應用的普及&#xff0c;IP地址代理服務逐漸成為支持多種網絡業務的重要組成部分。近年來&#xff0c;提供代理IP服務的公司遍地開花&#xff0c;這一市場強調供給的技術深度和服務靈活性&#xff0c;而代理IP公司本身也逐步從單一的技術供…

C語言練手磨時間

167. 兩數之和 II - 輸入有序數組 給你一個下標從 1 開始的整數數組 numbers &#xff0c;該數組已按 非遞減順序排列 &#xff0c;請你從數組中找出滿足相加之和等于目標數 target 的兩個數。如果設這兩個數分別是 numbers[index1] 和 numbers[index2] &#xff0c;則 1 <…

本地部署Firecrawl+Dify調用踩坑記錄

最近自己研究Dify&#xff0c;使用到Firecrawl這個比較好用的工具。用Firecrawl官網的不知道為什么總是卡住得不到結果&#xff0c;于是我打算自己去本地部署一個。好家伙真給我人搞麻了&#xff0c;太多問題了。 我是在京東云上面租的一臺服務器。 首先就是docker的安裝&…

iOS SwiftUI的具體運用實例(SwiftUI庫的運用)

最近接觸到一個 SwiftUI的第三方框架&#xff0c;它非常的好用。以下是 具體運用實例&#xff0c;結合其核心功能與開發場景&#xff0c;分多個維度進行詳細解析&#xff1a; 一、基礎 UI 組件開發 登錄界面 SwiftUI 的 VStack、TextField 和 Button 可快速構建用戶登錄表單。例…

【C++】模板上(泛型編程) —— 函數模板與類模板

文章目錄 一、啥是泛型編程二、函數模板2.1、函數模板的概念2.2、函數模板的格式2.3、函數模板的原理2.4、函數模板的實例化2.4.1、隱式實例化&#xff1a;讓編譯器根據實參推演模板參數的實際類型2.4.2、顯示實例化&#xff1a;在函數名后的<>中指定模板參數的實際類型 …

語音識別-2

目錄 1.藍牙優化 1.打開sco 2.外放時的藍牙的不同版本適配 2.微軟文本轉語音優化 1.異步文本轉語音 2.語音的個性化 上一篇關于語音識別, 雖然能用,但在系統適配,機器適配方面,速度,性能等還是有優化的地方.所以這篇是關于這些的. 1.藍牙優化 A2DP:是一種單向的高品質音…

【springcloud學習(dalston.sr1)】服務消費者通過restTemplate來訪問服務提供者(含源代碼)(五)

該系列項目整體介紹及源代碼請參照前面寫的一篇文章??????【springcloud學習(dalston.sr1)】項目整體介紹&#xff08;含源代碼&#xff09;&#xff08;一&#xff09; springcloud學習&#xff08;dalston.sr1&#xff09;系統文章匯總如下&#xff1a; 【springcloud…

小白學編程之——數據庫如何性能優化

小白學編程之——數據庫性能優化指南 數據庫如同一個大型倉庫&#xff0c;性能優化就是幫助倉庫管理員&#xff08;數據庫&#xff09;更高效地存取貨物&#xff08;數據&#xff09;。本文將以通俗易懂的方式&#xff0c;帶你避開常見誤區&#xff0c;讓數據庫運行得更快更穩…

SQLMesh信號機制詳解:如何精準控制模型評估時機

SQLMesh的信號機制為數據工程師提供了更精細的模型評估控制能力。本文深入解析信號機制的工作原理&#xff0c;通過簡單和高級示例展示如何自定義信號&#xff0c;并提供實用的使用技巧和測試方法&#xff0c;幫助讀者優化數據管道的調度效率。 一、為什么需要信號機制&#xf…

FreeSWITCH 簡單圖形化界面43 - 使用百度的unimrcp搞個智能話務臺,用的在線的ASR和TTS

FreeSWITCH 簡單圖形化界面43 - 使用百度的unimrcp搞個智能話務臺 0、一個fs的web配置界面預覽1、安裝unimrcp模塊2、安裝完成后&#xff0c;配置FreeSWITCH。2.1 有界面的配置2.1.1 mod_unimrcp模塊配置2.1.2 mod_unimrcp客戶端配置 2.2 無界面的配置 3、呼叫規則4、編寫流程4…

【架構】RUP統一軟件過程:企業級軟件開發的全面指南

一、RUP概述 RUP(Rational Unified Process&#xff0c;統一軟件過程)是由Rational Software公司(后被IBM收購)開發的一種迭代式軟件開發過程框架。它結合了傳統瀑布模型的系統性和敏捷方法的靈活性&#xff0c;為中大型軟件項目提供了全面的開發方法論。 RUP不僅僅是一種過程…

DeepSeek賦能電商,智能客服機器人破解大型活動人力困境

1. DeepSeek 與電商客服結合的背景 1.1 電商行業客服需求特點 電商行業具有獨特的客服需求特點&#xff0c;這些特點決定了智能客服機器人在該行業的必要性和重要性。 高并發性&#xff1a;電商平臺的用戶數量龐大&#xff0c;尤其是在促銷活動期間&#xff0c;用戶咨詢量會…

面向具身智能的視覺-語言-動作模型(VLA)綜述

具身智能被廣泛認為是通用人工智能&#xff08;AGI&#xff09;的關鍵要素&#xff0c;因為它涉及控制具身智能體在物理世界中執行任務。在大語言模型和視覺語言模型成功的基礎上&#xff0c;一種新的多模態模型——視覺語言動作模型&#xff08;VLA&#xff09;已經出現&#…

后端框架(1):Mybatis

什么是框架&#xff1f; 蓋高樓&#xff0c;框架結構。 框架結構就是高樓的主體&#xff0c;基礎功能。 把很多基礎功能已經實現了(封裝了)。 在基礎語言之上&#xff0c;對各種基礎功能進行封裝&#xff0c;方便開發者&#xff0c;提高開發效率。 mybatis&#xff1a;對jd…

ubuntu20.04系統搭建k8s1.28集群-docker作為容器運行時

ubuntu系統搭建 ubuntu-22.04.5-desktop-amd64.iso映像文件--->實際卻是20.4focal版本。 【安裝過程沒有特別指出的默認回車下一步】 【用戶和密碼設置】 【網絡連接】 【在vmware上安裝的話&#xff0c;網絡配置如下】【在vm里配置選擇nat或者橋接即可】 【國內源配置】&…

軟件I2C

軟件I2C 注意&#xff1a; SDA&#xff08;串行數據線&#xff09;和SCL&#xff08;串行時鐘線&#xff09;都是雙向I/O線&#xff0c;接口電路為開漏輸出。需通過上拉電阻接電源VCC。 軟件I2C說明 說明&#xff0c;有的單片機沒有硬件I2C的功能&#xff0c;或者因為電路設計…