標題: 基于單片機的直流伺服電機驅動調速控制設計 [打印本頁]

作者: chunpin    時間: 2018-12-28 15:58
標題: 基于單片機的直流伺服電機驅動調速控制設計
這是項目相關文檔,基于AT86C52設計關于直流伺服電機調速的
【項目目標】
1、知識目標:
掌握直流伺服電動機工作原理 ,掌握直流伺服電動機的特性 ,掌握直流伺服電動機的調速控制方法 。
2、能力目標:
要求會通過數(shù)字邏輯芯片或者單片機技術設計該直流伺服電機的驅動電路。
【重點難點】
1、重點:直流伺服電機的工作原理及其驅動電路設計
2、難點:直流電機的驅動電路設計
【相關知識】
本設計要求用單片機實現(xiàn)直流電機(學生自由選擇)的驅動調速控制,學生在項目進行前,有必要重新學習單片機課程。為了加快項目進度,可以選用本院學生普遍學習的AT89C51單片機為核心控制模塊。
【項目實施】
一、項目任務
1.實現(xiàn)對電機的啟動、停止、加速、減速、正轉、反轉的控制;
   2.通過編碼器實現(xiàn)對電機速度的檢測;
   3.實現(xiàn)對電機實時速度的顯示;
   4.設計電機驅動的硬件電路;
   5.編制驅動電機的單片機控制程序;
   6.要求電機穩(wěn)態(tài)工作性能好,電機速度可調范圍寬至少達到 0-1200r/min
二、項目實施:
1、制訂方案(2人一組),要求每小組方案盡量不同,如有雷同,視作抄襲
小組討論初步擬定實施方案。各小組查閱相關資料,制定各自的可行性方案。教師提供基本設計方案,如圖1,學生可在此基礎上擴展其功能。
圖1 基本設計方案
2、確定方案:
各小組交流、評價各個方案的優(yōu)缺點,確定實施方案。
3、實施方案:
    方案實施的基本技術路線如圖2所示。各小組可根據(jù)教師提供的基本技術路線,適時調整各自的計劃進度。由于時間和硬件條件限制,只需做到PROTEUS聯(lián)合仿真即可,有條件有興趣的同學可以完成整個方案的設計。可利用面包板、也可以利用PCB制版。
圖2基本技術路線圖
【項目評價】
1、成果展示
每個項目都要求學生以團隊的形式完成項目所要求的任務,在對每個團隊的項目進行驗收和總結時,以大賽的形式評價學生團隊的作品來調動學生的積極性。學生在項目作品展示時,與同類作品進行比較,展示自己的優(yōu)勢并發(fā)現(xiàn)不足,這比課堂上教師單純的教授知識點更具有說服力。
2、過程評價
每個項目的課程大賽成績可作為成績考核的主要依據(jù),比賽采取現(xiàn)場實操測試、答辯的形式,根據(jù)學生表現(xiàn)分配一定的分值。同時,采取學生項目作品互評形式,每個完成項目的學生可以對分配到的3-5個作品進行綜合評價,綜合評價結果可以分配一定的比例分值。在項目實施過程中,建立學生項目過程自評表,作為成績評定的一項依據(jù)。                                 
學生項目過程自評表
學科:控制電機     項目名稱:直流電機驅動控制系統(tǒng)設計    班級:      姓名:
類別
出勤3
學習態(tài)度6
準備工作7
項目方案9
創(chuàng)新能力9
溝通協(xié)作9
項目進度10
項目報告15
項目作業(yè)30
合計成績100
得分










項目實施方案

項目總結報告


【項目總結 】
通過本次項目訓練,可以讓同學們受益匪淺。一方面,學生將課堂上的理論知識應用到了實際,加強鞏固了理論知識,也提高了實際動手能力,通過實踐反饋,又了解到學生自身知識面的不足。另一方面,在實驗過程中,遇到問題時候,各個小組列出可能問題,一一進行排查,找出問題的所在,隊員之間分工明確,團結合作,本次訓練正是通過隊員之間的合作實現(xiàn)的。通過項目驅動形式,要求學生能綜合運用控制電機、單片機技術、PLC技術、Protues等課程的基本知識,進行融會貫通的獨立思考,充分調動學生學習的積極性和參與性。
【項目拓展】
(1)應用專用運動控制器LM629,結合單片機組成控制系統(tǒng)。
(2)加上一定的輕型負載,驗證驅動系統(tǒng)的帶負載能力。
案例僅為參考

直流電機調速系統(tǒng)設計案例報告

一、前言

在所有的機電設備當中,直流電動機具有優(yōu)良的調速特性,調速平滑,方便,調速范圍廣,過載能力大,能承受頻繁的沖擊負載,可實現(xiàn)頻繁的無級快速起動、制動和反轉;能滿足生產(chǎn)過程中自動化系統(tǒng)各種不同的特殊運行要求。傳統(tǒng)的晶閘管直流調速系統(tǒng),其控制叫路是基于模擬器件沒計的,這使得控制電路的硬件設備極其復雜,安裝調試困難,相對故障牢高。電動機調速系統(tǒng)采用微機實現(xiàn)自動控制,是電氣傳動發(fā)展的主要方向之一。本文設計了一種基于單片機的直流電機脈寬調速控制系統(tǒng),其控制方案依靠軟件實現(xiàn)。采樣、觸發(fā)、控制均采用數(shù)字處理,避免了模擬控制電路對元件參數(shù)的影響,且參數(shù)調整簡單方便,簡化了系統(tǒng),提高了電機工作穩(wěn)定性,延長了系統(tǒng)使用壽命。采用微機控制后,整個調速系統(tǒng)體積小、結構簡單、可靠性高、操作維護方便,電動機穩(wěn)態(tài)運轉時轉速精度可達到較高水平,靜動態(tài)各項指標均能較好地滿足工業(yè)生產(chǎn)中高性能電氣傳動的要求。直流凋速技術已廣泛戍用于現(xiàn)代工業(yè)、航天等各個領域。
二、總體方案設計
對于同一個研究的系統(tǒng),根據(jù)不同的要求和精確度,所用到的方案也不一樣,作出的具體要求如下:
1.實現(xiàn)對電機的啟動、停止、加速、減速、正轉、反轉的控制;
   2.通過編碼器實現(xiàn)對電機速度的檢測;
   3.實現(xiàn)對電機實時速度的顯示;
   4.設計電機驅動的硬件電路;
   5.編制驅動電機的單片機控制程序;
   6.要求電機穩(wěn)態(tài)工作性能好,電機速度可調范圍寬至少達到0-1200r/min  。      

通過軟件產(chǎn)生PWM信號,并由P3.2輸出,經(jīng)過驅動電路處理后供給直流電機,從而使直流電機在脈沖高電平時電得電,在低電平的時候失電。程序上通過使用延時模塊使得單片機在不同的時間段輸出不同的電平。啟動單片機,整個系統(tǒng)進入準備狀態(tài)。按下電路板上的啟動按鍵后,根據(jù)驅動路中由四個三極管構成的橋式電路的特點,當P2.4和P2.5為高電平,P2.6和P2.7為低電平時電機正;反之當P2.4和P2.5為低電平,P2.6和P2.7為高電平時電機反轉。根據(jù)加速和減速鍵,調整P3.2輸出脈沖的高低電平時的初始值,從而可以控制P3.2輸出高低電平時的占空比,進而控制直流電機的轉速。
                          圖 1 系統(tǒng)控制簡圖
三、 硬件電路設計 結合以往的設計經(jīng)驗,根據(jù)單片機系統(tǒng)的特點,針對硬件電路的設計作出以下兩點要求:(1)考慮到可以盡可能地簡化電路,應該盡可能使用集成度高功能性強的芯片;(2)考慮到電路修改優(yōu)化的情況要留有將來修改擴展的余地。(一)單片機最小系統(tǒng)的設計
單片機的最小系統(tǒng):所謂的單片機最小系統(tǒng)指的是由單片機和一些基本的外圍電路所組成的一個可以工作的單片機系統(tǒng)。需要在單片機18,19引腳之間連接晶振,并且在晶振兩邊分別并聯(lián)一個22UF的電容;另外還包括在單片機的復位引腳通過開關再接到地構成復位電路。通常來說,它包括單片機,復位電路和時鐘電路。
1.微處理器選擇及硬件介紹
圖2 STC89C52單片機引腳圖
    如圖2所示89C52單片機一共有40個引腳,其中20引腳和40引腳分別接地和接電源VCC,以提供合適的電壓給單片機工作。P0 ,P1,P2,P3這四組端口每一組都具有0到7號8個I\O口,一共是32個,這32個端口可以作為單片機的輸入端也可以作為它的輸出端,每一組端口的具體功能作用都有相同的部分也有不同之處,詳細的用法如下:
     P0口(P0.0——P0.7):它們屬于單片機上的39到32引腳,是雙向8位的三態(tài)輸入輸出口,每一個端口都可以獨立使用,在這次的設計中,P0口就是用作了驅動LED數(shù)碼管(分別接在了數(shù)碼管的8個陽極)。
   P1口(P1.1——P1.7):它們屬于單片機上的1腳到8腳,這8個端口也是可以獨立使用,但是這跟P0口有點不同,就是每一個端口內部已經(jīng)接上了上拉電阻,使得端口的輸出沒有高阻態(tài),輸入也沒有鎖存功能,所以說這并不是我們常說的輸入輸出口,而是作為“準雙向端口”。正是這些區(qū)別使得P1口的作用跟P0口有很大的區(qū)別。在本次的設計中P1.0到P1.3是用作驅動四個指示燈,而P1.4到P1.7是連接到了4個按鍵,用以把按鍵的信號輸入給單片機。
     P2口(P2.0——P2.7):它們屬于單片機上的21到28引腳,P2口跟P1口很相似,都是內接上拉電阻,作為“準雙向端口”,可以獨立使用。在本次的設計中,P2.0到P2.3分別接到了四位數(shù)碼管的四個位選端口,而P2.4到P2.7則作為輸出接到橋式電路的四個控制端,通過單片機實現(xiàn)控制電機的正反轉。
    另外89C52單片機的外部引腳中還有幾個是比較普遍要用到的,例如:
    第9引腳的復位引腳RST,該引腳是用于單片機的復位初始化,當該引腳輸入連續(xù)兩個機器周期以上的高電平時,單片機就會自動的復位,所謂的復位就是,單片機從頭開始執(zhí)行程序
    第18,19引腳:這兩個引腳為單片機的時鐘輸入引腳,兩腳之間可接石英晶體或者振蕩電容(在本次設計中這兩個引腳接上的是頻率為12M的晶振,而在晶振的兩邊需要分別并聯(lián)一個22PF的電容,以幫助起振)
     第20引腳:為程序存儲器允許輸出控制端,當內部ROM讀取時, 程序存儲器允許輸出控制端不動作:外部ROM讀取時,在每個機器周期會動作兩次;當外部RAM讀取時,兩個脈沖會被跳過不會輸出;外接ROM時,與ROM的OE腳相接。   
2 .復位電路及時鐘電路
維持單片機最小系統(tǒng)運行的基本模塊包括復位電路和時鐘電路。復位電路通常分為兩種:上電復位和手動復位,如圖3,圖4所示。

        

      圖3 上電復位                        圖4 手動復位
比較上電復位與手動復位兩種方式的優(yōu)缺點時,考慮到系統(tǒng)在運行的過程中有時會出現(xiàn)程序跑飛的情況,所以在程序的開發(fā)過程中,一般都需要手動復位。在這次設計同樣也是選用手動復位。
給單片機提供較高頻率的時鐘信號可以使單片機的處理速度更快,處理事情的效率也相應的提高,但是伴之帶來的是更大的功耗和更惡烈的工作環(huán)境,太高的時鐘頻率有可能會影響到系統(tǒng)的工作穩(wěn)定性。考慮到在本系統(tǒng)中單片機只是用作控制,而不是用于高速信號的采樣處理,所以只需要采用合適頻率的晶振即可。合適頻率的晶振對于選頻信號強度準確度都有好處,本次設計選取接入XTAL1和XTAL2引腳的是12.000M無源晶振。并且在晶振兩邊分別并聯(lián)2個22pF陶瓷電容幫助起振。
最小系統(tǒng)如圖5所示:            
   
圖5 最小系統(tǒng)
(二) 直流電機驅動電路設計       
        因為單片機P3口輸出的電壓最高才有5V,難以直接驅動直流電機。所以我們需要先把PWM信號通過一個三極管放大后才能驅動直流電機。驅動電路如圖3.5所示,其中Q1和Q3都是NPN型三極管,而Q2和Q4都是PNP型三極管,Q1,Q2,Q3,Q4四個三極管共同構成了一個橋式電路,而Q0構成放大電路,把PWM信號放大到可以驅動直流電機。當P2.4和P2.5為高電平,P2.6和P2.7為低電平時,PWM信號經(jīng)過三極管Q0的放大之后,從Q1端流向Q4端,實現(xiàn)了電機正;反之當P2.4和P2.5為低電平,P2.6和P2.7為高電平時PWM信號放大后從Q3端流向Q2,實現(xiàn)了電機反轉。


                           圖6 驅動電路
(三) 7805穩(wěn)壓電源電路圖
為了使整個系統(tǒng)能夠順利穩(wěn)定的工作,所以必需要使各個元器件都能穩(wěn)定正常地工作,為此提供一個穩(wěn)定的直流電源是基本的保證,利用芯片LM7805很容易就可以構成穩(wěn)壓電源電路,可以實現(xiàn)這個功能。
    芯片 LM7805是具有三個端腳的正電源穩(wěn)壓電路,一個管腳接地,另外兩個分別是輸入電壓端和輸出電壓端。利用它可以輸出一系列固定值的電壓,而7805的封裝是TO-220.由于芯片7805的內部電流有所限制,并且還具有過熱保護和 安全工作區(qū)保護,所以一般情況下是不會損壞的,在提供足夠的散熱片的情況下,芯片甚至能提供大于1.5A的輸出電流。在這次設計中主要是利用7805芯片的穩(wěn)壓電路把電源12V的電壓轉化成5V的穩(wěn)定電壓輸出。如圖7即為利用芯片7805所設計的穩(wěn)壓電源電路(輸入電壓VCC為12V,而輸出的穩(wěn)定電壓為5V)
            
圖7 穩(wěn)壓電源電路圖
(四)顯示模塊設計
在本設計課題中采用的是4位7段共陰極LED數(shù)碼管,它的引腳圖如圖8所示。
七段數(shù)碼管是用七段發(fā)光二極管來顯示數(shù)學0到9,加外還有一根發(fā)光二極管是用來顯示小數(shù)點,其中數(shù)碼管可以分為共陰極和共陽極兩種,共陰極指的是把數(shù)碼管里面的發(fā)光二極管的陰極全部接在一起(接到地),當發(fā)光二極管的另一端接到高電平的時候,數(shù)碼管中相對應的二極管就會發(fā)光,正是應用這個原理,可以先把數(shù)碼管的8個輸入端進行編譯,只要控制這8個輸入端就可以把所要顯示的內容,實時顯示出來。在這次設計中所要用到的是四位數(shù)碼管,所以除了這8個控制顯示數(shù)字的輸入外,還有4位輸入用來選擇顯示哪一位數(shù)碼管工作,通過位選和段選就可以完美的實現(xiàn)直流電機的實時速度顯示。用于線選的8位輸入直接接到單片機的輸出端的情況下,由于單片機輸出高電平時,用于驅動數(shù)碼管時需要接上拉電阻,因為需要限流,防止電流過大,但是如果上拉電阻過大的話會造成數(shù)碼管的顯示比較暗,經(jīng)過綜合考慮上拉電阻為1K即可。
其連接圖如圖8所示。            
                     
                        圖8  7段共陰極LED連接圖
(五)鍵盤電路設計
啟停、正反轉、加速、減速四個開關分別與單片機的P1.4,P1.5,P1.6,P1.7,相連接,然后再與地相連。啟停是用于實現(xiàn)直流電機的啟動與停止轉動,正反轉實現(xiàn)的是直流電機的正轉和反轉,加速實現(xiàn)直流電機的加速功能,減速實現(xiàn)直流電機的減速功能,為了電路的精簡性,在設計硬件電路鍵盤的時候把正反轉,啟到停止這兩組功能分別集成在兩個不同的按鍵上(S1為啟停功能,S2為正反轉功能)其電路如圖9所示。

        

                          圖9  按鍵電路
(六) 硬件電路總圖
圖10為硬件電路的原理圖

                              圖10 硬件電路的原理圖







如圖11為硬件電路的PCB電路圖

                           圖11   硬件電路的PCB電路圖
                         四、 軟件編程
設計采用了模塊化的編程方法,把整個作品系統(tǒng)分為驅動模塊,顯示模塊,測速模塊,調速模塊,按鈕掃描等幾個部分,在設計程序的時候先把每一個模塊的流程圖畫出來,再根據(jù)流程圖編寫程序,把每個模塊的功能獨立的實現(xiàn)好,再把各個模塊的程序連起來,實現(xiàn)整個系統(tǒng)的功能。

在主程序的設計中要合理地調用各模塊程序。模塊化設計的優(yōu)點是:無論是硬件還是軟件,每一個模塊都相對獨立,故能獨立地進行設計、研制、調試和修改,從而使復雜的工作得以簡化。模塊之間的相互獨立也有助于研制任務的分解和設計人員之間的分工合作,這樣可提高工作效率和儀表的研制速度。其總體流程圖如圖12所示 。
圖12 軟件設計流程圖
(一)PWM波軟件設計
通過程序執(zhí)行的延時來實現(xiàn)PWM的產(chǎn)生,當變量CNT不為0時,PWM為高電平,當CNT自減為0后,開始輸出低電平(TEMP開始自減),當TEMP自減到0時,重新輸出高電平,就是通過對變量PWMCNT的控制實現(xiàn)了脈沖寬度的調整:
定義 OutPutPWM(u8 cnt)子程序
void OutPutPWM(u8 cnt)
   {
        u8 temp;
         temp=RESOLUTION-cnt;
         while(cnt--)PWM=0;//高電平部分
       while(temp--)PWM=1;//低電平部分
}
輸出PWM脈沖的程序為:
if(power)OutPutPWM(pwmcnt);
        else PWM=1;
(二) 電機啟停,正反轉,加速,減速的軟件設計
     直流電機的正反轉可以通過純軟件就可以實現(xiàn)了,但是考慮到個人的能力問題,如果是用純硬件來實現(xiàn)的話,對程序的能力就要更高一點,對我本人而言這是一個難題,所以在設計硬件電路的時候,針對這個問題,設計了一個橋式電路,有了該電路,程序上只要簡單的控制橋式電路的四個控制端就可了。
    變量key=Key_Scan(),通過子程序Key_Scan()對啟停,正反轉,加速,減速,四個按鍵進行掃描,然后將掃描后的值賦給KEY,再根據(jù)Switch(key)程序實現(xiàn)電機啟停,正反轉,加速,減速的控制。
        Switch(key)
        {
            case 0:break;
            case 1://啟?刂
                power=!power;
                if(power)LED1=0;
                else
                {
                    LED1=1;
                    MotorCtrl(0);
                }
                break;
            case 2://正反轉控制
                direct=!direct;
                if(direct)
                {
                    LED2=0;LED3=1;
                    MotorCtrl(1);
                }
                else
                {
                    LED2=1;LED3=0;
                    MotorCtrl(2);
                }           
                break;
            case 3://加速控制
                if(pwmcnt<RESOLUTION)pwmcnt++;
                value=pwmcnt;
                break;           
                case 4://減速控制
                if(pwmcnt>0)pwmcnt--;
                value=pwmcnt;
                break;            
                default:break;
        }

圖13 直流電機啟停  正反轉  加速  減速程序設計流程圖      

(三) 電機速度的計算方法
在檢測直流電機的速度上,有兩種方法可以實現(xiàn),一種是利用霍爾元件,另一種是利用編碼器。選用霍爾元件測速的原理是根據(jù)霍爾元件屬于帶有磁性的元件,當電機轉動的時候,霍爾元件會產(chǎn)生相應的輸出信號,把這個信號整理之后形成矩形脈沖信號,再把這個信號輸給單片機,經(jīng)單片機計數(shù)器計數(shù)處理,便可得到電機的轉速。對比兩種方法,個人覺得選用編碼器更加適合我,因為我對編碼器測速比較熟悉。本次設計選用的是334線編碼器,直流電機每轉一圈,編碼器便產(chǎn)生334個脈沖,經(jīng)過處理可以整形為矩形脈沖。通過對編碼器采集到的信號進行處理后,將處理后的脈沖信號從編碼器輸出到單片機,通過用計數(shù)器對輸出脈沖進行計數(shù),單片機計算每半秒時間內接收到的脈沖個數(shù)N,根據(jù)N乘以120再除以碼盤數(shù)就可以求出此時直流電機的轉速是多少了。
if(a==50)                                                                      //50次中斷等于0.5S
    {
                            zhuansu=(TH1*256+TL1)/334*120;              //每分鐘轉速等于T1一秒計數(shù)脈沖值乘60秒除以碼盤數(shù)
                            TL1=0;                                                                                                     //定時器重新賦初值,從0開始計數(shù)
                            TH1=0;               a=0;                                                                      //a0,為下一秒開始計數(shù)賦值    }(四) 電機速度的顯示
1.共陰極七段數(shù)碼管的編碼
共陰極數(shù)碼管的8個段選位需要編碼后才方便顯示,經(jīng)過分析便可以得到如下段碼數(shù)據(jù)組:
uchar duan_code[ ]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};//段碼數(shù)據(jù)組0---9
2.定義電機的顯示子程序void display(uint zhuansu)
void display(uint zhuansu)
{
              P0=duan_code[zhuansu/1000];                                          //顯示千位數(shù)值
              P1=wei_code[0];                                                                                    //點亮第一位數(shù)碼管
              delay_ms(3);                                                                                                  //延時,給數(shù)碼管一定的顯示時間
              P0=duan_code[zhuansu%1000/100];                            //顯示百位數(shù)值
              P1=wei_code[1];                                                                                    //點亮第二位數(shù)碼管
              delay_ms(3);                                                                                                  //延時,給數(shù)碼管一定的顯示時間
              P0=duan_code[zhuansu%1000%100/10];              //顯示十位數(shù)值
              P1=wei_code[2];                                                                                    //點亮第三位數(shù)碼管
              delay_ms(3);                                                                                                  //延時,給數(shù)碼管一定的顯示時間
              P0=duan_code[zhuansu%10];                                                        //顯示個位數(shù)值
              P1=wei_code[3];                                                                                    //點亮第四位數(shù)碼管
              delay_ms(3);                                                                                                  //延時,給數(shù)碼管一定的顯示時間            
}

圖14所示是數(shù)碼管顯示模塊的程序設計流程圖。

圖14    數(shù)碼管顯示流程圖


系統(tǒng)的調試屬于整個設計的最后一個環(huán)節(jié),但是卻十分的重要,在這個環(huán)節(jié)可以把整個系統(tǒng)中的不足之處通過修正改進達到正常,因為軟件跟硬件都有可能會出現(xiàn)問題,所以必需把軟件調試跟硬件調試分開來完成,這樣更加有利于發(fā)現(xiàn)問題的所在和有針對性的解決問題。硬件的調試主要是檢測電路板有沒有短路現(xiàn)象或者接線接錯了。嚴重一點的話會出現(xiàn)功能上的錯誤,這些問題都會影響到整個系統(tǒng)的功能,所以硬件調試必需首先進行,在確保硬件電路沒問題的情況下再寫程序和修改程序。至于軟件調試的話,需要分模塊來進行,這次設計一共有驅動模塊,顯示模塊,測速模塊,還有就是各指示燈的指示功能,在編寫程序或者修改程序的時候必需要根據(jù)模塊來修改,這樣才會有針對性和效率。確保系統(tǒng)的穩(wěn)定正常運行。
(一)硬件調試
    這次設計所用到的硬件電路是用Protel軟件畫好原理圖和PCB電路,然后寄到其他專業(yè)做版的公司做出來的電路版,經(jīng)過硬件調試,發(fā)現(xiàn)板還是出現(xiàn)了一點問題,在畫圖的時候由于過于粗心,在畫PCB版的時候把PNP三極管和NPN三極管的封裝調亂了,等到電路版做出來了,用程序測試的時候才發(fā)現(xiàn),所以要在電路版上面改。還有就是在畫板的時候還有一條線沒有連好,所以電路板做出來后,需要另外飛線把這根線連好,這些雖然是小問題,還可以通過修改電路板,但是都是因為在畫板時因為粗心而犯下的錯誤,是完全可以避免的。通過分模塊的用程序來檢測硬件,經(jīng)過幾次的修改,基本是沒有什么問題了,但是發(fā)現(xiàn)數(shù)碼管的顯示感覺有點暗,原來是因為數(shù)碼管所用的排阻是15K的,電阻過大,致使驅動數(shù)碼管的電流偏小。為了最求完美,所以換了10K的排阻。幾經(jīng)修改,終于把硬件電路調好。如圖15為調試好了的硬件電路:

                            圖15  調試好的硬件電路圖

(二)軟件調試
軟件調試指的是通過仿真軟件模擬設計的硬件電路,加載上程序后的運行情況,這次設計所用的仿真軟件是keil軟件,這是一款功能很強大的軟件,其中的仿真功能也是非常實用的,可以通過執(zhí)行單步運行檢測每一句程序的問題,可以把程序按功能模塊來檢測功能性的錯誤,最后可以實時檢測整個程序運行時,硬件電路的執(zhí)行情況?梢远ㄎ坏矫恳痪涑绦蚴欠裾_,這樣對于檢測修改程序提供了很大的方便,所以說這一步是非常實用必要的一步。
通過KEIL軟件,程序單步運行,模塊化調試,整體執(zhí)行,在調試的過程中觀察存儲單元的數(shù)據(jù)變化,查找出程序的語法和邏輯錯誤,每一句,每一個模塊地修改好,具體的調試步驟如下:
    1. 把系統(tǒng)分為驅動模塊,測速模塊,顯示模塊,調速模塊獨立地在仿真軟件中調試。
2. 對于需要賦值的那幾個模塊,在調試的時候,要檢測在賦予不同的初值時各參數(shù)的變化情況,確定好最佳的賦值
3. 把前面分開獨立檢測的所有模塊綜合起來,執(zhí)行全速調試,觀察模擬的結果,看看是否已經(jīng)符合系統(tǒng)的要求和目的,如果還是沒有實現(xiàn)所要達到的要求,就要重新分模塊來調試。

附作品和程序

硬件電路實物照片:


總程序:
/*--------------------------------------------------------
              名稱:基于單片機控制直流電機調速系統(tǒng)
    單片機:STC89C52RC
              晶振:12M
              光柵盤:334格
              輸入:P3.5(定時器T1計數(shù)輸入口)
              輸出數(shù)碼管顯示:位選接P1的0,1,2,3端口;段選接P0口
              內容:數(shù)碼管顯示所測電機轉速
--------------------------------------------------------*/
  1. //#include <reg52.h>                                                        //包含單片機寄存器的頭文件
  2. #include <REGX52.H>

  3. #define uchar unsigned char              //定義uchar為無符號字符型變量
  4. #define uint  unsigned int              //定義uint為無符號整型變量
  5. #define ulong unsigned long            
  6. //uchar wei_code[]={0xfe,0xfd,0xfb,0xf7};              //位碼數(shù)據(jù)組
  7. #define  wei1  P2_1=1;P2_2=1;P2_3=1;P2_0=0;
  8. #define  wei2  P2_0=1;P2_2=1;P2_3=1;P2_1=0;
  9. #define  wei3  P2_0=1;P2_1=1;P2_3=1;P2_2=0;
  10. #define  wei4  P2_0=1;P2_1=1;P2_2=1;P2_3=0;
  11. #define  RESOLUTION      200//PWM量化精度


  12. sbit  LED1=P1^0;
  13. sbit  LED2=P1^1;
  14. sbit  LED3=P1^2;
  15. sbit  LED4=P1^3;
  16. sbit  KEY1=P1^4;
  17. sbit  KEY2=P1^5;
  18. sbit  KEY3=P1^6;
  19. sbit  KEY4=P1^7;
  20. sbit  PWM=P3^2;


  21. void  Delay(uint x);
  22. void  Init(void);
  23. void  MotorCtrl(uchar cmd);
  24. uchar Key_Scan(void);

  25. uchar duan_code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};//段碼數(shù)據(jù)組0---9
  26. uint  zhuansu,a=0;                                                                      //定義變量名稱
  27. bit flag,power,direct;                                                                                                  //計時一秒標志位                           
  28. /**************************************
  29. 主函數(shù)
  30. ***************************************/
  31. void main()
  32. {               
  33.     uchar key;
  34.     uint  cnt,pwmcnt;   

  35.               Init();                  //定時計數(shù)器初始化
  36.     cnt=0;
  37.     power=0;
  38.     direct=0;
  39.     pwmcnt=0;
  40.     MotorCtrl(1);
  41.               while(1)                                                                                   
  42.               {                           
  43.         key=Key_Scan();
  44.         switch(key)
  45.         {
  46.             case 1://啟?刂
  47.                 power=!power;
  48.                 if(power)LED1=0;
  49.                 else
  50.                 {
  51.                     LED1=1;
  52.                     MotorCtrl(0);
  53.                     PWM=1;
  54.                 }
  55.                 break;
  56.             case 2://正反轉控制
  57.                 direct=!direct;
  58.                 if(direct)MotorCtrl(1);
  59.                 else MotorCtrl(2);           
  60.                 break;
  61.             case 3:
  62.                 if(pwmcnt<RESOLUTION)pwmcnt++;
  63.                 break;//加速控制
  64.             case 4:
  65.                 if(pwmcnt>0)pwmcnt--;
  66.                 break;//減速控制
  67.             default:break;
  68.         }
  69.         if(power)
  70.         {
  71.             cnt++;
  72.             if(cnt<pwmcnt)PWM=0;
  73.             else PWM=1;
  74.             if(cnt>=RESOLUTION)cnt=0;
  75.         }     
  76.               }
  77. }
  78. /**************************************
  79. T0定時中斷服務程序
  80. ***************************************/
  81. void timer0() interrupt 1 using 1//10MS中斷一次
  82. {
  83.     static uchar wei=0;
  84.     uchar temp;

  85.               a++;                                                                                                  //每中斷一次a加1
  86.               if(a==50)                                                                      //50次中斷等于0.5S
  87.     {
  88.                             zhuansu=(TH1*256+TL1)/334*120;              //每分鐘轉速等于T1一秒計數(shù)脈沖值乘60秒除以碼盤數(shù)
  89.                             TL1=0;                                                                                                     //定時器重新賦初值,從0開始計數(shù)
  90.                             TH1=0;      
  91.         a=0;                                                                      //a置0,為下一秒開始計數(shù)賦值
  92.     }
  93.               if(wei==0)
  94.               {
  95.         temp=zhuansu/1000;
  96.                             wei4;      
  97.         P0=duan_code[temp];
  98.         wei=1;
  99.               }
  100.               else if(wei==1)
  101.               {            
  102.         temp=zhuansu/100%10;
  103.                             wei3;                     
  104.                             P0=duan_code[temp];
  105.         wei=2;
  106.               }
  107.               else if(wei==2)
  108.               {
  109.         temp=zhuansu/10%10;
  110.                             wei2;                           
  111.                             P0=duan_code[temp];
  112.         wei=3;
  113.               }
  114.               else if(wei==3)
  115.               {
  116.         temp=zhuansu%10;
  117.                             wei1;                           
  118.                             P0=duan_code[temp];
  119.         wei=0;
  120.               }   
  121.               TH0=(65536-10000)/256;
  122.               TL0=(65536-10000)%256;              //重裝初值
  123. }
  124. /**************************************
  125. 延時,大約1ms
  126. ***************************************/
  127. void Delay(uint x)                                                                                                                                          
  128. {
  129.     uchar i;
  130.     while(x--)            
  131.     for(i=0;i<120;i++);            
  132. }
  133. /**************************************
  134. 定時器計數(shù)器初始化
  135. ***************************************/
  136. void Init(void)
  137. {
  138.     MotorCtrl(0);
  139.               TMOD=0x51;              //定時器T1工作于計數(shù)模式1,定時器T0工作于計時模式1
  140.               TH0=(65536-10000)/256;              //定時器T0的高8位設置初值,每10ms產(chǎn)生一次中斷
  141.               TL0=(65536-10000)%256;              //定時器T0的低8位設置初值,每10ms產(chǎn)生一次中斷            
  142.               TH1=0;              //定時器T1高8位賦初值0
  143.               TL1=0;              //定時器T1低8位賦初值0
  144.               EA=1;                            //開總中斷
  145.               ET0=1;              //定時器T0中斷允許
  146.               TR1=1;              //定時器T1啟動
  147.               TR0=1;              //定時器T0啟動            
  148. }
  149. /**************************************
  150. 電機正反轉及停止控制
  151. ***************************************/
  152. void MotorCtrl(uchar cmd)
  153. {
  154.     uchar temp;
  155.     temp=P2&0x0f;
  156.     if(cmd==0)
  157.     {
  158.         temp|=0xa0;//停止
  159.         LED2=1;LED3=1;
  160.     }
  161.     else if(cmd==1)
  162.     {
  163.         temp|=0x30;//正轉
  164.         LED2=0;LED3=1;
  165.     }
  166.     else if(cmd==2)
  167.     {
  168.         temp|=0xc0;//反轉
  169.         LED2=1;LED3=0;      
  170.     }
  171.     P2=temp;
  172. }
  173. /**************************************
  174. 按鍵掃描
  175. ***************************************/
  176. uchar Key_Scan(void)
  177. {
  178.               static uchar key_up=1;//按鍵按松開標志
  179.               if(key_up&&(KEY1==0||KEY2==0||KEY3==0||KEY4==0))
  180.               {
  181.                             Delay(10);//去抖動
  182.                             key_up=0;
  183.                             if(KEY1==0)return 1;
  184.                             if(KEY2==0)return 2;
  185.                             if(KEY3==0)return 3;
  186.                             if(KEY4==0)return 4;
  187.               }
  188.               else if(KEY1==1&&KEY2==1&&KEY3==1&&KEY4==1)key_up=1;
  189.               return 0;
  190. }
  191. 0)return 3;
  192.                             if(KEY4==0)return 4;
  193.               }
  194.               else if(KEY1==1&&KEY2==1&&KEY3==1&&KEY4==1)key_up=1;
  195.               return 0;
  196. }
復制代碼


完整的Word格式文檔51黑下載地址:
控制電機綜合性試驗訓練---直流伺服電機(5)(1).doc (2.21 MB, 下載次數(shù): 81)



作者: 王梓鑫    時間: 2019-1-3 06:34
看著很不錯!
作者: dddffff    時間: 2020-3-5 18:01
可以,很不錯
作者: weihongping    時間: 2020-3-23 15:18
這還是不算真正的伺服系統(tǒng)吧?
作者: 趙小東    時間: 2020-4-18 16:08
誰寫好了這個伺服電機驅動?
作者: akesking    時間: 2021-12-20 15:43
weihongping 發(fā)表于 2020-3-23 15:18
這還是不算真正的伺服系統(tǒng)吧?

我覺的不是真正的伺服系統(tǒng),伺服系統(tǒng)是閉環(huán)的,可以實現(xiàn)自動化控制的。你這個還真不是伺服
作者: yamboo    時間: 2024-4-24 19:10
仿真設計的電路圖可以分享一下嗎

作者: donglw    時間: 2024-4-26 09:42
電路設計缺少PID控制部分,此程序常用于教程。




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1