<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          關(guān) 閉

          新聞中心

          EEPW首頁(yè) > 工控自動(dòng)化 > 設(shè)計(jì)應(yīng)用 > 高級(jí)電機(jī)控制中的軟件設(shè)計(jì)原則

          高級(jí)電機(jī)控制中的軟件設(shè)計(jì)原則

          作者: 時(shí)間:2016-10-10 來(lái)源:網(wǎng)絡(luò) 收藏

          運(yùn)行在300W以下的小功率電機(jī)被廣泛應(yīng)用于各類應(yīng)用,例如汽車系統(tǒng)、打印機(jī)、復(fù)印機(jī)、碎紙機(jī)、玩具、工廠自動(dòng)化、測(cè)試設(shè)備、機(jī)器人技術(shù)、航空航天與軍工以及其他應(yīng)用。最流行的小功率電機(jī)類型是DC電機(jī)、無(wú)刷DC電機(jī)和步進(jìn)電機(jī)。電機(jī)的產(chǎn)量大致與功率大小成反比。量產(chǎn)的小功率電機(jī)數(shù)量遠(yuǎn)遠(yuǎn)高于大功率電機(jī)數(shù)量。

          本文引用地址:http://www.ex-cimer.com/article/201610/306753.htm

          專用于的DSP設(shè)計(jì)旨在滿足大型離線式電機(jī)的需求。離線電機(jī)通常為AC感應(yīng)或無(wú)刷DC電機(jī),運(yùn)行在110-480VAC和1/4-100HP。專用于的DSP對(duì)于小功率系統(tǒng)來(lái)說(shuō)成本太高。

          本文展示了使用C8051F3xx MCU控制各類電機(jī)的軟件示例。雖然這些示例相對(duì)簡(jiǎn)單,但是他們?yōu)楦黝愲姍C(jī)展示了有效的解決方案。一個(gè)傳統(tǒng)的電機(jī)控制系統(tǒng)通常要求額外特性并且具有更高的復(fù)雜度。這些軟件示例能夠作為開發(fā)更復(fù)雜電機(jī)驅(qū)動(dòng)系統(tǒng)的起點(diǎn)。

          DC電機(jī)控制

          DC電機(jī)在小功率電機(jī)中是最常見和最便宜的。在本文中,術(shù)語(yǔ)“DC電機(jī)”特指有刷換向永磁DC電機(jī)。

          DC電機(jī)的特性使得它成為變速系統(tǒng)中使用的最簡(jiǎn)單電機(jī)。DC電機(jī)的轉(zhuǎn)矩—速度特性如圖1所示。DC電機(jī)的非負(fù)載速度與電機(jī)電源電壓成線性關(guān)系。驅(qū)動(dòng)穩(wěn)定扭矩負(fù)載、線性負(fù)載或指數(shù)負(fù)載的DC電機(jī)的電壓—速度特性也是連續(xù)的、正斜率的和可預(yù)測(cè)的。因此,在大多數(shù)情況下使用開環(huán)控制是可行的。

          1.jpg

          圖1-DC電機(jī)特性

          簡(jiǎn)單地改變通過(guò)電機(jī)的電壓,任何人都能夠控制電機(jī)的速度。PWM能夠用于改變電機(jī)供電電壓。加載到電機(jī)的平均電壓與PWM占空比成正比例關(guān)系(這里忽略電機(jī)自感和不連續(xù)運(yùn)行導(dǎo)致的次要影響)。

          使用F3xx MCU提供簡(jiǎn)單的DC電機(jī)速度控制的一個(gè)簡(jiǎn)單的例子。在這個(gè)示例中使用ADC讀取電位器的位置信息,并且使用PCA 8位PWM模式輸出對(duì)應(yīng)的PWM信號(hào)。硬件配置如圖2所示。

          2.jpg

          圖2-DC電機(jī)驅(qū)動(dòng)電路

          單個(gè)N溝道功率MOSFET Q1用于驅(qū)動(dòng)DC電機(jī)。功率MOSFET應(yīng)當(dāng)根據(jù)特定的電機(jī)電壓和電流需求進(jìn)行選擇。單向?qū)ǖ亩O管D1跨連到DC電機(jī)。當(dāng)MOSFET關(guān)閉時(shí),電流通過(guò)電機(jī)自感繼續(xù)流動(dòng)。MOSFET漏極電壓將上升到超過(guò)電機(jī)電源電壓的一個(gè)二極管壓降。然后,電流通過(guò)單向?qū)ǘO管繼續(xù)流動(dòng)。

          大多數(shù)低壓電機(jī)驅(qū)動(dòng)電路利用肖特基功率整流器實(shí)現(xiàn)單向?qū)ǘO管。肖特基整流器具有較低的正向電壓和極短的反向恢復(fù)時(shí)間。這兩者在電機(jī)驅(qū)動(dòng)應(yīng)用中都是非常重要的參數(shù)因子。

          功率MOSFET由反向門驅(qū)動(dòng)器驅(qū)動(dòng)。F300的端口引腳默認(rèn)配置為輸入引腳,并且使能弱的100k歐姆上拉電阻。在端口被配置而且交叉開關(guān)器和外設(shè)使能之前,端口引腳一直保持高電平。當(dāng)復(fù)位引腳保持低電平時(shí),端口引腳也會(huì)被配置為弱上拉使能的輸入引腳。通過(guò)使用反向驅(qū)動(dòng)器,功率晶體管在默認(rèn)狀態(tài)下處于關(guān)閉狀態(tài)。如果使用非反相器驅(qū)動(dòng),10k歐姆下拉電阻應(yīng)當(dāng)連接端口引腳和地之間。

          為了使用3V微控制器,門驅(qū)動(dòng)器應(yīng)當(dāng)具有3V兼容的輸入電平臨界值。如果電機(jī)電壓在5V和15V之間,門驅(qū)動(dòng)器能夠直接切斷電機(jī)電源電壓。如果電機(jī)電壓超過(guò)15V,分開的門驅(qū)動(dòng)器電源電壓是需要的,通常為5V或者12V。當(dāng)采用低于10V的門驅(qū)動(dòng)器電源電壓時(shí),應(yīng)當(dāng)使用邏輯電平功率MOSFET。

          軟件實(shí)現(xiàn)非常簡(jiǎn)單。main()函數(shù)初始化時(shí)鐘、端口和外設(shè),然后進(jìn)入while(1)循環(huán)。在while(1)中使用avgADC()函數(shù)讀取電位器電壓值,然后輸出這個(gè)值到8位PWM。

          PORT_Init()函數(shù)配置端口I/O、外設(shè)、使能數(shù)字交叉開關(guān)器。在這里,為8位PWM使能輸出引腳,為門驅(qū)動(dòng)器使能推挽式輸出引腳。

          系統(tǒng)時(shí)鐘SYSCLK被配置運(yùn)行在24.5MHz最大速率,這允許8位PWM可配置為160ns時(shí)鐘周期和24kHz頻率。

          ADC0_Init()函數(shù)配置ADC為查詢模式。ADC增益設(shè)定為1,并且為ADC時(shí)鐘選擇1MHz保守頻率。重要的是這里也要初始化電壓參考,配置ADC使用VDD滿量程。

          函數(shù)readADC()采用查詢模式讀取電壓值一次,并返回ADC值。函數(shù)avgADC()調(diào)用readADC()函數(shù),并且返回64個(gè)采樣值的平均值。平均化ADC讀數(shù)可以最小化噪聲影響,減少PWM輸出抖動(dòng)。

          當(dāng)使用PCA 8位PWM模式時(shí),在CEX0輸出0x00值對(duì)應(yīng)到100%的占空比,輸出0xFF值對(duì)應(yīng)到0.39%的占空比。0%的占空比可以通過(guò)清除PCA0CPM0 SFR中的ECOM0位來(lái)實(shí)現(xiàn)。

          當(dāng)使用反相驅(qū)動(dòng)器時(shí),這種關(guān)系是相反的。在MOSFET門驅(qū)動(dòng)器上,0x00值對(duì)應(yīng)到0%的占空比,0xFF值對(duì)應(yīng)到99.6%的占空比。為了簡(jiǎn)單起見,本文中所有使用8位PWM的軟件示例都僅限于使用99.6%PWM。

          還有一些情況,100%的占空比是可取的。100%占空比將有效地消除開關(guān)損耗。由于MOSFET從不會(huì)關(guān)閉,因此在MOSFET上沒(méi)有開關(guān)損耗,在二極管上也沒(méi)有損失。唯一的功率損耗是功率MOSFET中的傳導(dǎo)損耗。如果電機(jī)預(yù)計(jì)在大部分時(shí)間里都處于全速運(yùn)行,那么100%的最大占空比是合理的。100%的占空比可以通過(guò)清除PCA0CPM0 SFR中的ECOM0位來(lái)實(shí)現(xiàn)。

          帶反轉(zhuǎn)能力的DC電機(jī)

          永磁DC電動(dòng)機(jī)通常被用于需要反轉(zhuǎn)電機(jī)方向的應(yīng)用中。為了反轉(zhuǎn)旋轉(zhuǎn)方向,需要反轉(zhuǎn)電機(jī)上電壓的極性。這需要使用H橋。如圖3所示,H橋有4個(gè)晶體管。當(dāng)在正方向驅(qū)動(dòng)電機(jī)時(shí),Q4打開,PWM信號(hào)應(yīng)用于晶體管Q1。在反方向上驅(qū)動(dòng)電機(jī),Q3打開,PWM信號(hào)應(yīng)用于晶體管Q2。在這個(gè)示例中,下部的晶體管被用于PWM速度控制,上部的晶體管被用于轉(zhuǎn)向。使用這種拓?fù)浣Y(jié)構(gòu),可以在兩個(gè)方向上提供變速控制。

          3.jpg

          圖3-DC電機(jī)全橋電路

          在圖3中,N溝道功率MOSFET被用于低壓側(cè)晶體管,P溝道功率MOSFET被用于高壓側(cè)晶體管。對(duì)于驅(qū)動(dòng)20V以下的DC電機(jī)來(lái)說(shuō),利用互補(bǔ)功率MOSFET是非常符合成本效益的。如圖3所示,低壓側(cè)門驅(qū)動(dòng)器帶有反相器,而高壓側(cè)門驅(qū)動(dòng)器沒(méi)有反相器。門驅(qū)動(dòng)器極性被選擇以確保當(dāng)端口引腳在弱上拉使能的復(fù)位配置模式下,功率晶體管處于關(guān)閉狀態(tài)。

          該示例軟件構(gòu)建在基本示例代碼上。主循環(huán)現(xiàn)在包括一個(gè)if語(yǔ)句檢查反轉(zhuǎn)開關(guān)SW1的狀態(tài)。當(dāng)反轉(zhuǎn)按鍵被按下時(shí),PWM禁止,同時(shí)所有P0輸出禁止。當(dāng)按鍵釋放后,電機(jī)將反轉(zhuǎn)方向。

          除了增加額外的推挽式輸出引腳配置之外,示例軟件中的初始化函數(shù)類似于示例1。

          調(diào)用reverse()函數(shù)反轉(zhuǎn)電機(jī)方向。標(biāo)志位Fwd用于保存電機(jī)狀態(tài)。Fwd位被切換用于判斷哪些輸出需要激活。

          反轉(zhuǎn)電機(jī)還存在一個(gè)潛在的問(wèn)題。當(dāng)反轉(zhuǎn)開關(guān)SW1被按下時(shí),電機(jī)可能由于電機(jī)慣性而繼續(xù)旋轉(zhuǎn)一些時(shí)間。當(dāng)電機(jī)正在轉(zhuǎn)動(dòng)時(shí),它將產(chǎn)生與電機(jī)速度成比例關(guān)系的反向電動(dòng)勢(shì)。如果電機(jī)停止旋轉(zhuǎn)之前反向按鍵被釋放,電機(jī)反向電動(dòng)勢(shì)將通過(guò)上部晶體管而短路,如下所述。

          參考圖4,假設(shè)開始時(shí)Q4處于打開狀態(tài),電機(jī)正在正方向上旋轉(zhuǎn)。假設(shè)電機(jī)正在運(yùn)行,并且反向電動(dòng)勢(shì)大約為6V?,F(xiàn)在反轉(zhuǎn)開關(guān)被按下,所有4個(gè)晶體管被關(guān)閉。電機(jī)右側(cè)將比左側(cè)高約6V。然后開關(guān)釋放,打開Q3。電機(jī)左側(cè)被上拉到電源電壓,電機(jī)的反向電動(dòng)勢(shì)通過(guò)Q4的內(nèi)部二極管而短路。

          最終的結(jié)果是,電機(jī)停止,在電機(jī)機(jī)械慣性中儲(chǔ)存的所有能量被注入Q4。反轉(zhuǎn)過(guò)程中很容易損壞上部晶體管。在一些具有較大摩擦力負(fù)載的應(yīng)用中,一個(gè)固定延遲時(shí)間可以確保電機(jī)有足夠時(shí)間停止。而在其他應(yīng)用中,電機(jī)可能需要花費(fèi)幾秒鐘才完全停止。這個(gè)問(wèn)題的通用解決方案,如圖4所示。

          4.jpg

          圖4–DC電機(jī)反轉(zhuǎn)危害

          帶有軟反轉(zhuǎn)能力的DC電機(jī)

          這個(gè)用于DC電機(jī)的軟件示例基于第二個(gè)示例,提供軟反轉(zhuǎn)能力。為了安全的反轉(zhuǎn)DC電機(jī),我們需要判斷電機(jī)是否還處于運(yùn)轉(zhuǎn)中。

          確定電機(jī)是否仍然處于旋轉(zhuǎn)狀態(tài)的簡(jiǎn)單而有效方法是測(cè)量跨接在電機(jī)端子上的電壓差。ADC能夠被配置去測(cè)量模擬多路選擇器中的任意兩個(gè)輸入引腳上的差分電壓。可編程的窗口檢測(cè)器也可以用于判斷差分電壓是否屬于預(yù)設(shè)極限。在這個(gè)示例軟件中,如果差分電機(jī)電壓在100ms內(nèi)保持在滿量程的3%以下,那么電機(jī)開始反轉(zhuǎn)。

          帶有電壓感應(yīng)功能的DC電機(jī)驅(qū)動(dòng)的硬件實(shí)現(xiàn)類似于在電機(jī)端子上分別添加兩個(gè)電阻分壓器,如圖5所示。

          5.jpg

          圖5–帶有電壓感應(yīng)能力的DC電機(jī)驅(qū)動(dòng)

          主循環(huán)已經(jīng)被改進(jìn)用來(lái)檢測(cè)電機(jī)是否停止。detectStop()函數(shù)首先配置ADC去測(cè)量差分電壓。ADC和窗口檢測(cè)器都適用于查詢模式。如果ADC值在預(yù)設(shè)窗口范圍內(nèi),那么計(jì)數(shù)器增加。使用實(shí)現(xiàn)10ms延遲的定時(shí)器T0設(shè)置采樣時(shí)間。任何在窗口之外的采樣值將重置計(jì)時(shí)器。退出while循環(huán)之前,它將使用10個(gè)連續(xù)的采樣值。返回到主循環(huán)之前,detectStop()函數(shù)將重新配置ADC去測(cè)量速度電位器。

          無(wú)刷DC電機(jī)控制

          無(wú)刷DC(BLDC)電機(jī)擁有一些傳統(tǒng)有刷換向DC電機(jī)所沒(méi)有的優(yōu)勢(shì)。電子和傳感器有效地替代了電刷的角色,提供更長(zhǎng)的壽命,減少維護(hù)操作,并且沒(méi)有電刷噪聲。正確整流的BLDC電機(jī)的扭矩—速度特性完全相同于如圖1所示的DC電機(jī)。

          因此,無(wú)刷DC電機(jī)展現(xiàn)出與DC電機(jī)相同的滿足需求的品質(zhì),非常適用于變速控制。這個(gè)示例為使用霍爾效應(yīng)傳感器控制電機(jī)換向的BLDC提供簡(jiǎn)單的開環(huán)控制。BLDC電機(jī)的速度使用簡(jiǎn)單的電位器控制。在這種方式下的BLDC電機(jī)控制的特點(diǎn)類似于經(jīng)典DC電機(jī)控制示例。

          這個(gè)示例的硬件實(shí)現(xiàn)如圖6所示。由于BLDC電機(jī)需要額外的輸出,因此推薦C8051F330這個(gè)MCU。如果應(yīng)用需要更多的存儲(chǔ)資源,C8051F336也是不錯(cuò)的選擇,因?yàn)樗休^大的16kB代碼存儲(chǔ)空間,并且代碼兼容C8051F330。電機(jī)由6個(gè)功率晶體管驅(qū)動(dòng),構(gòu)成三相橋式結(jié)構(gòu)。下部的晶體管Q1-3是N溝道功率MOSFET。上部的3個(gè)晶體管是P溝道功率MOSFET。這樣就簡(jiǎn)化了門驅(qū)動(dòng)器管理。此外,互補(bǔ)門驅(qū)動(dòng)器的使用使得在默認(rèn)狀態(tài)下功率晶體管處于關(guān)閉狀態(tài)。

          6.jpg

          圖6–無(wú)刷DC電機(jī)驅(qū)動(dòng)

          霍爾效應(yīng)傳感器有開集電極輸出,需要上拉電阻。檢查電機(jī)規(guī)格確?;魻栃?yīng)傳感器是適合配置的。開集電極輸出通常是3V兼容的。然而,霍爾效應(yīng)傳感器也需要一個(gè)偏置電源,通常需要超過(guò)3V。在大多數(shù)系統(tǒng)中,霍爾效應(yīng)傳感器能夠關(guān)閉電機(jī)電源電壓或者門驅(qū)動(dòng)器電源電壓。

          使用斷點(diǎn)調(diào)試軟件可能會(huì)將電機(jī)和MOSFET置于不良狀態(tài)。當(dāng)MCU遇到一個(gè)斷點(diǎn)時(shí),引腳被及時(shí)有效地凍結(jié),而且可以留下PWM輸出處于激活狀態(tài)。這里推薦的流程是在進(jìn)行單步調(diào)試或者使用斷點(diǎn)之前,一直斷開電機(jī)電源連接。BLDC電機(jī)在跨越繞組時(shí)將會(huì)滿電壓失速。BLDC電機(jī)失速電流僅僅與繞組的內(nèi)阻相關(guān)。這很可能損壞功率MOSFET。

          BLDC電機(jī)示例軟件包含許多新的元素,如下所述。

          PORT_Init()函數(shù)對(duì)交叉開關(guān)器和輸出引腳分配進(jìn)行設(shè)置。額外的控制引腳為3相控制而設(shè)置為推挽式輸出,為讀取霍爾傳感器而設(shè)置為輸入。

          可編程計(jì)數(shù)器陣列時(shí)基采用160ns,啟動(dòng)計(jì)數(shù)器。然而,模塊0模式SFR沒(méi)有初始化為8位PWM。在霍爾效應(yīng)位置被確定之前,沒(méi)有電機(jī)驅(qū)動(dòng)被啟動(dòng)。

          main()函數(shù)首先初始化相關(guān)資源,設(shè)置start標(biāo)志位。主循環(huán)首先使用hallPosition()函數(shù)檢測(cè)霍爾效應(yīng)傳感器的位置。如果start標(biāo)志位被設(shè)置或者霍爾位置已經(jīng)改變,電機(jī)通過(guò)調(diào)用commutate()函數(shù)進(jìn)行換向。接下來(lái),速度輸入被讀取,速度設(shè)置被寫入PWM輸出。

          hallPosition()函數(shù)在錯(cuò)誤狀態(tài)時(shí)返回0。這發(fā)生在霍爾效應(yīng)輸入全為高或全為低時(shí)。如果錯(cuò)誤發(fā)生了,主循環(huán)通過(guò)調(diào)用coast()函數(shù)使所有輸出無(wú)效。起始位也在錯(cuò)誤條件發(fā)生時(shí)置位,從而迫使換向發(fā)生在下一個(gè)合法的霍爾位置讀數(shù)時(shí)。

          readHalls()函數(shù)在霍爾效應(yīng)輸入端口引腳上讀取并且去除霍爾效應(yīng)編碼抖動(dòng)。該函數(shù)等待三個(gè)連續(xù)的相同的讀數(shù)。當(dāng)霍爾編碼正在改變時(shí),這種方式可以降低錯(cuò)誤讀數(shù)的可能性。

          hallPosition()首先通過(guò)上面描述的readHalls()函數(shù)讀取霍爾效應(yīng)編碼?;魻柧幋a模式被儲(chǔ)存在常量數(shù)組hallPattern[]中。為了匹配霍爾效應(yīng)編碼,一個(gè)帶有后遞減的單行for循環(huán)被用于尋找對(duì)應(yīng)的索引。hallPosition()函數(shù)如果發(fā)現(xiàn)一個(gè)匹配的模式,則返回1-6中的一個(gè)值。如果沒(méi)有發(fā)現(xiàn)匹配,hallPosition()函數(shù)返回0值。

          commutate()函數(shù)用來(lái)在啟動(dòng)時(shí)初始化輸出,當(dāng)霍爾位置改變時(shí)改變輸出狀態(tài),并且在檢測(cè)到霍爾錯(cuò)誤后重新啟動(dòng)電機(jī)。commutate()函數(shù)首先禁止PWM和上部的晶體管。然后,它才使用從hallPosition()函數(shù)中獲得的索引。

          對(duì)于霍爾效應(yīng)模式或者整流模式來(lái)說(shuō)沒(méi)有統(tǒng)一的標(biāo)準(zhǔn)。用戶需要瀏覽你所使用的特定電機(jī)的制造商所提供的數(shù)據(jù)手冊(cè)。依據(jù)制造商的數(shù)據(jù)手冊(cè)仔細(xì)核查兩種模式。也要檢查霍爾效應(yīng)模式和整流模式之間的通信。必要時(shí)需要改變兩種模式之間的位移。



          關(guān)鍵詞: 電機(jī)控制

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();