日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

【STM32】步进电机及其驱动(ULN2003驱动28BYJ-48丨按键控制电机旋转)

發(fā)布時(shí)間:2024/1/1 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【STM32】步进电机及其驱动(ULN2003驱动28BYJ-48丨按键控制电机旋转) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本篇文章包含的內(nèi)容

  • 一、步進(jìn)電機(jī)的結(jié)構(gòu)和工作原理
    • 1.1 步進(jìn)控制系統(tǒng)的組成
    • 1.2 步進(jìn)電機(jī)簡(jiǎn)介
    • 1.3 步進(jìn)電機(jī)的分類(lèi)
    • 1.4 步進(jìn)電機(jī)的工作原理
      • 1.4.1 單極性步進(jìn)電機(jī)(5線4相)
      • 1.4.2 雙極性步進(jìn)電機(jī)(4線2相)
      • 1.4.3 細(xì)分器驅(qū)動(dòng)原理
    • 1.5 步進(jìn)電機(jī)工作參數(shù)
      • 1.5.1 靜態(tài)參數(shù)
      • 1.5.2 動(dòng)態(tài)參數(shù)
    • 1.6 步進(jìn)電機(jī)的特點(diǎn)
  • 二、步進(jìn)電機(jī)驅(qū)動(dòng)
    • 2.1 ULN2003驅(qū)動(dòng)芯片
    • 2.2 驅(qū)動(dòng)模塊電路圖
  • 三、代碼實(shí)現(xiàn)


參考文章與課程:
??【視頻課程】步進(jìn)電機(jī)基礎(chǔ)原理和應(yīng)用——程子華主講
??【視頻課程】電機(jī)系列教學(xué)視頻(基于STM32硬件)——野火
??【霄耀在努力】STM32驅(qū)動(dòng)步進(jìn)電機(jī)(原理、程序、解決電機(jī)只震動(dòng)不轉(zhuǎn)動(dòng)問(wèn)題)


一、步進(jìn)電機(jī)的結(jié)構(gòu)和工作原理

1.1 步進(jìn)控制系統(tǒng)的組成

??步進(jìn)控制系統(tǒng)由以下三個(gè)部分組成:

  • 控制器:可以是PLC、定位控制模塊或單片機(jī),主要作用是產(chǎn)生控制脈沖信號(hào)(博主采用STM32作為控制器)。
  • 驅(qū)動(dòng)器:對(duì)控制器發(fā)出的控制信號(hào)進(jìn)行分配和功率放大,控制步進(jìn)電機(jī)每一相的線圈是否通電。
  • 電機(jī):電機(jī)本身,或用步進(jìn)電機(jī)驅(qū)動(dòng)其他設(shè)備。

1.2 步進(jìn)電機(jī)簡(jiǎn)介

??步進(jìn)電機(jī)是一種特種電機(jī),又稱為脈沖電動(dòng)機(jī),是一種將電脈沖信號(hào)轉(zhuǎn)化為角位移線位移的開(kāi)環(huán)(無(wú)反饋)控制元件。在非超載的條件下,電機(jī)的轉(zhuǎn)速、角位移只取決于控制脈沖信號(hào)的頻率脈沖數(shù)
??“步進(jìn)”的意義是電機(jī)轉(zhuǎn)動(dòng)遵從固定的步幅,即每一個(gè)控制脈沖來(lái)臨,電機(jī)就轉(zhuǎn)動(dòng)一個(gè)步進(jìn)角 θ\thetaθ。步進(jìn)角θ\thetaθ與電機(jī)本身的結(jié)構(gòu)(和其拓展結(jié)構(gòu),例如減速齒輪可以減小步進(jìn)角)有關(guān)。脈沖數(shù)越多,電機(jī)轉(zhuǎn)動(dòng)的角度就越大。同時(shí),脈沖的頻率越高,電機(jī)轉(zhuǎn)速就越快,但不能超過(guò)最高頻率,否則電機(jī)的力矩將迅速減小,電機(jī)停轉(zhuǎn)。
??下圖所示的是較為常見(jiàn)的42步進(jìn)電機(jī)。“42”的意思是該電機(jī)的外殼尺寸是42mm×42mm。可以在其轉(zhuǎn)軸上加裝減速齒輪實(shí)現(xiàn)減速功能,來(lái)增大輸出力矩和減小步進(jìn)角θ\thetaθ;也可以在將轉(zhuǎn)軸替換為絲杠,常見(jiàn)于需要驅(qū)動(dòng)設(shè)備直線運(yùn)動(dòng)的場(chǎng)合。

??博主在這里使用的步進(jìn)電機(jī)型號(hào)是28BYJ-48,是套件中常見(jiàn)的步進(jìn)電機(jī)。它也是一種減速步進(jìn)電機(jī),內(nèi)部的減速齒輪由塑料制成,具有重量輕,體積小,結(jié)構(gòu)簡(jiǎn)單等特點(diǎn)。它常被用在監(jiān)控探頭的云臺(tái)上。這種電機(jī)及其驅(qū)動(dòng)模塊如下圖所示:

1.3 步進(jìn)電機(jī)的分類(lèi)

??步進(jìn)電機(jī)的分類(lèi)方法非常多,按照不同的分類(lèi)方法,步進(jìn)電機(jī)可以被分為以下幾種:

  • 按力矩產(chǎn)生的原理分類(lèi)
    • 磁阻式:又稱為反應(yīng)式步進(jìn)電機(jī)。轉(zhuǎn)子采用軟磁材料,一般式硅鋼片,本身沒(méi)有磁性,但極易被磁化。其特點(diǎn)是結(jié)構(gòu)簡(jiǎn)單,步進(jìn)角小(可達(dá)1.2°),但效率低,發(fā)熱量大,可靠性難以保障,很早之前就被市場(chǎng)淘汰了。

    • 永磁式:又稱為PM步進(jìn)電機(jī),轉(zhuǎn)子使用永磁性材料,通過(guò)改變定子線圈的磁極來(lái)驅(qū)動(dòng)轉(zhuǎn)子。內(nèi)部的圓柱形轉(zhuǎn)子外表均勻分布著N極和S極。一般都為兩相,扭矩和體積都比較小。步進(jìn)角θ\thetaθ一般為3.75°、7.5°、15°、18°,特點(diǎn)是步進(jìn)角一般較大,力矩較小,精度比較低,發(fā)熱小,結(jié)構(gòu)簡(jiǎn)單,價(jià)格低廉,一般用在一些較為低端的產(chǎn)品中。今年來(lái)設(shè)備小型化,微型永磁式步進(jìn)電機(jī)的應(yīng)用范圍也有了進(jìn)一步的擴(kuò)展,例如帶可升降型的攝像頭的手機(jī)。

    • 混合式:定子由兩個(gè)轉(zhuǎn)子鐵芯(一般是硅鋼片)和一個(gè)磁鋼(永磁體)組成,兩個(gè)轉(zhuǎn)子鐵芯極性相反。它的特點(diǎn)是產(chǎn)生的力矩相較于永磁式步進(jìn)電機(jī)更大,發(fā)熱較小,效率高,轉(zhuǎn)速相對(duì)較大,噪音低,步進(jìn)角小等。兩相混合式步進(jìn)電機(jī)的步進(jìn)角一般為1.8°,三相混合式步進(jìn)電機(jī)的步進(jìn)角一般為1.2°,五相混合式步進(jìn)電機(jī)的步進(jìn)角可以達(dá)到0.72°。它的相應(yīng)速度快,適用于頻繁啟停的場(chǎng)合。

  • 按相數(shù)分類(lèi):可以分為單相、雙相、三相、四相、五相步進(jìn)電機(jī)。相數(shù),指電機(jī)內(nèi)部的閉合線圈組數(shù)。
  • 按輸出力矩的大小分類(lèi)
    • 伺服式:輸出力矩在小于1N·m的范圍內(nèi),只能驅(qū)動(dòng)較小的負(fù)載,要與液壓扭矩放大器配合使用才能驅(qū)動(dòng)機(jī)床、工作臺(tái)等較大的負(fù)載
    • 功率式:輸出力矩在5~50N·m之間,甚至更高,可以直接驅(qū)動(dòng)機(jī)床工作臺(tái)等較大的負(fù)載
  • 按定子數(shù)分類(lèi)
    • 單定子式
    • 雙定子式
    • 三定子式
    • 多定子式
  • 按各相繞組分布分類(lèi)
    • 徑向分布式:電機(jī)各相按圓周依次排列
    • 軸向分布式:電機(jī)各相按軸向依次排列

    ??按照以上的一些分類(lèi)方法,可以舉出一些例子:

    ??28BYJ-48就是一種常見(jiàn)的單極性五線四相步進(jìn)電機(jī),“單極性”指線圈中電流的方向是確定的,不可翻轉(zhuǎn);對(duì)應(yīng)的,“雙極性”指線圈沖存在兩種不同地電流方向。

    1.4 步進(jìn)電機(jī)的工作原理

    ??對(duì)于雙極性步進(jìn)電機(jī)和單極性步進(jìn)電機(jī),它們二者繞組極性的不同,它們的工作方式也略有差異。

    1.4.1 單極性步進(jìn)電機(jī)(5線4相)

    ??單極性步進(jìn)電機(jī)有共陰極接法共陽(yáng)極接法,兩種接法對(duì)于控制信號(hào)而言只是控制信號(hào)的極性的不同。要控制電機(jī)的旋轉(zhuǎn)方向,只需要將拍之間的導(dǎo)電順序顛倒即可。接下來(lái)的幾種驅(qū)動(dòng)方式都采用共陰極接法為例說(shuō)明,且電機(jī)為順時(shí)針轉(zhuǎn)動(dòng)。

  • 單相整步驅(qū)動(dòng):“單相”指每一拍只有一相導(dǎo)電,“整步”指每一拍走過(guò)的角度是相鄰兩相之間的一整步。如下圖所示,四個(gè)相的導(dǎo)電順序?yàn)?#xff1a;A→B→C→D→A→...A\rightarrow B \rightarrow C \rightarrow D \rightarrow A \rightarrow...ABCDA...,依次循環(huán),步距角θ=90°\theta=90°θ=90°

  • 雙相整步驅(qū)動(dòng):“雙相”指每一拍有兩相同時(shí)導(dǎo)通,且在數(shù)字信號(hào)驅(qū)動(dòng)下,兩相線圈通電產(chǎn)生的磁場(chǎng)大小相等。四拍的導(dǎo)電順序?yàn)?span id="ozvdkddzhkzd" class="katex--inline">AB→BC→CD→DA→AB→...AB\rightarrow BC \rightarrow CD \rightarrow DA \rightarrow AB \rightarrow...ABBCCDDAAB...,與單相整步驅(qū)動(dòng)相比,雙相整步驅(qū)動(dòng)擁有更大的轉(zhuǎn)動(dòng)力矩(是單相整步驅(qū)動(dòng)力矩的2\sqrt{2}2?倍)。

  • 半步驅(qū)動(dòng):半步驅(qū)動(dòng)方式實(shí)際上是單相整步驅(qū)動(dòng)和雙相整步驅(qū)動(dòng)的結(jié)合。相較于前兩者,半步驅(qū)動(dòng)有更小的步距角(45°),八拍的導(dǎo)電順序?yàn)?#xff1a;A→AB→B→BC→C→CD→D→DA→A→...A\rightarrow AB \rightarrow B \rightarrow BC \rightarrow C \rightarrow CD \rightarrow D \rightarrow DA \rightarrow A \rightarrow...AABBBCCCDDDAA...,其缺點(diǎn)為轉(zhuǎn)動(dòng)力矩不穩(wěn)定,有可能會(huì)導(dǎo)致電機(jī)本身的震動(dòng)或者驅(qū)動(dòng)設(shè)備的動(dòng)力不穩(wěn)定等問(wèn)題。

  • 1.4.2 雙極性步進(jìn)電機(jī)(4線2相)

    ??雙極性步進(jìn)電機(jī)中的線圈中的電流方向是雙相的,通過(guò)配置A+A^+A+A?A^-A?B+B^+B+B?B^-B?的高低電平來(lái)控制電機(jī)的旋轉(zhuǎn)。其原理與單極性步進(jìn)電機(jī)類(lèi)似,優(yōu)點(diǎn)是相較于前者可以具有更大的轉(zhuǎn)動(dòng)力矩(可以通過(guò)配置一個(gè)線圈上的兩端電壓分別為+5V和-5V來(lái)使線圈上的電流增大),缺點(diǎn)是驅(qū)動(dòng)電路和程序較為復(fù)雜。由于原理與單極性步進(jìn)電機(jī)類(lèi)似,以下不做過(guò)多贅述。

  • 單相整步驅(qū)動(dòng)

  • 雙相整步驅(qū)動(dòng)

  • 半步驅(qū)動(dòng)

  • 1.4.3 細(xì)分器驅(qū)動(dòng)原理

    ??如果驅(qū)動(dòng)電路可以改變每一相通電時(shí)的電流大小,就可以控制每一相產(chǎn)生的磁場(chǎng)大小。這樣不僅能解決半步驅(qū)動(dòng)時(shí)力矩忽大忽小的問(wèn)題,還能使步距角進(jìn)一步減小以達(dá)到更高的精度控制

    1.5 步進(jìn)電機(jī)工作參數(shù)

    1.5.1 靜態(tài)參數(shù)

    • 相數(shù):產(chǎn)生不同對(duì)極 N、S 磁場(chǎng)的激磁線圈對(duì)數(shù)(雙極性),也可以理解為步進(jìn)電機(jī)中線圈的組數(shù)。一般而言,兩相步進(jìn)電機(jī)步距角為 1.8°,三相的步進(jìn)電機(jī)步距角為 1.5°,相數(shù)越多的步進(jìn)電機(jī),其步距角就越小
    • 拍數(shù):完成一個(gè)磁場(chǎng)周期性變化所需脈沖數(shù)或?qū)щ姞顟B(tài),用 nnn 表示;或指電機(jī)轉(zhuǎn)過(guò)一個(gè)齒距角所需脈沖數(shù)。以四相電機(jī)為例,四相四拍運(yùn)行方式即 AB→BC→CD→DA→AB→...AB\rightarrow BC \rightarrow CD \rightarrow DA \rightarrow AB \rightarrow...ABBCCDDAAB...,四相八拍運(yùn)行方式即 A→AB→B→BC→C→CD→D→DA→A→...A\rightarrow AB \rightarrow B \rightarrow BC \rightarrow C \rightarrow CD \rightarrow D \rightarrow DA \rightarrow A \rightarrow...AABBBCCCDDDAA...
    • 步距角:一個(gè)脈沖信號(hào)所對(duì)應(yīng)的電機(jī)轉(zhuǎn)動(dòng)的角度,可以簡(jiǎn)單理解為一個(gè)脈沖信號(hào)驅(qū)動(dòng)的角度,電機(jī)上都有標(biāo)注,一般 42 步進(jìn)電機(jī)的步距角為 1.8°
    • 定位轉(zhuǎn)矩:電機(jī)在不通電狀態(tài)下,電機(jī)轉(zhuǎn)子自身的鎖定力矩(由磁場(chǎng)齒形的諧波以及機(jī)械誤差造成)。
    • 靜轉(zhuǎn)矩:電機(jī)在額定靜態(tài)電壓作用下,電機(jī)不作旋轉(zhuǎn)運(yùn)動(dòng)時(shí),電機(jī)轉(zhuǎn)軸的鎖定力矩。此力矩是衡量電機(jī)體積的標(biāo)準(zhǔn),與驅(qū)動(dòng)電壓及驅(qū)動(dòng)電源等無(wú)關(guān)。

    1.5.2 動(dòng)態(tài)參數(shù)

    • 步距角精度:步進(jìn)電機(jī)轉(zhuǎn)動(dòng)一個(gè)步距角度的理論值與實(shí)際值的誤差。用百分比表示:誤差/步距角*100%。
    • 失步:電機(jī)運(yùn)轉(zhuǎn)時(shí)運(yùn)轉(zhuǎn)的步數(shù),不等于理論上的步數(shù)。也可以叫做丟步,一般都是因負(fù)載太大或者是頻率過(guò)快。
    • 失調(diào)角:轉(zhuǎn)子齒軸線偏移定子齒軸線的角度,電機(jī)運(yùn)轉(zhuǎn)必存在失調(diào)角,由失調(diào)角產(chǎn)生的誤差,采用細(xì)分驅(qū)動(dòng)是不能解決的。
    • 最大空載起動(dòng)頻率:在不加負(fù)載的情況下,能夠直接起動(dòng)的最大頻率。
    • 最大空載的運(yùn)行頻率:電機(jī)不帶負(fù)載的最高轉(zhuǎn)速頻率。
    • 運(yùn)行轉(zhuǎn)矩特性:電機(jī)的動(dòng)態(tài)力矩取決于電機(jī)運(yùn)行時(shí)的平均電流(而非靜態(tài)電流),平均電流越大,電機(jī)輸出力矩越大,即電機(jī)的頻率特性越硬。
    • 電機(jī)正反轉(zhuǎn)控制:通過(guò)改變通電順序而改變電機(jī)的正反轉(zhuǎn)。

    1.6 步進(jìn)電機(jī)的特點(diǎn)

  • 步進(jìn)電機(jī)的精度大概為步距角的 3~5%,且不會(huì)積累。
  • 步進(jìn)電機(jī)的外表允許的最高溫度較高。步進(jìn)電機(jī)發(fā)熱的主要原因是銅損和鐵損,銅損指銅導(dǎo)線的導(dǎo)電發(fā)熱效應(yīng),鐵損指作為鐵芯的硅鋼片在磁場(chǎng)中產(chǎn)生渦流效應(yīng)而被加熱。一般步進(jìn)電機(jī)會(huì)因外表溫度過(guò)高而產(chǎn)生磁性減小,從而導(dǎo)致力矩減小。一般來(lái)說(shuō)磁性材料的退磁點(diǎn)都在攝氏 130 度以上,有的甚至高達(dá)攝氏 200度以上,所以步進(jìn)電機(jī)外表溫度在攝氏 80-90 度是完全正常的(28BYJ-48不會(huì)達(dá)到很高的工作溫度)。
  • 步進(jìn)電機(jī)的轉(zhuǎn)矩與速度成反比,速度越快力矩越小。
  • 低速時(shí)步進(jìn)電機(jī)可以正常啟動(dòng),高速時(shí)不會(huì)啟動(dòng),并伴有嘯叫聲。步進(jìn)電機(jī)的空載啟動(dòng)頻率是固定的,如果高于這個(gè)頻率電機(jī)不能被啟動(dòng),并且會(huì)丟步或堵轉(zhuǎn)。
  • 二、步進(jìn)電機(jī)驅(qū)動(dòng)

    2.1 ULN2003驅(qū)動(dòng)芯片

    ??ULN2003是一個(gè)單片高電壓(最高可達(dá)50V)、高電流(單個(gè)額定輸出500mA)的達(dá)林頓晶體管陣列集成電路。 它是由7對(duì)NPN達(dá)林頓晶體管組成的,它的高電壓輸出特性和陰極鉗位二極管可以轉(zhuǎn)換感應(yīng)負(fù)載。單個(gè)達(dá)林頓晶體管對(duì)的集電極電流為500mA,達(dá)林頓管并聯(lián)可以承受更大的電流。
    ??ULN2003可以作為繼電器驅(qū)動(dòng)器,字錘驅(qū)動(dòng)器、燈驅(qū)動(dòng)器、顯示驅(qū)動(dòng)器(LED氣體放電),線路驅(qū)動(dòng)器和邏輯緩沖器。ULN2003的每一對(duì)達(dá)林頓晶體管的基極都有一個(gè)2.7k的串聯(lián)電阻,可以直接和TTL或者5V的CMOS裝置連接。它實(shí)際上就是一個(gè)功率放大器,輸出端具有較大的驅(qū)動(dòng)能力(電流較大)。
    ??ULN2003的芯片內(nèi)部原理圖和引腳定義圖如下所示:

    2.2 驅(qū)動(dòng)模塊電路圖

    ??與28BYJ-48配套的ULN2003驅(qū)動(dòng)模塊原理圖如下圖所示:

    ??該模塊的電路原理比較簡(jiǎn)單,具體使用時(shí)IN1、IN2、IN3、IN4分別對(duì)應(yīng)A、B、C、D四相,且都為高電平有效。輸入某一相為高電平時(shí)對(duì)應(yīng)相的LED指示燈亮起,標(biāo)識(shí)該相目前輸入為有效電平。

    三、代碼實(shí)現(xiàn)

    ??博主在寫(xiě)代碼的時(shí)候饒了很多彎路……,最后也參考了一些網(wǎng)上的代碼。參考的文章和課程在文章開(kāi)頭有所標(biāo)識(shí)。IN1~IN4分別接STM32的PA0,PA1,PA2,PA3,驅(qū)動(dòng)模塊的電源(5V)直接連接到ST-Link的電源輸入口上,驅(qū)動(dòng)模塊與STM32共地。接線圖略。

    • Stepper.h
    #ifndef __STEPPER_H_ #define __STEPPER_H_// 電機(jī)的旋轉(zhuǎn)方向 typedef enum {Forward = 0,Reversal = 1 } RotDirection;// 需要使用其他端口時(shí),只需要更改以下的宏定義即可 // 這里需要保證四個(gè)輸出端口同屬一個(gè)GPIO // 如果不能滿足這一點(diǎn),需要更改Stepper.c中初始化函數(shù)Stepper_Init和Stepper_RotateByStep中的一些變量名稱 // 這里的宏定義是為了提高程序的可讀性和可移植性,但使用stm32f10x.h中定義的原始名稱也未嘗不可 #define Stepper_CLK RCC_APB2Periph_GPIOA #define Stepper_Output_GPIO GPIOA #define Stepper_LA GPIO_Pin_0 #define Stepper_LB GPIO_Pin_1 #define Stepper_LC GPIO_Pin_2 #define Stepper_LD GPIO_Pin_3void Stepper_GPIOInit(void); void Stepper_Stop(void); void Stepper_SingleStep(uint8_t StepNum, uint16_t Delay_Time_xms); void Stepper_RotateByStep(RotDirection direction, uint32_t step, uint16_t Delay_Time_xms); void Stepper_RotateByLoop(RotDirection direction, uint32_t Loop, uint16_t Delay_Time_xms);#endif
    • Stepper.c
    #include "stm32f10x.h" // Device header #include "Delay.h" #include "Key.h" #include "Stepper.h"uint8_t STEP; // 用于存儲(chǔ)電機(jī)正在走過(guò)的整步編號(hào)/*** @brief 步進(jìn)電機(jī)輸出端GPIO初始化函數(shù)* @param 無(wú)* @retval 無(wú)*/ void Stepper_GPIOInit(void) {RCC_APB2PeriphClockCmd(Stepper_CLK, ENABLE);GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽輸出GPIO_InitStruct.GPIO_Pin = Stepper_LA | Stepper_LB | Stepper_LC | Stepper_LD;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(Stepper_Output_GPIO, &GPIO_InitStruct);GPIO_ResetBits(Stepper_Output_GPIO, Stepper_LA | Stepper_LB | Stepper_LC | Stepper_LD); }/*** @brief 電機(jī)停轉(zhuǎn)函數(shù)* @param 無(wú)* @retval 無(wú)*/ void Stepper_Stop(void) {GPIO_ResetBits(Stepper_Output_GPIO, Stepper_LA | Stepper_LB | Stepper_LC | Stepper_LD); }/*** @brief 4拍單相整步驅(qū)動(dòng)函數(shù)* @param StepNum 整步編號(hào),0~3對(duì)應(yīng)A~D* @param Delay_Time_xms 每步旋轉(zhuǎn)后延時(shí)時(shí)間x ms,用于控制步進(jìn)電機(jī)速度(一般需大于等于2)* @retval 無(wú)*/ void Stepper_SingleStep(uint8_t StepNum, uint16_t Delay_Time_xms) {switch(StepNum){case 0: // AGPIO_WriteBit(Stepper_Output_GPIO, Stepper_LA, Bit_SET);GPIO_WriteBit(Stepper_Output_GPIO, Stepper_LB | Stepper_LC | Stepper_LD, Bit_RESET);break;case 1: // BGPIO_WriteBit(Stepper_Output_GPIO, Stepper_LB, Bit_SET); GPIO_WriteBit(Stepper_Output_GPIO, Stepper_LA | Stepper_LC | Stepper_LD, Bit_RESET);break; case 2: // CGPIO_WriteBit(Stepper_Output_GPIO, Stepper_LC, Bit_SET); GPIO_WriteBit(Stepper_Output_GPIO, Stepper_LA | Stepper_LB | Stepper_LD, Bit_RESET);break;case 3: // DGPIO_WriteBit(Stepper_Output_GPIO, Stepper_LD, Bit_SET);GPIO_WriteBit(Stepper_Output_GPIO, Stepper_LA | Stepper_LB | Stepper_LC, Bit_RESET);break;default: break;}Delay_ms(Delay_Time_xms); // 延時(shí),控制電機(jī)速度Stepper_Stop(); // 斷電,防止電機(jī)過(guò)熱 }/*** @brief 步進(jìn)電機(jī)按步旋轉(zhuǎn)* @param direction 電機(jī)旋轉(zhuǎn)方向,可以是Forward(正傳)或者Reversal(反轉(zhuǎn))* @param step 電機(jī)轉(zhuǎn)過(guò)的步數(shù)* @param Delay_Time_xms 每步旋轉(zhuǎn)后延時(shí)時(shí)間x ms,用于控制步進(jìn)電機(jī)速度(一般需大于等于2)* @retval 無(wú)*/ void Stepper_RotateByStep(RotDirection direction, uint32_t step, uint16_t Delay_Time_xms) {for (uint32_t i = 0; i < step; i ++){if (direction == Forward) // 電機(jī)正傳{STEP ++;if (STEP > 3){STEP = 0;}}else if (direction == Reversal) // 電機(jī)反轉(zhuǎn){if (STEP < 1){STEP = 4;}STEP --;}Stepper_SingleStep(STEP, Delay_Time_xms);} }/*** @brief 步進(jìn)電機(jī)按整數(shù)圈旋轉(zhuǎn)* @param direction 電機(jī)旋轉(zhuǎn)方向,可以是Forward(正傳)或者Reversal(反轉(zhuǎn))* @param Loop 電機(jī)旋轉(zhuǎn)的圈數(shù)* @param Delay_Time_xms 每步旋轉(zhuǎn)后延時(shí)時(shí)間x ms,用于控制步進(jìn)電機(jī)速度(一般需大于等于2)* @retval */ void Stepper_RotateByLoop(RotDirection direction, uint32_t Loop, uint16_t Delay_Time_xms) {Stepper_RotateByStep(direction, Loop * 2048, Delay_Time_xms); }

    ??Stepper_RotateByLoop函數(shù)中Loop * 2048是博主根據(jù)28BYJ-48步進(jìn)電機(jī)的性能參數(shù)列表計(jì)算和實(shí)踐調(diào)試所得。這里博主使用四拍驅(qū)動(dòng)方式,如果要使用8拍的半步驅(qū)動(dòng)方式,2048應(yīng)該改為4096。讀者手中的28BYJ-48的齒輪減速比可能與博主的有所不同(1:16 or 1:64),根據(jù)測(cè)試,博主手頭的28BYJ-48的參數(shù)如下表所示:

    型號(hào)電壓相數(shù)步距角減速齒輪減速比最大空載啟動(dòng)頻率最大空載運(yùn)行頻率
    28BYJ-485V45.625° / 321:32600Hz1000Hz
    • Key.c(Key.h在這里省略,在頭文件中將函數(shù)進(jìn)行聲明即可)
    #include "stm32f10x.h" // Device header #include "Delay.h"/*** @brief 按鍵初始化函數(shù)* @param 無(wú)* @retval 無(wú)*/ void Key_Init(void) {RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_11;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 這里的速度是GPIO的輸出速度,在輸入模式下這個(gè)參數(shù)選擇沒(méi)有用處GPIO_Init(GPIOB, &GPIO_InitStructure); }/*** @brief 返回按下按鍵的值,若不按下按鍵默認(rèn)返回0* @param 無(wú)* @retval KeyNum 按鍵對(duì)應(yīng)的值,按下PB1按鍵返回1,按下PB11按鍵返回2*/ uint8_t Key_GetNum(void) {uint8_t KeyNum = 0;if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0) // 讀取1端口的值{Delay_ms(20);while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0); // 如果不松手,程序?qū)⒃诖说却?/span>Delay_ms(20);KeyNum = 1;}if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0) // 讀取11端口的值{Delay_ms(20);while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0); // 如果不松手,程序?qū)⒃诖说却?/span>Delay_ms(20);KeyNum = 2;}return KeyNum; }
    • main.c
    #include "stm32f10x.h" // Device header #include "Delay.h" #include "OLED.h" #include "Key.h" #include "Stepper.h"uint8_t KeyNum;int main() {Key_Init();Stepper_GPIOInit();// Stepper_RotateByStep(Forward, 512, 3); // Stepper_RotateByStep(Reversal, 512, 3); // Stepper_RotateByLoop(Forward, 1, 3);while(1){ KeyNum = Key_GetNum();if (KeyNum == 1) // 按下PB1上的按鍵,步進(jìn)電機(jī)正轉(zhuǎn)一圈{Stepper_RotateByLoop(Forward, 1, 3);}if (KeyNum == 2) // 按下PB11上的按鍵,步進(jìn)電機(jī)反轉(zhuǎn)一圈{Stepper_RotateByLoop(Reversal, 1, 3);}} }

    ??原創(chuàng)內(nèi)容,整理不易,歡迎點(diǎn)贊,收藏~ 如有謬誤敬請(qǐng)?jiān)谠u(píng)論區(qū)不吝告知,感激不盡!博主將持續(xù)更新有關(guān)嵌入式開(kāi)發(fā)、機(jī)器學(xué)習(xí)方面的學(xué)習(xí)筆記~

    總結(jié)

    以上是生活随笔為你收集整理的【STM32】步进电机及其驱动(ULN2003驱动28BYJ-48丨按键控制电机旋转)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 中文字幕一二三区 | av不卡一区二区 | 亚洲欧美中文字幕5发布 | 久久国产精品久久久久久 | 天天精品视频 | 91在线视频免费看 | 国产成人免费在线观看 | 青青青青青青青青草 | 国内三级视频 | 亚洲av无码电影在线播放 | www.四色| 国产免费视频一区二区三区 | xxx老太太 | 色一区二区 | 美足av电影| av在线有码 | 日本在线免费视频 | 日本黄色成人 | 高清无码一区二区在线观看吞精 | 蜜臀尤物一区二区三区直播 | 欧美性一区| 日韩美一区二区 | 欧美成人做爰大片免费看黄石 | 亚洲三级成人 | 在线免费观看视频你懂的 | 一级生活毛片 | 伊人久久网站 | 久久e热| 精品国产一区二区三 | 你懂的在线观看网址 | 日韩欧美小视频 | 女人叫床很黄很污句子 | 三级网站在线播放 | 麻豆一区二区在线 | 日本va欧美va欧美va精品 | 国产欧美精品一区 | 人妻换人妻仑乱 | 黄色一级在线观看 | 色综合久久88色综合天天 | 久久在线电影 | 男生吃小头头的视频 | 国产一区二区视频在线免费观看 | 国产亚洲欧美视频 | 国产精品一色哟哟哟 | 精品一区二区久久久久久按摩 | 久久国产精品首页 | 亚洲精品一区二区三区四区 | 国内精品视频 | 久久一区视频 | 成人免费网站在线观看 | 男同互操gay射视频在线看 | 最新av女优| 国产无遮挡18禁无码网站不卡 | 爱爱综合网 | 欧美一级视频免费观看 | 欧美一区二区三区在线看 | 影音先锋天堂网 | 欧洲av在线播放 | 真人bbbbbbbbb毛片 | 逼特逼在线视频 | 欧美日本在线观看 | 一级黄网| 激情三级在线 | 婷婷99 | 日本一级片免费看 | 老司机午夜av| 日本午夜一级 | 欧美三级a做爰在线观看 | 欧美一区二区三区在线观看 | 国产黄视频网站 | 免费看成人av | 欧美特黄aaaaaa | 欧美日韩中文在线视频 | 中文字幕在线观看91 | 国产激情小视频 | 久久伊人精品 | 久久久久香蕉视频 | 免费观看成人毛片 | 射射色 | 成人av资源在线 | 欧美在线资源 | 日本国产高清 | 国产精品久久久久久久久久妞妞 | 毛片在线免费视频 | 岳狂躁岳丰满少妇大叫 | 色婷婷热久久 | 国产欧美视频一区 | 亚洲欧美一区二区视频 | 人妻无码久久一区二区三区免费 | 亚洲国产精品成人综合 | 浓精喷进老师黑色丝袜在线观看 | 一区二区三区网站 | 日本高清视频一区二区 | 亚洲国产成人精品一区二区三区 | 亚欧在线 | 青青操av在线 | 男女做爰猛烈吃奶啪啪喷水网站 | 中文字幕精品亚洲 | 天堂网一区二区 |