直流有刷電機(jī)
直流有刷電機(jī)(Brushed DC motor)具有結(jié)構(gòu)簡(jiǎn)單、易于控制、成本低等特點(diǎn), 在一些功能簡(jiǎn)單的應(yīng)用場(chǎng)合,或者說(shuō)在能夠滿足必要的性能、低成本和足夠的可靠性的前提下, 直流有刷電機(jī)往往是一個(gè)很好的選擇。 例如便宜的電子玩具、各種風(fēng)扇和汽車的電動(dòng)座椅等。 基本的直流有刷電機(jī)在電源和電機(jī)之間只需要兩根電纜,這樣就可以節(jié)省配線和連接器所需的空間, 并降低電纜和連接器的成本。 此外,還可以使用MOSFET/IGBT開關(guān)對(duì)直流有刷電機(jī)進(jìn)行控制, 給電機(jī)提供足夠好的性能的同時(shí),整個(gè)電機(jī)控制系統(tǒng)也會(huì)比較便宜。
直流有刷電機(jī)轉(zhuǎn)速快、扭矩小,在某些應(yīng)用中可能無(wú)法滿足要求。 這種情況就需要做一些改進(jìn)來(lái)降低轉(zhuǎn)速,并提高力矩。 直流減速電機(jī)就是這樣一種電機(jī)。
這種電機(jī)通常也叫齒輪減速電機(jī),它是在普通直流有刷電機(jī)的基礎(chǔ)上增加了一套齒輪減速箱, 用來(lái)提供更大的力矩和更低的轉(zhuǎn)速。 齒輪減速箱可以通過(guò)配置不同的減速比,提供各種不同的轉(zhuǎn)速和力矩。 在實(shí)際使用中減速電機(jī)使用的最為廣泛,所以本章節(jié)將主要介紹直流有刷減速電機(jī)。
本章節(jié)將介紹直流有刷電機(jī)的工作原理、電機(jī)參數(shù)和驅(qū)動(dòng)電路,最后通過(guò)實(shí)驗(yàn)來(lái)實(shí)現(xiàn)電機(jī)運(yùn)動(dòng)的簡(jiǎn)單控制。
直流有刷電機(jī)工作原理
在分析原理前我們先復(fù)習(xí)一下左手定則。
左手定則是判斷通電導(dǎo)體處于磁場(chǎng)中時(shí),所受安培力 F (或運(yùn)動(dòng))的方向、 磁感應(yīng)強(qiáng)度B的方向以及通電導(dǎo)體棒的電流 I 三者方向之間的關(guān)系的定律。 通過(guò)左手定則可以知道通電導(dǎo)體在磁場(chǎng)中的受力方向,如下圖所示。
判斷方法是:伸開左手,使拇指與其他四指垂直且在一個(gè)平面內(nèi),讓磁感線從手心流入, 四指指向電流方向,大拇指指向的就是安培力方向(即導(dǎo)體受力方向)。
有刷直流電機(jī)在其電樞上繞有大量的線圈,所產(chǎn)生強(qiáng)大的磁場(chǎng)與外部磁場(chǎng)相互作用產(chǎn)生旋轉(zhuǎn)運(yùn)動(dòng)。 磁極方向的跳轉(zhuǎn)是通過(guò)移動(dòng)固定位置的接觸點(diǎn)來(lái)完成的,該接觸點(diǎn)在電機(jī)轉(zhuǎn)子上與電觸點(diǎn)相對(duì)連接。 這種固定觸點(diǎn)通常由石墨制成,與銅或其他金屬相比,在大電流短路或斷路/起動(dòng)過(guò)程中石墨不會(huì)熔斷或者與旋轉(zhuǎn)觸點(diǎn)焊接到一起, 并且這個(gè)觸點(diǎn)通常是彈簧承載的,所以能夠獲得持續(xù)的接觸壓力,保證向線圈供應(yīng)電力。 在這里我們將通過(guò)其中一組線圈和一對(duì)磁極來(lái)分析其工作原理,如下圖所示。
圖中C和D兩片半圓周的銅片構(gòu)成換向器,兩個(gè)彈性銅片靠在換向器兩側(cè)的A和B是電刷,電源通過(guò)電刷向?qū)Ь€框供電, 線框中就有電流通過(guò),在線框兩側(cè)放一對(duì)磁極N和S,形成磁場(chǎng),磁力線由N到S。 線框通有電流時(shí), 兩側(cè)導(dǎo)線就會(huì)受到磁場(chǎng)的作用力,方向依左手定則判斷,紅色和藍(lán)色線框部分分別會(huì)受到力F1和F2 , 這兩個(gè)力的方向相反,這使得線框會(huì)轉(zhuǎn)動(dòng),當(dāng)線框轉(zhuǎn)過(guò)90°時(shí),換向器改變了線框電流的方向,產(chǎn)生的安培力方向不變, 于是導(dǎo)線框會(huì)連續(xù)旋轉(zhuǎn)下去,這就是直流電動(dòng)機(jī)的工作原理。
4.2. 直流有刷減速電機(jī)幾個(gè)重要參數(shù)
- 空載轉(zhuǎn)速:正常工作電壓下電機(jī)不帶任何負(fù)載的轉(zhuǎn)速(單位為r/min(轉(zhuǎn)/分))。 空載轉(zhuǎn)速由于沒(méi)有反向力矩,所以輸出功率和堵轉(zhuǎn)情況不一樣,該參數(shù)只是提供一個(gè)電機(jī)在規(guī)定電壓下最大轉(zhuǎn)速的參考。
- 空載電流:正常工作電壓下電機(jī)不帶任何負(fù)載的工作電流(單位mA(毫安))。 越好的電機(jī),在空載時(shí),該值越小。
- 負(fù)載轉(zhuǎn)速:正常工作電壓下電機(jī)帶負(fù)載的轉(zhuǎn)速。
- 負(fù)載力矩:正常工作電壓下電機(jī)帶負(fù)載的力矩 (N·m(牛米))。
- 負(fù)載電流:負(fù)載電流是指電機(jī)拖動(dòng)負(fù)載時(shí)實(shí)際檢測(cè)到的定子電流數(shù)值。
- 堵轉(zhuǎn)力矩:在電機(jī)受反向外力使其停止轉(zhuǎn)動(dòng)時(shí)的力矩。 如果電機(jī)堵轉(zhuǎn)現(xiàn)象經(jīng)常出現(xiàn), 則會(huì)損壞電機(jī),或燒壞驅(qū)動(dòng)芯片。 所以大家選電機(jī)時(shí),這是除轉(zhuǎn)速外要考慮的參數(shù)。 堵轉(zhuǎn)時(shí)間一長(zhǎng),電機(jī)溫度上升的很快,這個(gè)值也會(huì)下降的很厲害。
- 堵轉(zhuǎn)電流:在電機(jī)受反向外力使其停止轉(zhuǎn)動(dòng)時(shí)的電流,此時(shí)電流非常大,時(shí)間稍微就可能會(huì)燒毀電機(jī), 在實(shí)際使用時(shí)應(yīng)盡量避免。
- 減速比:是指沒(méi)有減速齒輪時(shí)轉(zhuǎn)速與有減速齒輪時(shí)轉(zhuǎn)速之比。
- 功率:般指的是它的額定功率(單位W(瓦)),即在額定電壓下能夠長(zhǎng)期正常運(yùn)轉(zhuǎn)的最大功率, 也是指電動(dòng)機(jī)在制造廠所規(guī)定的額定情況下運(yùn)行時(shí), 其輸出端的機(jī)械功率。
4.3. 直流有刷電機(jī)驅(qū)動(dòng)設(shè)計(jì)與分析
我們先來(lái)想一個(gè)問(wèn)題,假設(shè)你手里現(xiàn)在有一個(gè)直流電機(jī)和一節(jié)電池, 當(dāng)你把電機(jī)的兩根電源線和電池的電源連接在一起時(shí),這時(shí)電機(jī)可以正常旋轉(zhuǎn), 當(dāng)想要電機(jī)反向旋轉(zhuǎn)時(shí),只需要把兩根電源線交換一下就可以了。 但是當(dāng)在實(shí)際應(yīng)用中要實(shí)現(xiàn)正轉(zhuǎn)和反轉(zhuǎn)的控制也通過(guò)交換電源線實(shí)現(xiàn)嗎? 顯然這樣的方法是不可行的。 這時(shí)候我們可以用一個(gè)叫做“H橋電路”來(lái)驅(qū)動(dòng)電機(jī)。
4.3.1. 控制電路原理設(shè)計(jì)與分析
如下圖所示,是使用4個(gè)三極管搭建的H橋電路。
上圖中,H橋式電機(jī)驅(qū)動(dòng)電路包括4個(gè)三極管和一個(gè)電機(jī)。 要使電機(jī)運(yùn)轉(zhuǎn),必須導(dǎo)通對(duì)角線上的一對(duì)三極管。 根據(jù)不同三極管對(duì)的導(dǎo)通情況,電流可能會(huì)從左至右或從右至左流過(guò)電機(jī),從而控制電機(jī)的轉(zhuǎn)向。
上圖中,當(dāng)Q1和Q4導(dǎo)通時(shí),電流將經(jīng)過(guò)Q1從左往右流過(guò)電機(jī), 在經(jīng)過(guò)Q4流到電源負(fù)極,這時(shí)圖中電機(jī)可以順時(shí)針轉(zhuǎn)動(dòng)。
上圖中,當(dāng)Q3和Q2導(dǎo)通時(shí),電流將經(jīng)過(guò)Q3從右往左流過(guò)電機(jī), 在經(jīng)過(guò)Q2流到電源負(fù)極,這時(shí)圖中電機(jī)可以逆時(shí)針轉(zhuǎn)動(dòng)。
特別地,當(dāng)同一側(cè)的Q1和Q2同時(shí)導(dǎo)通時(shí),電流將從電源先后經(jīng)過(guò)Q1和Q2 ,然后直接流到電源負(fù)極, 在這個(gè)回路中除了三極管以外就沒(méi)有其他負(fù)載(沒(méi)有經(jīng)過(guò)電機(jī)),這時(shí)電流可能會(huì)達(dá)到最大值,此時(shí)可能會(huì)燒毀三極管, 同理,當(dāng)Q3和Q4同時(shí)導(dǎo)通時(shí),也會(huì)出現(xiàn)相同的狀況。 這樣的情況肯定是不能發(fā)生的, 但是我們寫程序又是三分寫代碼七分在調(diào)試,這就難免會(huì)有寫錯(cuò)代碼將同一測(cè)得三極管導(dǎo)通的情況, 為此我們就需要從硬件上來(lái)避免這個(gè)問(wèn)題。 下面電路圖是改進(jìn)后的驅(qū)動(dòng)電路圖。
與改進(jìn)前的電路相比,在上面的改進(jìn)電路中新增加了兩個(gè)非門和4個(gè)與門,以及Q1和Q3換成了NPN三極管, 經(jīng)過(guò)這樣的組合就可以實(shí)現(xiàn)一個(gè)信號(hào)控制兩個(gè)同一側(cè)的三極管, 并且可以保證在同一側(cè)中兩個(gè)三級(jí)管不會(huì)同時(shí)導(dǎo)通在同一時(shí)刻只會(huì)有一個(gè)三極管是導(dǎo)通的。
我們來(lái)分析一下電信號(hào)的變化:在ENABLE腳接入高電平,在IN1腳接入高電平,在經(jīng)過(guò)第一個(gè)非門后,AND1的2腳就是低電平, 此時(shí)與門AND1的輸出(3腳)就是低電平,所以Q1截止。 而AND2的1腳和2腳都是高電平,所以AND2的3腳也是高電平, 這樣Q2就導(dǎo)通了。 在IN2接入低電平,同理分析可得,Q3導(dǎo)通Q4截止。 在IN1和IN2處分別接入低電平和高電平, 則Q1和Q4導(dǎo)通,Q3和Q2截止。 當(dāng)IN1和IN2都接入高電平或者低電平時(shí)都只會(huì)同時(shí)導(dǎo)通上面或者下面的兩個(gè)三極管, 不會(huì)出現(xiàn)同一側(cè)的三極管同時(shí)導(dǎo)通的情況。
4.3.2. 驅(qū)動(dòng)芯片分析
通常在驅(qū)動(dòng)電機(jī)的時(shí)候我們會(huì)選擇集成H橋的IC,因?yàn)镠橋使用分立元件搭建比較麻煩,增加了硬件設(shè)計(jì)難度, 當(dāng)然如果集成IC無(wú)法滿足我們的功率要求時(shí),還是需要我們自己使用MOS管、三極管等元件來(lái)搭建H橋電路, 這樣的分立元件搭建的H橋一般驅(qū)動(dòng)能力都會(huì)比集成IC要高。 當(dāng)我們?cè)谶x擇集成IC時(shí), 我們需要考慮集成IC是否能滿足電機(jī)的驅(qū)動(dòng)電壓要求,是否能承受電機(jī)工作時(shí)的電流等情況。
4.3.2.1. L298N驅(qū)動(dòng)芯片
L298N是ST公司的產(chǎn)品,內(nèi)部包含4通道邏輯驅(qū)動(dòng)電路,是一種二相和四相電機(jī)的專門驅(qū)動(dòng)芯片, 即內(nèi)含兩個(gè)H橋的高電壓大電流雙橋式驅(qū)動(dòng)器,接收標(biāo)準(zhǔn)的TTL邏輯電平信號(hào),可驅(qū)動(dòng)4.5V~46V、 2A以下的電機(jī),電流峰值輸出可達(dá)3A,其內(nèi)部結(jié)構(gòu)如下圖所示。
其工作原理與上面的講解的H橋原理一樣,這里不再贅述。 L298N引腳圖如下圖所示。
L298N邏輯功能表。
IN1 | IN2 | ENA | 電機(jī)狀態(tài) |
---|---|---|---|
× | × | 0 | 電機(jī)停止 |
1 | 0 | 1 | 電機(jī)正轉(zhuǎn) |
0 | 1 | 1 | 電機(jī)反轉(zhuǎn) |
0 | 0 | 1 | 電機(jī)停止 |
1 | 1 | 1 | 電機(jī)停止 |
IN3,IN4的邏輯圖與上表相同。 由上表可知ENA為低電平時(shí),INx輸入電平對(duì)電機(jī)控制不起作用, 當(dāng)ENA為高電平,輸入電平為一高一低,電機(jī)正或反轉(zhuǎn)。 同為低電平電機(jī)停止,同為高電平電機(jī)停止。 L298N的應(yīng)用電路圖將在后面硬件設(shè)計(jì)小節(jié)講解。
4.4. 直流有刷減速電機(jī)控制實(shí)現(xiàn)
4.4.1. 速度控制原理
脈沖寬度調(diào)制(Pulse width modulation,PWM)信號(hào),即PWM是一種按一定的規(guī)則對(duì)各脈沖的寬度進(jìn)行調(diào)制, 既可改變電路輸出電壓的大小,也可改變輸出頻率。 PWM通過(guò)一定的頻率來(lái)改變通電和斷電的時(shí)間, 從而控制電路輸出功率,在電機(jī)的控制周期中,通電時(shí)間決定了它的轉(zhuǎn)速。 其中, 通電時(shí)間/(通斷時(shí)間+斷電時(shí)間)=占空比,即,高電平占整個(gè)周期的百分比,如下圖所示:
上圖中:T1為高電平時(shí)間,T2為低電平時(shí)間,T是周期。
D(占空比) = T 1/T*100%
設(shè)電機(jī)的速度為V,最大速度為Vmax 。
則:V=Vmax*D
當(dāng)占空比D(0≤D≤1)的大小改變時(shí),速度V也會(huì)改變,所以只要改變占空比就能達(dá)到控制的目的。
4.4.2. 硬件設(shè)計(jì)
主控有刷電機(jī)接口原理圖如下圖所示,有刷電機(jī)接口與無(wú)刷接口使用的是同一個(gè)接口,舍去了其中一些多余的接口, 用到了兩個(gè)定時(shí)器通道,編碼器、兩路ADC采集通道(后續(xù)章節(jié)講解)。 本節(jié)實(shí)驗(yàn)只用到了TIM1的CH1和CH2, 即PA8和PA9來(lái)輸出PWM信號(hào)來(lái)控制電機(jī),注意主控板需要和電機(jī)驅(qū)動(dòng)板供地。
4.4.2.1. L298N
驅(qū)動(dòng)板可以支持12-42V的寬電壓供電,并且?guī)л斎腚妷恨D(zhuǎn)5V的電壓芯片,所以驅(qū)動(dòng)板只需要一個(gè)電源輸入。 具體需要多大電壓需要根據(jù)電機(jī)來(lái)選擇。 電路圖見下圖所示。
在下圖電機(jī)控制接口中,ENABLEA和ENABLEB是使能輸入腳,ENABLEA用于控制A橋,可以接到單片機(jī)的引腳控制, 也是直接使用跳冒連接到5V,ENABLEB用于控制B橋,控制方式與ENABLE一樣。 INPUT1和INPUT2是A橋的控制信號(hào),INPUT1和INPUT2是B橋的控制信號(hào),可以接PWM控制電機(jī)。 OUTPUT1和OUTPUT2是A橋的輸出接口,OUTPUT3和OUTPUT4是B橋的輸出接口。
上圖中8個(gè)二極管用于防止電機(jī)的反電動(dòng)勢(shì)損壞L298N,當(dāng)E點(diǎn)反電勢(shì)為正,超過(guò)電源+0.7V時(shí), 上端二極管導(dǎo)通,這樣輸出線就被限位在電源電壓+0.7V上,不會(huì)超過(guò)這個(gè)數(shù)值; 當(dāng)E點(diǎn)反電勢(shì)為負(fù),低于-0.7V時(shí),下端二極管導(dǎo)通,這樣輸出線就被限位在-0.7V上, 不會(huì)低于-0.7V了。 這兩個(gè)二極管是作為鉗位使用,使得輸出線上電壓(或叫電位) 被箝位在-0.7V~+Vcc+0.7V之間。 其他二極管作用于E點(diǎn)這兩個(gè)一樣。
電機(jī)與L298N驅(qū)動(dòng)板連接見下表所示。
電機(jī)與L298N驅(qū)動(dòng)板連接
電機(jī) | L298N驅(qū)動(dòng)板 |
---|---|
M+ | 電機(jī)輸出:1 |
M- | 電機(jī)輸出:2 |
L298N驅(qū)動(dòng)板與主控板連接見下表所示。
L298N驅(qū)動(dòng)板與主控板連接
L298N驅(qū)動(dòng)板 | 主控板 |
---|---|
PWM1 | PA9 |
PWM2 | PA8 |
GND | GND |
ENA | PG12 |
在L298N驅(qū)動(dòng)板與主控板連接中,ENA可以不接PG12,使用跳冒連接到5V。
4.4.2.2. 野火直流有刷電機(jī)驅(qū)動(dòng)板-MOS管搭建板
野火有刷電機(jī)驅(qū)動(dòng)板是使用MOS管搭建的大功率H橋電機(jī)驅(qū)動(dòng)板,實(shí)物圖如下圖所示。
驅(qū)動(dòng)板可支持12V~70V的寬電壓輸入,10A過(guò)電流保護(hù)電路,超過(guò)10A可自動(dòng)禁用電機(jī)控制信號(hào),最高功率支持700W。 實(shí)際使用輸入電壓需要根據(jù)電機(jī)進(jìn)行選擇,同時(shí)還具有電流采樣電路、編碼器接口和電源電壓檢測(cè)電路等等, 本小節(jié)主要講解電機(jī)驅(qū)動(dòng)部分電路,其他功能將在后續(xù)章節(jié)中講解。
野火使用MOS管搭建的直流有刷驅(qū)動(dòng)板做到了信號(hào)完全隔離,其他驅(qū)動(dòng)板基本都只是使用光耦隔離了控制信號(hào), 并沒(méi)有對(duì)ADC采樣電路進(jìn)行隔離,野火不僅使用光耦對(duì)控制信號(hào)進(jìn)行了隔離, 還使用AMC1200SDUBR隔離運(yùn)放對(duì)ADC采樣電路進(jìn)行了隔離。
PWM控制信號(hào)使用了TLP2362高速光耦進(jìn)行了隔離,SD控制信號(hào)使用了EL357N光耦進(jìn)行了隔離,如下圖所示。
與門的作用是可以使單片機(jī)和過(guò)流保護(hù)電路共同控制SD腳,過(guò)流保護(hù)電路將在電流電壓采集章節(jié)講解, 與門輸入輸出與MOS管狀態(tài)真值表如下表所示。
與門輸入輸出與MOS管狀態(tài)真值表
A | B | Y | MOS |
---|---|---|---|
H | H | H | 可導(dǎo)通 |
H | L | L | 關(guān)斷(過(guò)流保護(hù)) |
L | H | L | 關(guān)斷(單片機(jī)控制關(guān)斷) |
L | L | L | 關(guān)斷(單片機(jī)控制關(guān)斷,過(guò)流保護(hù)) |
下圖是使用MOS管搭建的H橋電路,使用兩個(gè)EG2104驅(qū)動(dòng)四個(gè)MOS管。
EG2104S主要功能有邏輯信號(hào)輸入處理、死區(qū)時(shí)間控制、電平轉(zhuǎn)換功能、懸浮自舉電源結(jié)構(gòu)和上下橋圖騰柱式輸出。 邏輯信號(hào)輸入端高電平閥值為 2.5V 以上,低電平閥值為 1.0V 以下,要求邏輯信號(hào)的輸出電流小, 可以使MCU輸出邏輯信號(hào)直接連接到EG2104S的輸入通道上。 EG2104S芯片有一個(gè)shutdown引腳, 邏輯輸入控制信號(hào)低電平有效,控制強(qiáng)行使LO、HO輸出低電平。 這樣可以直接使用這個(gè)引腳做軟件控制電機(jī)的旋轉(zhuǎn)與停止, 還可以實(shí)現(xiàn)硬件的限流保護(hù)(后續(xù)章節(jié)分析保護(hù)電路),輸入信號(hào)和輸出信號(hào)邏輯真值表如下表所示。
EG2104S輸入信號(hào)和輸出信號(hào)邏輯真值表
IN(引腳2) | SD(引腳3) | HO(引腳7) | LO(引腳5) |
---|---|---|---|
L | L | L | L |
H | L | L | L |
L | H | L | H |
H | H | H | L |
從真值表可知,在輸入邏輯信號(hào)SD為“L”時(shí),不管IN為“H”或者“L”情況下,驅(qū)動(dòng)器控制輸出HO、LO同時(shí)為“L”, 上、下功率管同時(shí)關(guān)斷; 當(dāng)輸入邏輯信號(hào)SD為“H”、IN為“L”時(shí),HO輸出為“L”,LO輸出為“H”; 當(dāng)輸入邏輯信號(hào)SD為“H”、IN 為“H”時(shí),HO輸出為“H”,LO輸出為“L”。
EG2104S內(nèi)部集成了死區(qū)時(shí)控制電路,死區(qū)時(shí)間波形圖如下圖所示,其中死區(qū)時(shí)間DT的典型值為640ns。
EG2104S采用自舉懸浮驅(qū)動(dòng)電源結(jié)構(gòu)大大簡(jiǎn)化了驅(qū)動(dòng)電源設(shè)計(jì), 只用一路電源電壓VCC即可完成高端N溝道MOS管和低端N溝道MOS管兩個(gè)功率開關(guān)器件的驅(qū)動(dòng),給實(shí)際應(yīng)用帶來(lái)極大的方便。 EG2104S自舉電路結(jié)構(gòu)如下圖所示,EG2104S可以使用外接一個(gè)自舉二極管和一個(gè)自舉電容自動(dòng)完成自舉升壓功能, 假定在下管開通、上管關(guān)斷期間VC自舉電容已充到足夠的電壓(Vc=VCC),當(dāng)HO輸出高電平時(shí)上管開通、下管關(guān)斷時(shí), VC自舉電容上的電壓將等效一個(gè)電壓源作為內(nèi)部驅(qū)動(dòng)器VB和VS的電源,完成高端N溝道MOS管的驅(qū)動(dòng)。
電機(jī)與MOS管搭建驅(qū)動(dòng)板連接見下表所示。
電機(jī)與MOS管搭建驅(qū)動(dòng)板連接
電機(jī) | MOS管搭建驅(qū)動(dòng)板 |
---|---|
M+ | M+ |
M- | M- |
MOS管搭建驅(qū)動(dòng)板與主控板連接見下表所示。
MOS管搭建驅(qū)動(dòng)板與主控板連接
MOS管搭建驅(qū)動(dòng)板 | 主控板 |
---|---|
PWM1 | PA9 |
PWM2 | PA8 |
SD | PG12 |
電源輸入:5V | 5V |
電源輸入:GND | GND |
推薦使用配套的牛角排線直接連接驅(qū)動(dòng)板和主控板。
4.4.3. 軟件設(shè)計(jì)
這里只講解核心的部分代碼,有些變量的設(shè)置,頭文件的包含等并沒(méi)有涉及到,完整的代碼請(qǐng)參考本章配套的工程。 我們創(chuàng)建了四個(gè)文件:bsp_general_tim.c、bsp_general_tim.h、bsp_motor_control.c和bsp_motor_control.h 文件用來(lái)存定時(shí)器驅(qū)動(dòng)和電機(jī)控制程序及相關(guān)宏定義。
4.4.3.1. 編程要點(diǎn)
- 定時(shí)器 IO 配置
- 定時(shí)器時(shí)基結(jié)構(gòu)體TIM_TimeBaseInitTypeDef配置
- 定時(shí)器輸出比較結(jié)構(gòu)體TIM_OCInitTypeDef配置
- 根據(jù)定時(shí)器定義電機(jī)控制相關(guān)函數(shù)
bsp_general_tim.h-宏定義
/*宏定義*/
#define PWM_TIM TIM1
#define PWM_TIM_GPIO_AF GPIO_AF1_TIM1
#define PWM_TIM_CLK_ENABLE() __TIM1_CLK_ENABLE()
#define PWM_CHANNEL_1 TIM_CHANNEL_1
#define PWM_CHANNEL_2 TIM_CHANNEL_2
/* 累計(jì) TIM_Period個(gè)后產(chǎn)生一個(gè)更新或者中斷*/
/* 當(dāng)定時(shí)器從0計(jì)數(shù)到PWM_PERIOD_COUNT,即為PWM_PERIOD_COUNT+1次,為一個(gè)定時(shí)周期 */
#define PWM_PERIOD_COUNT (5600)
/* 通用控制定時(shí)器時(shí)鐘源TIMxCLK = HCLK=168MHz */
/* 設(shè)定定時(shí)器頻率為=TIMxCLK/(PWM_PRESCALER_COUNT+1) */
#define PWM_PRESCALER_COUNT (2)
/* 最大比較值 */
#define PWM_MAX_PERIOD_COUNT (PWM_PERIOD_COUNT - 100)
/*PWM引腳*/
#define PWM_TIM_CH1_GPIO_PORT GPIOA
#define PWM_TIM_CH1_PIN GPIO_PIN_8
#define PWM_TIM_CH2_GPIO_PORT GPIOA
#define PWM_TIM_CH2_PIN GPIO_PIN_9
#define PWM_TIM_CH3_GPIO_PORT GPIOA
#define PWM_TIM_CH3_PIN GPIO_PIN_10
使用宏定義非常方便程序升級(jí)、移植。 如果使用不同的定時(shí)器IO,修改這些宏即可。
定時(shí)器復(fù)用功能引腳初始化
定時(shí)器復(fù)用功能引腳初始化
static void TIMx_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
/* 定時(shí)器通道功能引腳端口時(shí)鐘使能 */
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/* 定時(shí)器通道1功能引腳IO初始化 */
/*設(shè)置輸出類型*/
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
/*設(shè)置引腳速率 */
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
/*設(shè)置復(fù)用*/
GPIO_InitStruct.Alternate = PWM_TIM_GPIO_AF;
/*選擇要控制的GPIO引腳*/
GPIO_InitStruct.Pin = PWM_TIM_CH1_PIN;
/*調(diào)用庫(kù)函數(shù),使用上面配置的GPIO_InitStructure初始化GPIO*/
HAL_GPIO_Init(PWM_TIM_CH1_GPIO_PORT, &GPIO_InitStruct);
GPIO_InitStruct.Pin = PWM_TIM_CH2_PIN;
HAL_GPIO_Init(PWM_TIM_CH2_GPIO_PORT, &GPIO_InitStruct);
}
定時(shí)器通道引腳使用之前必須設(shè)定相關(guān)參數(shù),這選擇復(fù)用功能,并指定到對(duì)應(yīng)的定時(shí)器。 使用GPIO之前都必須開啟相應(yīng)端口時(shí)鐘。
定時(shí)器模式配置 [
TIM_HandleTypeDef TIM_TimeBaseStructure;
static void TIM_PWMOUTPUT_Config(void)
{
TIM_OC_InitTypeDef TIM_OCInitStructure;
/*使能定時(shí)器*/
PWM_TIM_CLK_ENABLE();
TIM_TimeBaseStructure.Instance = PWM_TIM;
/* 累計(jì) TIM_Period個(gè)后產(chǎn)生一個(gè)更新或者中斷*/
//當(dāng)定時(shí)器從0計(jì)數(shù)到PWM_PERIOD_COUNT,即為PWM_PERIOD_COUNT+1次,為一個(gè)定時(shí)周期
TIM_TimeBaseStructure.Init.Period = PWM_PERIOD_COUNT - 1;
// 通用控制定時(shí)器時(shí)鐘源TIMxCLK = HCLK/2=84MHz
// 設(shè)定定時(shí)器頻率為=TIMxCLK/(PWM_PRESCALER_COUNT+1)
TIM_TimeBaseStructure.Init.Prescaler = PWM_PRESCALER_COUNT - 1;
/*計(jì)數(shù)方式*/
TIM_TimeBaseStructure.Init.CounterMode = TIM_COUNTERMODE_UP;
/*采樣時(shí)鐘分頻*/
TIM_TimeBaseStructure.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;
/*初始化定時(shí)器*/
HAL_TIM_PWM_Init(&TIM_TimeBaseStructure);
/*PWM模式配置*/
TIM_OCInitStructure.OCMode = TIM_OCMODE_PWM1;
TIM_OCInitStructure.Pulse = 0;
TIM_OCInitStructure.OCPolarity = TIM_OCPOLARITY_HIGH;
TIM_OCInitStructure.OCNPolarity = TIM_OCPOLARITY_HIGH;
TIM_OCInitStructure.OCIdleState = TIM_OCIDLESTATE_SET;
TIM_OCInitStructure.OCNIdleState = TIM_OCNIDLESTATE_RESET;
TIM_OCInitStructure.OCFastMode = TIM_OCFAST_DISABLE;
/*配置PWM通道*/
HAL_TIM_PWM_ConfigChannel(&TIM_TimeBaseStructure, &TIM_OCInitStructure, PWM_CHANNEL_1);
/*開始輸出PWM*/
HAL_TIM_PWM_Start(&TIM_TimeBaseStructure,PWM_CHANNEL_1);
/*配置脈寬*/
TIM_OCInitStructure.Pulse = 0; // 默認(rèn)占空比為50%
/*配置PWM通道*/
HAL_TIM_PWM_ConfigChannel(&TIM_TimeBaseStructure, &TIM_OCInitStructure, PWM_CHANNEL_2);
/*開始輸出PWM*/
HAL_TIM_PWM_Start(&TIM_TimeBaseStructure,PWM_CHANNEL_2);
}
首先定義兩個(gè)定時(shí)器初始化結(jié)構(gòu)體,定時(shí)器模式配置函數(shù)主要就是對(duì)這兩個(gè)結(jié)構(gòu)體的成員進(jìn)行初始化, 然后通過(guò)相應(yīng)的初始化函數(shù)把這些參數(shù)寫入定時(shí)器的寄存器中。 有關(guān)結(jié)構(gòu)體的成員介紹請(qǐng)參考定時(shí)器詳解章節(jié)。
不同的定時(shí)器可能對(duì)應(yīng)不同的APB總線,在使能定時(shí)器時(shí)鐘是必須特別注意。 通用控制定時(shí)器屬于APB1, 定時(shí)器內(nèi)部時(shí)鐘是84MHz。
在時(shí)基結(jié)構(gòu)體中我們?cè)O(shè)置定時(shí)器周期參數(shù)為PWM_PERIOD_COUNT(5599),頻率為15KHz,使用向上計(jì)數(shù)方式。 因?yàn)槲覀兪褂玫氖莾?nèi)部時(shí)鐘,所以外部時(shí)鐘采樣分頻成員不需要設(shè)置,重復(fù)計(jì)數(shù)器我們沒(méi)用到,也不需要設(shè)置。
在輸出比較結(jié)構(gòu)體中,設(shè)置輸出模式為PWM1模式,通道輸出高電平有效,設(shè)置脈寬為ChannelPulse, ChannelPulse是我們定義的一個(gè)無(wú)符號(hào)16位整形的全局變量,用來(lái)指定占空比大小, 實(shí)際上脈寬就是設(shè)定比較寄存器CCR的值,用于跟計(jì)數(shù)器CNT的值比較。
最后使用HAL_TIM_PWM_Start函數(shù)讓計(jì)數(shù)器開始計(jì)數(shù)和通道輸出。
bsp_motor_control.h-電機(jī)方向控制枚舉
/* 電機(jī)方向控制枚舉 */
typedef enum
{
MOTOR_FWD = 0,
MOTOR_REV,
}motor_dir_t;
在這里枚舉了兩個(gè)變量,用于控制電機(jī)的正轉(zhuǎn)與反轉(zhuǎn)。 注意 :在這里并不規(guī)定什么方向是正轉(zhuǎn)與反轉(zhuǎn), 這個(gè)是你自己定義的。
變量定義
/* 私有變量 */
static motor_dir_t direction = MOTOR_FWD; // 記錄方向
static uint16_t dutyfactor = 0; // 記錄占空比
定義兩個(gè)私有變量,direction用于記錄電機(jī)旋轉(zhuǎn)方向,dutyfactor用于記錄當(dāng)前設(shè)置的占空比。
定時(shí)器到電機(jī)控制的宏接口 [
/* 設(shè)置速度(占空比) */
#define SET_FWD_COMPAER(ChannelPulse) TIM1_SetPWM_pulse(PWM_CHANNEL_1,ChannelPulse) // 設(shè)置比較寄存器的值
#define SET_REV_COMPAER(ChannelPulse) TIM1_SetPWM_pulse(PWM_CHANNEL_2,ChannelPulse) // 設(shè)置比較寄存器的值
/* 使能輸出 */
#define MOTOR_FWD_ENABLE() HAL_TIM_PWM_Start(&TIM_TimeBaseStructure,PWM_CHANNEL_1); // 使能 PWM 通道 1
#define MOTOR_REV_ENABLE() HAL_TIM_PWM_Start(&TIM_TimeBaseStructure,PWM_CHANNEL_2); // 使能 PWM 通道 2
/* 禁用輸出 */
#define MOTOR_FWD_DISABLE() HAL_TIM_PWM_Stop(&TIM_TimeBaseStructure,PWM_CHANNEL_1); // 禁用 PWM 通道 1
#define MOTOR_REV_DISABLE() HAL_TIM_PWM_Stop(&TIM_TimeBaseStructure,PWM_CHANNEL_2); // 禁用 PWM 通道 2
使用宏定義非常方便程序升級(jí)、移植。 如果使用不同的定時(shí)器IO,修改這些宏即可。
設(shè)置電機(jī)速度
void set_motor_speed(uint16_t v)
{
dutyfactor = v;
if (direction == MOTOR_FWD)
{
SET_FWD_COMPAER(dutyfactor); // 設(shè)置速度
}
else
{
SET_REV_COMPAER(dutyfactor); // 設(shè)置速度
}
}
根據(jù)電機(jī)的旋轉(zhuǎn)方向來(lái)設(shè)置電機(jī)的速度(占空比),并記錄下設(shè)置的占空比,方便在切換旋轉(zhuǎn) 方向時(shí)設(shè)置另一路為相同的占空比。
設(shè)置電機(jī)方向
void set_motor_direction(motor_dir_t dir)
{
direction = dir;
if (direction == MOTOR_FWD)
{
SET_FWD_COMPAER(dutyfactor); // 設(shè)置速度
SET_REV_COMPAER(0); // 設(shè)置占空比為 0
}
else
{
SET_FWD_COMPAER(0); // 設(shè)置速度
SET_REV_COMPAER(dutyfactor); // 設(shè)置占空比為 0
}
}
將一路PWM的占空比設(shè)置為0,另一路用于設(shè)置速度。
主要
/**
* @brief 主函數(shù)
* @param 無(wú)
* @retval 無(wú)
*/
int main(void)
{
__IO uint16_t ChannelPulse = PWM_MAX_PERIOD_COUNT/2;
uint8_t i = 0;
/* 初始化系統(tǒng)時(shí)鐘為168MHz */
SystemClock_Config();
/* 初始化按鍵GPIO */
Key_GPIO_Config();
/* 電機(jī)初始化 */
motor_init();
set_motor_disable();
set_motor_speed(ChannelPulse);
while(1)
{
/* 掃描KEY1 */
if( Key_Scan(KEY1_GPIO_PORT, KEY1_PIN) == KEY_ON)
{
/* 使能電機(jī) */
set_motor_enable();
}
/* 掃描KEY2 */
if( Key_Scan(KEY2_GPIO_PORT, KEY2_PIN) == KEY_ON)
{
set_motor_disable();
}
/* 掃描KEY3 */
if( Key_Scan(KEY3_GPIO_PORT, KEY3_PIN) == KEY_ON)
{
/* 增大占空比 */
ChannelPulse += PWM_MAX_PERIOD_COUNT/10;
if(ChannelPulse > PWM_MAX_PERIOD_COUNT)
ChannelPulse = PWM_MAX_PERIOD_COUNT;
set_motor_speed(ChannelPulse);
}
/* 掃描KEY4 */
if( Key_Scan(KEY4_GPIO_PORT, KEY4_PIN) == KEY_ON)
{
if(ChannelPulse < PWM_MAX_PERIOD_COUNT/10)
ChannelPulse = 0;
else
ChannelPulse -= PWM_MAX_PERIOD_COUNT/10;
set_motor_speed(ChannelPulse);
}
/* 掃描KEY5 */
if( Key_Scan(KEY5_GPIO_PORT, KEY5_PIN) == KEY_ON)
{
/* 轉(zhuǎn)換方向 即Forward,正轉(zhuǎn)運(yùn)行;相對(duì)地,REV,即Reverse,反轉(zhuǎn)運(yùn)行
采用三元運(yùn)算符 i是奇數(shù)是反轉(zhuǎn)運(yùn)行,i是偶數(shù)是正轉(zhuǎn)運(yùn)行,*/
set_motor_direction( (++i % 2) ? MOTOR_FWD : MOTOR_REV);
}
}
}
首先初始化系統(tǒng)時(shí)鐘,然后初始化定時(shí)器和按鍵,將占空比設(shè)置為50%。 在死循環(huán)里面掃描按鍵,KEY1按下使能電機(jī)驅(qū)動(dòng)板,KEY2按下失能電機(jī)驅(qū)動(dòng)板,KEY3按鍵按下增加速度(占空比),KEY4按鍵按下減少速度(占空比), KEY5按鍵按下切換電機(jī)旋轉(zhuǎn)方向。 (轉(zhuǎn)換方向 即Forward,正轉(zhuǎn)運(yùn)行; 相對(duì)地,REV,即Reverse,反轉(zhuǎn)運(yùn)行,采用三元運(yùn)算符:i是奇數(shù)是反轉(zhuǎn)運(yùn)行,i是偶數(shù)是正轉(zhuǎn)運(yùn)行)
4.4.4. 下載驗(yàn)證
如果有條件的話,這里我們先不連接電機(jī),先通過(guò)示波器連接到開發(fā)板的PWM輸出引腳上,通過(guò)示波器來(lái)觀察PWM 的變化情況:
- 使用DAP連接開發(fā)板到電腦;
- 使用示波器的CH1連接到PA15,CH2連接到PB3,注意示波器要與開發(fā)板共地;
- 給開發(fā)板供電,編譯下載配套源碼,復(fù)位開發(fā)板。
上電后我們通過(guò)示波器可以觀察到兩個(gè)通道都是低電平,當(dāng)按下KEY1后,使能PWM輸出,按KEY3可以增加CH1通道的占空比, ,按KEY4可以減小占空比,按KEY5可以交換PWM輸出,如下圖所示。
在上圖中黃色波形為CH1通道,藍(lán)色波形為CH2通道,按下一次KEY1后,能使PWM輸出。 此時(shí)可以通過(guò)計(jì)算示波器上顯示的波形在占空比和頻率, 通過(guò)波形計(jì)算也與理論相符,這說(shuō)明我們的PWM的配置是正確的,其中CH2通道的波形 一直為低電平。 當(dāng)CH1和CH2都為低電平時(shí),電機(jī)停止轉(zhuǎn)動(dòng)。 當(dāng)CH1上的平均電壓大于電機(jī)的啟動(dòng)電壓后電機(jī)就 可以轉(zhuǎn)動(dòng)了,電源電壓為12V,占空比為D,則平均電壓為:12V*D。 當(dāng)按下KEY5后兩通道輸出相反,CH1一直為 低電平,CH2為PWM波,電機(jī)反向轉(zhuǎn)動(dòng)。
在確定PWM輸出正確后我們就可以接上電機(jī)進(jìn)行驗(yàn)證我們的程序了。
按鍵操作:
- KEY1:使能電機(jī)
- KEY2:禁用電機(jī)
- KEY3:加速
- KEY4:減速比
- KEY5:換向
可以通過(guò)按鍵來(lái)操作來(lái)觀察電機(jī)的執(zhí)行效果
評(píng)論