這是項目相關文檔,基于AT86C52設計關于直流伺服電機調速的
【項目目標】: 1、知識目標: 掌握直流伺服電動機工作原理 ,掌握直流伺服電動機的特性 ,掌握直流伺服電動機的調速控制方法 。 2、能力目標: 要求會通過數字邏輯芯片或者單片機技術設計該直流伺服電機的驅動電路。 【重點難點】 1、重點:直流伺服電機的工作原理及其驅動電路設計 2、難點:直流電機的驅動電路設計 【相關知識】 本設計要求用單片機實現直流電機(學生自由選擇)的驅動調速控制,學生在項目進行前,有必要重新學習單片機課程。為了加快項目進度,可以選用本院學生普遍學習的AT89C51單片機為核心控制模塊。 【項目實施】 一、項目任務: 1.實現對電機的啟動、停止、加速、減速、正轉、反轉的控制; 2.通過編碼器實現對電機速度的檢測; 3.實現對電機實時速度的顯示; 4.設計電機驅動的硬件電路; 5.編制驅動電機的單片機控制程序; 6.要求電機穩態工作性能好,電機速度可調范圍寬至少達到 0-1200r/min 二、項目實施: 1、制訂方案(2人一組),要求每小組方案盡量不同,如有雷同,視作抄襲 小組討論初步擬定實施方案。各小組查閱相關資料,制定各自的可行性方案。教師提供基本設計方案,如圖1,學生可在此基礎上擴展其功能。 圖1 基本設計方案 2、確定方案: 各小組交流、評價各個方案的優缺點,確定實施方案。 3、實施方案: 方案實施的基本技術路線如圖2所示。各小組可根據教師提供的基本技術路線,適時調整各自的計劃進度。由于時間和硬件條件限制,只需做到PROTEUS聯合仿真即可,有條件有興趣的同學可以完成整個方案的設計。可利用面包板、也可以利用PCB制版。 圖2基本技術路線圖 【項目評價】 1、成果展示 每個項目都要求學生以團隊的形式完成項目所要求的任務,在對每個團隊的項目進行驗收和總結時,以大賽的形式評價學生團隊的作品來調動學生的積極性。學生在項目作品展示時,與同類作品進行比較,展示自己的優勢并發現不足,這比課堂上教師單純的教授知識點更具有說服力。 2、過程評價 每個項目的課程大賽成績可作為成績考核的主要依據,比賽采取現場實操測試、答辯的形式,根據學生表現分配一定的分值。同時,采取學生項目作品互評形式,每個完成項目的學生可以對分配到的3-5個作品進行綜合評價,綜合評價結果可以分配一定的比例分值。在項目實施過程中,建立學生項目過程自評表,作為成績評定的一項依據。 | 學科:控制電機 項目名稱:直流電機驅動控制系統設計 班級: 姓名: | | | | | | | | | | | | |
|
|
|
|
|
|
|
|
|
| |
| |
|
【項目總結 】 通過本次項目訓練,可以讓同學們受益匪淺。一方面,學生將課堂上的理論知識應用到了實際,加強鞏固了理論知識,也提高了實際動手能力,通過實踐反饋,又了解到學生自身知識面的不足。另一方面,在實驗過程中,遇到問題時候,各個小組列出可能問題,一一進行排查,找出問題的所在,隊員之間分工明確,團結合作,本次訓練正是通過隊員之間的合作實現的。通過項目驅動形式,要求學生能綜合運用控制電機、單片機技術、PLC技術、Protues等課程的基本知識,進行融會貫通的獨立思考,充分調動學生學習的積極性和參與性。 【項目拓展】 (1)應用專用運動控制器LM629,結合單片機組成控制系統。 (2)加上一定的輕型負載,驗證驅動系統的帶負載能力。 案例僅為參考 直流電機調速系統設計案例報告 一、前言 在所有的機電設備當中,直流電動機具有優良的調速特性,調速平滑,方便,調速范圍廣,過載能力大,能承受頻繁的沖擊負載,可實現頻繁的無級快速起動、制動和反轉;能滿足生產過程中自動化系統各種不同的特殊運行要求。傳統的晶閘管直流調速系統,其控制叫路是基于模擬器件沒計的,這使得控制電路的硬件設備極其復雜,安裝調試困難,相對故障牢高。電動機調速系統采用微機實現自動控制,是電氣傳動發展的主要方向之一。本文設計了一種基于單片機的直流電機脈寬調速控制系統,其控制方案依靠軟件實現。采樣、觸發、控制均采用數字處理,避免了模擬控制電路對元件參數的影響,且參數調整簡單方便,簡化了系統,提高了電機工作穩定性,延長了系統使用壽命。采用微機控制后,整個調速系統體積小、結構簡單、可靠性高、操作維護方便,電動機穩態運轉時轉速精度可達到較高水平,靜動態各項指標均能較好地滿足工業生產中高性能電氣傳動的要求。直流凋速技術已廣泛戍用于現代工業、航天等各個領域。 二、總體方案設計
對于同一個研究的系統,根據不同的要求和精確度,所用到的方案也不一樣,作出的具體要求如下: 1.實現對電機的啟動、停止、加速、減速、正轉、反轉的控制; 2.通過編碼器實現對電機速度的檢測; 3.實現對電機實時速度的顯示; 4.設計電機驅動的硬件電路; 5.編制驅動電機的單片機控制程序; 6.要求電機穩態工作性能好,電機速度可調范圍寬至少達到0-1200r/min 。 
通過軟件產生PWM信號,并由P3.2輸出,經過驅動電路處理后供給直流電機,從而使直流電機在脈沖高電平時電得電,在低電平的時候失電。程序上通過使用延時模塊使得單片機在不同的時間段輸出不同的電平。啟動單片機,整個系統進入準備狀態。按下電路板上的啟動按鍵后,根據驅動路中由四個三極管構成的橋式電路的特點,當P2.4和P2.5為高電平,P2.6和P2.7為低電平時電機正;反之當P2.4和P2.5為低電平,P2.6和P2.7為高電平時電機反轉。根據加速和減速鍵,調整P3.2輸出脈沖的高低電平時的初始值,從而可以控制P3.2輸出高低電平時的占空比,進而控制直流電機的轉速。 圖 1 系統控制簡圖 三、 硬件電路設計 結合以往的設計經驗,根據單片機系統的特點,針對硬件電路的設計作出以下兩點要求:(1)考慮到可以盡可能地簡化電路,應該盡可能使用集成度高功能性強的芯片;(2)考慮到電路修改優化的情況要留有將來修改擴展的余地。(一)單片機最小系統的設計單片機的最小系統:所謂的單片機最小系統指的是由單片機和一些基本的外圍電路所組成的一個可以工作的單片機系統。需要在單片機18,19引腳之間連接晶振,并且在晶振兩邊分別并聯一個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位的三態輸入輸出口,每一個端口都可以獨立使用,在這次的設計中,P0口就是用作了驅動LED數碼管(分別接在了數碼管的8個陽極)。
P1口(P1.1——P1.7):它們屬于單片機上的1腳到8腳,這8個端口也是可以獨立使用,但是這跟P0口有點不同,就是每一個端口內部已經接上了上拉電阻,使得端口的輸出沒有高阻態,輸入也沒有鎖存功能,所以說這并不是我們常說的輸入輸出口,而是作為“準雙向端口”。正是這些區別使得P1口的作用跟P0口有很大的區別。在本次的設計中P1.0到P1.3是用作驅動四個指示燈,而P1.4到P1.7是連接到了4個按鍵,用以把按鍵的信號輸入給單片機。
P2口(P2.0——P2.7):它們屬于單片機上的21到28引腳,P2口跟P1口很相似,都是內接上拉電阻,作為“準雙向端口”,可以獨立使用。在本次的設計中,P2.0到P2.3分別接到了四位數碼管的四個位選端口,而P2.4到P2.7則作為輸出接到橋式電路的四個控制端,通過單片機實現控制電機的正反轉。
另外89C52單片機的外部引腳中還有幾個是比較普遍要用到的,例如:
第9引腳的復位引腳RST,該引腳是用于單片機的復位初始化,當該引腳輸入連續兩個機器周期以上的高電平時,單片機就會自動的復位,所謂的復位就是,單片機從頭開始執行程序
第18,19引腳:這兩個引腳為單片機的時鐘輸入引腳,兩腳之間可接石英晶體或者振蕩電容(在本次設計中這兩個引腳接上的是頻率為12M的晶振,而在晶振的兩邊需要分別并聯一個22PF的電容,以幫助起振)
第20引腳:為程序存儲器允許輸出控制端,當內部ROM讀取時, 程序存儲器允許輸出控制端不動作:外部ROM讀取時,在每個機器周期會動作兩次;當外部RAM讀取時,兩個脈沖會被跳過不會輸出;外接ROM時,與ROM的OE腳相接。 2 .復位電路及時鐘電路維持單片機最小系統運行的基本模塊包括復位電路和時鐘電路。復位電路通常分為兩種:上電復位和手動復位,如圖3,圖4所示。 
圖3 上電復位 圖4 手動復位 比較上電復位與手動復位兩種方式的優缺點時,考慮到系統在運行的過程中有時會出現程序跑飛的情況,所以在程序的開發過程中,一般都需要手動復位。在這次設計同樣也是選用手動復位。 給單片機提供較高頻率的時鐘信號可以使單片機的處理速度更快,處理事情的效率也相應的提高,但是伴之帶來的是更大的功耗和更惡烈的工作環境,太高的時鐘頻率有可能會影響到系統的工作穩定性。考慮到在本系統中單片機只是用作控制,而不是用于高速信號的采樣處理,所以只需要采用合適頻率的晶振即可。合適頻率的晶振對于選頻信號強度準確度都有好處,本次設計選取接入XTAL1和XTAL2引腳的是12.000M無源晶振。并且在晶振兩邊分別并聯2個22pF陶瓷電容幫助起振。 最小系統如圖5所示:
圖5 最小系統 (二) 直流電機驅動電路設計 因為單片機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信號經過三極管Q0的放大之后,從Q1端流向Q4端,實現了電機正;反之當P2.4和P2.5為低電平,P2.6和P2.7為高電平時PWM信號放大后從Q3端流向Q2,實現了電機反轉。
 圖6 驅動電路 (三) 7805穩壓電源電路圖
為了使整個系統能夠順利穩定的工作,所以必需要使各個元器件都能穩定正常地工作,為此提供一個穩定的直流電源是基本的保證,利用芯片LM7805很容易就可以構成穩壓電源電路,可以實現這個功能。
芯片 LM7805是具有三個端腳的正電源穩壓電路,一個管腳接地,另外兩個分別是輸入電壓端和輸出電壓端。利用它可以輸出一系列固定值的電壓,而7805的封裝是TO-220.由于芯片7805的內部電流有所限制,并且還具有過熱保護和 安全工作區保護,所以一般情況下是不會損壞的,在提供足夠的散熱片的情況下,芯片甚至能提供大于1.5A的輸出電流。在這次設計中主要是利用7805芯片的穩壓電路把電源12V的電壓轉化成5V的穩定電壓輸出。如圖7即為利用芯片7805所設計的穩壓電源電路(輸入電壓VCC為12V,而輸出的穩定電壓為5V)  圖7 穩壓電源電路圖
(四)顯示模塊設計在本設計課題中采用的是4位7段共陰極LED數碼管,它的引腳圖如圖8所示。 七段數碼管是用七段發光二極管來顯示數學0到9,加外還有一根發光二極管是用來顯示小數點,其中數碼管可以分為共陰極和共陽極兩種,共陰極指的是把數碼管里面的發光二極管的陰極全部接在一起(接到地),當發光二極管的另一端接到高電平的時候,數碼管中相對應的二極管就會發光,正是應用這個原理,可以先把數碼管的8個輸入端進行編譯,只要控制這8個輸入端就可以把所要顯示的內容,實時顯示出來。在這次設計中所要用到的是四位數碼管,所以除了這8個控制顯示數字的輸入外,還有4位輸入用來選擇顯示哪一位數碼管工作,通過位選和段選就可以完美的實現直流電機的實時速度顯示。用于線選的8位輸入直接接到單片機的輸出端的情況下,由于單片機輸出高電平時,用于驅動數碼管時需要接上拉電阻,因為需要限流,防止電流過大,但是如果上拉電阻過大的話會造成數碼管的顯示比較暗,經過綜合考慮上拉電阻為1K即可。 其連接圖如圖8所示。
圖8 7段共陰極LED連接圖 (五)鍵盤電路設計啟停、正反轉、加速、減速四個開關分別與單片機的P1.4,P1.5,P1.6,P1.7,相連接,然后再與地相連。啟停是用于實現直流電機的啟動與停止轉動,正反轉實現的是直流電機的正轉和反轉,加速實現直流電機的加速功能,減速實現直流電機的減速功能,為了電路的精簡性,在設計硬件電路鍵盤的時候把正反轉,啟到停止這兩組功能分別集成在兩個不同的按鍵上(S1為啟停功能,S2為正反轉功能)其電路如圖9所示。  圖9 按鍵電路 (六) 硬件電路總圖圖10為硬件電路的原理圖

圖10 硬件電路的原理圖
如圖11為硬件電路的PCB電路圖 圖11 硬件電路的PCB電路圖 四、 軟件編程 設計采用了模塊化的編程方法,把整個作品系統分為驅動模塊,顯示模塊,測速模塊,調速模塊,按鈕掃描等幾個部分,在設計程序的時候先把每一個模塊的流程圖畫出來,再根據流程圖編寫程序,把每個模塊的功能獨立的實現好,再把各個模塊的程序連起來,實現整個系統的功能。 
在主程序的設計中要合理地調用各模塊程序。模塊化設計的優點是:無論是硬件還是軟件,每一個模塊都相對獨立,故能獨立地進行設計、研制、調試和修改,從而使復雜的工作得以簡化。模塊之間的相互獨立也有助于研制任務的分解和設計人員之間的分工合作,這樣可提高工作效率和儀表的研制速度。其總體流程圖如圖12所示 。圖12 軟件設計流程圖 (一)PWM波軟件設計通過程序執行的延時來實現PWM的產生,當變量CNT不為0時,PWM為高電平,當CNT自減為0后,開始輸出低電平(TEMP開始自減),當TEMP自減到0時,重新輸出高電平,就是通過對變量PWMCNT的控制實現了脈沖寬度的調整: 定義 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;
(二) 電機啟停,正反轉,加速,減速的軟件設計
直流電機的正反轉可以通過純軟件就可以實現了,但是考慮到個人的能力問題,如果是用純硬件來實現的話,對程序的能力就要更高一點,對我本人而言這是一個難題,所以在設計硬件電路的時候,針對這個問題,設計了一個橋式電路,有了該電路,程序上只要簡單的控制橋式電路的四個控制端就可了。
變量key=Key_Scan(),通過子程序Key_Scan()對啟停,正反轉,加速,減速,四個按鍵進行掃描,然后將掃描后的值賦給KEY,再根據Switch(key)程序實現電機啟停,正反轉,加速,減速的控制。
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 直流電機啟停 正反轉 加速 減速程序設計流程圖 (三) 電機速度的計算方法
在檢測直流電機的速度上,有兩種方法可以實現,一種是利用霍爾元件,另一種是利用編碼器。選用霍爾元件測速的原理是根據霍爾元件屬于帶有磁性的元件,當電機轉動的時候,霍爾元件會產生相應的輸出信號,把這個信號整理之后形成矩形脈沖信號,再把這個信號輸給單片機,經單片機計數器計數處理,便可得到電機的轉速。對比兩種方法,個人覺得選用編碼器更加適合我,因為我對編碼器測速比較熟悉。本次設計選用的是334線編碼器,直流電機每轉一圈,編碼器便產生334個脈沖,經過處理可以整形為矩形脈沖。通過對編碼器采集到的信號進行處理后,將處理后的脈沖信號從編碼器輸出到單片機,通過用計數器對輸出脈沖進行計數,單片機計算每半秒時間內接收到的脈沖個數N,根據N乘以120再除以碼盤數就可以求出此時直流電機的轉速是多少了。
if(a==50) //50次中斷等于0.5S
{
zhuansu=(TH1*256+TL1)/334*120; //每分鐘轉速等于T1一秒計數脈沖值乘60秒除以碼盤數
TL1=0; //定時器重新賦初值,從0開始計數 TH1=0; a=0; //a置0,為下一秒開始計數賦值 }(四) 電機速度的顯示1.共陰極七段數碼管的編碼
共陰極數碼管的8個段選位需要編碼后才方便顯示,經過分析便可以得到如下段碼數據組:
uchar duan_code[ ]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};//段碼數據組0---9
2.定義電機的顯示子程序void display(uint zhuansu) void display(uint zhuansu) { P0=duan_code[zhuansu/1000]; //顯示千位數值 P1=wei_code[0]; //點亮第一位數碼管 delay_ms(3); //延時,給數碼管一定的顯示時間 P0=duan_code[zhuansu%1000/100]; //顯示百位數值 P1=wei_code[1]; //點亮第二位數碼管 delay_ms(3); //延時,給數碼管一定的顯示時間 P0=duan_code[zhuansu%1000%100/10]; //顯示十位數值 P1=wei_code[2]; //點亮第三位數碼管 delay_ms(3); //延時,給數碼管一定的顯示時間 P0=duan_code[zhuansu%10]; //顯示個位數值 P1=wei_code[3]; //點亮第四位數碼管 delay_ms(3); //延時,給數碼管一定的顯示時間 }
圖14所示是數碼管顯示模塊的程序設計流程圖。 圖14 數碼管顯示流程圖
系統的調試屬于整個設計的最后一個環節,但是卻十分的重要,在這個環節可以把整個系統中的不足之處通過修正改進達到正常,因為軟件跟硬件都有可能會出現問題,所以必需把軟件調試跟硬件調試分開來完成,這樣更加有利于發現問題的所在和有針對性的解決問題。硬件的調試主要是檢測電路板有沒有短路現象或者接線接錯了。嚴重一點的話會出現功能上的錯誤,這些問題都會影響到整個系統的功能,所以硬件調試必需首先進行,在確保硬件電路沒問題的情況下再寫程序和修改程序。至于軟件調試的話,需要分模塊來進行,這次設計一共有驅動模塊,顯示模塊,測速模塊,還有就是各指示燈的指示功能,在編寫程序或者修改程序的時候必需要根據模塊來修改,這樣才會有針對性和效率。確保系統的穩定正常運行。
(一)硬件調試 這次設計所用到的硬件電路是用Protel軟件畫好原理圖和PCB電路,然后寄到其他專業做版的公司做出來的電路版,經過硬件調試,發現板還是出現了一點問題,在畫圖的時候由于過于粗心,在畫PCB版的時候把PNP三極管和NPN三極管的封裝調亂了,等到電路版做出來了,用程序測試的時候才發現,所以要在電路版上面改。還有就是在畫板的時候還有一條線沒有連好,所以電路板做出來后,需要另外飛線把這根線連好,這些雖然是小問題,還可以通過修改電路板,但是都是因為在畫板時因為粗心而犯下的錯誤,是完全可以避免的。通過分模塊的用程序來檢測硬件,經過幾次的修改,基本是沒有什么問題了,但是發現數碼管的顯示感覺有點暗,原來是因為數碼管所用的排阻是15K的,電阻過大,致使驅動數碼管的電流偏小。為了最求完美,所以換了10K的排阻。幾經修改,終于把硬件電路調好。如圖15為調試好了的硬件電路: 
圖15 調試好的硬件電路圖 (二)軟件調試 軟件調試指的是通過仿真軟件模擬設計的硬件電路,加載上程序后的運行情況,這次設計所用的仿真軟件是keil軟件,這是一款功能很強大的軟件,其中的仿真功能也是非常實用的,可以通過執行單步運行檢測每一句程序的問題,可以把程序按功能模塊來檢測功能性的錯誤,最后可以實時檢測整個程序運行時,硬件電路的執行情況。可以定位到每一句程序是否正確,這樣對于檢測修改程序提供了很大的方便,所以說這一步是非常實用必要的一步。 通過KEIL軟件,程序單步運行,模塊化調試,整體執行,在調試的過程中觀察存儲單元的數據變化,查找出程序的語法和邏輯錯誤,每一句,每一個模塊地修改好,具體的調試步驟如下:
1. 把系統分為驅動模塊,測速模塊,顯示模塊,調速模塊獨立地在仿真軟件中調試。 2. 對于需要賦值的那幾個模塊,在調試的時候,要檢測在賦予不同的初值時各參數的變化情況,確定好最佳的賦值 3. 把前面分開獨立檢測的所有模塊綜合起來,執行全速調試,觀察模擬的結果,看看是否已經符合系統的要求和目的,如果還是沒有實現所要達到的要求,就要重新分模塊來調試。 附作品和程序 硬件電路實物照片: 
總程序:
/*-------------------------------------------------------- 名稱:基于單片機控制直流電機調速系統 單片機:STC89C52RC 晶振:12M 光柵盤:334格 輸入:P3.5(定時器T1計數輸入口) 輸出數碼管顯示:位選接P1的0,1,2,3端口;段選接P0口 內容:數碼管顯示所測電機轉速 --------------------------------------------------------*/ - //#include <reg52.h> //包含單片機寄存器的頭文件
- #include <REGX52.H>
- #define uchar unsigned char //定義uchar為無符號字符型變量
- #define uint unsigned int //定義uint為無符號整型變量
- #define ulong unsigned long
- //uchar wei_code[]={0xfe,0xfd,0xfb,0xf7}; //位碼數據組
- #define wei1 P2_1=1;P2_2=1;P2_3=1;P2_0=0;
- #define wei2 P2_0=1;P2_2=1;P2_3=1;P2_1=0;
- #define wei3 P2_0=1;P2_1=1;P2_3=1;P2_2=0;
- #define wei4 P2_0=1;P2_1=1;P2_2=1;P2_3=0;
- #define RESOLUTION 200//PWM量化精度
- sbit LED1=P1^0;
- sbit LED2=P1^1;
- sbit LED3=P1^2;
- sbit LED4=P1^3;
- sbit KEY1=P1^4;
- sbit KEY2=P1^5;
- sbit KEY3=P1^6;
- sbit KEY4=P1^7;
- sbit PWM=P3^2;
- void Delay(uint x);
- void Init(void);
- void MotorCtrl(uchar cmd);
- uchar Key_Scan(void);
- uchar duan_code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};//段碼數據組0---9
- uint zhuansu,a=0; //定義變量名稱
- bit flag,power,direct; //計時一秒標志位
- /**************************************
- 主函數
- ***************************************/
- void main()
- {
- uchar key;
- uint cnt,pwmcnt;
- Init(); //定時計數器初始化
- cnt=0;
- power=0;
- direct=0;
- pwmcnt=0;
- MotorCtrl(1);
- while(1)
- {
- key=Key_Scan();
- switch(key)
- {
- case 1://啟停控制
- power=!power;
- if(power)LED1=0;
- else
- {
- LED1=1;
- MotorCtrl(0);
- PWM=1;
- }
- break;
- case 2://正反轉控制
- direct=!direct;
- if(direct)MotorCtrl(1);
- else MotorCtrl(2);
- break;
- case 3:
- if(pwmcnt<RESOLUTION)pwmcnt++;
- break;//加速控制
- case 4:
- if(pwmcnt>0)pwmcnt--;
- break;//減速控制
- default:break;
- }
- if(power)
- {
- cnt++;
- if(cnt<pwmcnt)PWM=0;
- else PWM=1;
- if(cnt>=RESOLUTION)cnt=0;
- }
- }
- }
- /**************************************
- T0定時中斷服務程序
- ***************************************/
- void timer0() interrupt 1 using 1//10MS中斷一次
- {
- static uchar wei=0;
- uchar temp;
- a++; //每中斷一次a加1
- if(a==50) //50次中斷等于0.5S
- {
- zhuansu=(TH1*256+TL1)/334*120; //每分鐘轉速等于T1一秒計數脈沖值乘60秒除以碼盤數
- TL1=0; //定時器重新賦初值,從0開始計數
- TH1=0;
- a=0; //a置0,為下一秒開始計數賦值
- }
- if(wei==0)
- {
- temp=zhuansu/1000;
- wei4;
- P0=duan_code[temp];
- wei=1;
- }
- else if(wei==1)
- {
- temp=zhuansu/100%10;
- wei3;
- P0=duan_code[temp];
- wei=2;
- }
- else if(wei==2)
- {
- temp=zhuansu/10%10;
- wei2;
- P0=duan_code[temp];
- wei=3;
- }
- else if(wei==3)
- {
- temp=zhuansu%10;
- wei1;
- P0=duan_code[temp];
- wei=0;
- }
- TH0=(65536-10000)/256;
- TL0=(65536-10000)%256; //重裝初值
- }
- /**************************************
- 延時,大約1ms
- ***************************************/
- void Delay(uint x)
- {
- uchar i;
- while(x--)
- for(i=0;i<120;i++);
- }
- /**************************************
- 定時器計數器初始化
- ***************************************/
- void Init(void)
- {
- MotorCtrl(0);
- TMOD=0x51; //定時器T1工作于計數模式1,定時器T0工作于計時模式1
- TH0=(65536-10000)/256; //定時器T0的高8位設置初值,每10ms產生一次中斷
- TL0=(65536-10000)%256; //定時器T0的低8位設置初值,每10ms產生一次中斷
- TH1=0; //定時器T1高8位賦初值0
- TL1=0; //定時器T1低8位賦初值0
- EA=1; //開總中斷
- ET0=1; //定時器T0中斷允許
- TR1=1; //定時器T1啟動
- TR0=1; //定時器T0啟動
- }
- /**************************************
- 電機正反轉及停止控制
- ***************************************/
- void MotorCtrl(uchar cmd)
- {
- uchar temp;
- temp=P2&0x0f;
- if(cmd==0)
- {
- temp|=0xa0;//停止
- LED2=1;LED3=1;
- }
- else if(cmd==1)
- {
- temp|=0x30;//正轉
- LED2=0;LED3=1;
- }
- else if(cmd==2)
- {
- temp|=0xc0;//反轉
- LED2=1;LED3=0;
- }
- P2=temp;
- }
- /**************************************
- 按鍵掃描
- ***************************************/
- uchar Key_Scan(void)
- {
- static uchar key_up=1;//按鍵按松開標志
- if(key_up&&(KEY1==0||KEY2==0||KEY3==0||KEY4==0))
- {
- Delay(10);//去抖動
- key_up=0;
- if(KEY1==0)return 1;
- if(KEY2==0)return 2;
- if(KEY3==0)return 3;
- if(KEY4==0)return 4;
- }
- else if(KEY1==1&&KEY2==1&&KEY3==1&&KEY4==1)key_up=1;
- return 0;
- }
- 0)return 3;
- if(KEY4==0)return 4;
- }
- else if(KEY1==1&&KEY2==1&&KEY3==1&&KEY4==1)key_up=1;
- return 0;
- }
復制代碼
完整的Word格式文檔51黑下載地址:
控制電機綜合性試驗訓練---直流伺服電機(5)(1).doc
(2.21 MB, 下載次數: 81)
2018-12-28 15:57 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|