找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 18806|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

基于單片機的直流伺服電機控制系統(tǒng)設(shè)計論文

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:367315 發(fā)表于 2018-7-9 17:05 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
這是一個直流伺服電機控制系統(tǒng)設(shè)計  有代碼  大師搭建出來仿真有問題 大家?guī)兔纯?br />
電子信息與電氣工程系
課程設(shè)計報告

設(shè)計題目:    直流伺服電機控制系統(tǒng)設(shè)計     
系    別:電子信息與電氣工程系
年級專業(yè):
學(xué)    號:
學(xué)生姓名:
      
自動化專業(yè)《計算機控制技術(shù)》課程設(shè)計任務(wù)書
論文
題目
直流伺服電機控制系統(tǒng)設(shè)計
設(shè)計類型

導(dǎo)師姓名
丁健
干開峰
主要內(nèi)容及目標
設(shè)計對象是直流伺服電機實驗臺,設(shè)計一個計算機控制的直流伺服電機控制系統(tǒng)。由測量元件(位移傳感器)對被控制對象(電機)的被控參數(shù)(位移)進行測量,由變換發(fā)送單元(A/D轉(zhuǎn)換器)將被控參數(shù)變成一定形式的信號 ,送給控制器CPU,控制器將測量信號(實際位移量)與給定信號(位移量)進行比較,若有誤差則按預(yù)定的控制規(guī)律產(chǎn)生一控制信號驅(qū)動執(zhí)行機構(gòu)(伺服電機控制電源)工作,使被控參數(shù)(實際位移量)與給定信號(位移量)保持一致。其電機位置隨動系統(tǒng):
其中: =1.8,=0.035,=0.15,K =100,控制算法選用數(shù)字PID控制。
設(shè)計條件
  • PC機一臺,教學(xué)實驗箱一臺;

計劃學(xué)生數(shù)及任務(wù)
3人
(1):明確課題功能。
(2):把復(fù)雜問題分解為若干模塊,確定各模塊處理方法,畫出流程圖。
(3):存儲器資源分配
(4):編制程序,根據(jù)流程圖來編制源程序
(5):對程序進行匯編,調(diào)試和修改,直到程序運行結(jié)果正確為止。
計劃設(shè)計進程
  • 總體方案設(shè)計
  • 控制系統(tǒng)的建模和數(shù)字控制器設(shè)計
  • 硬件的設(shè)計和實現(xiàn)
  • 選擇計算機字長(選用 51內(nèi)核的單片機)
  • 設(shè)計支持計算機工作的外圍電路(EPROM、RAM、I/O端口、鍵盤、顯示接口電路等);
  • 設(shè)計輸入信號接口電路;
  • 設(shè)計輸出控制電路;
  • 其它相關(guān)電路的設(shè)計或方案(電源、通信等)。
  • 軟件設(shè)計
  • 分配系統(tǒng)資源,編寫系統(tǒng)初始化和主程序模塊框圖;
  • 編寫A/D轉(zhuǎn)換和位置檢測子程序框圖;
  • 編寫控制程序和D/A轉(zhuǎn)換控制子程序模塊框圖;
  • 其它程序模塊(顯示與鍵盤等處理程序)框圖。
五、編寫課程設(shè)計說明書,繪制完整的系統(tǒng)電路圖(A3幅面)。
參考文獻
1.于海生 計算機控制技術(shù)[M] 北京:機械工業(yè)出版社,2007.6
2、周荷琴等 微型計算機原理及接口技術(shù)[M]合肥:中國科技大學(xué)出版社,2008.6   
3、李剛民等 單片機原理及應(yīng)用技術(shù)[M]北京:高等教育出版社
4、樓然苗  51系列單片機設(shè)計實例[M]北京:北京航空航天大學(xué)出版社
5、計算機控制技術(shù)實驗指導(dǎo)書
摘要
隨著集成電路技術(shù)的飛速發(fā)展,微控制器在伺服控制系統(tǒng)普遍應(yīng)用,這種數(shù)字伺服系統(tǒng)的性能可以大大超過模擬伺服系統(tǒng)。數(shù)字伺服系統(tǒng)可以實現(xiàn)高精度的位置控制、速度跟蹤,可以隨意地改變控制方式。單片機和DSP在伺服電機控制中得到了廣泛地應(yīng)用,用單片機作為控制器的數(shù)字伺服控制系統(tǒng),有體積小、可靠性高、經(jīng)濟性好等明顯優(yōu)點。。本設(shè)計研究的直流伺服電機控制系統(tǒng)即以單片機作為核心部件,主要是單片機為控制核心通過軟硬件結(jié)合的方式對直流伺服電機轉(zhuǎn)速實現(xiàn)開環(huán)控制。
對于伺服電機的閉環(huán)控制,采用PID控制,利用MATLAB軟件對單位階躍輸入響應(yīng)的PID校正動態(tài)模擬仿真,研究PID控制作用以及PID各參數(shù)值對控制系統(tǒng)的影響,通過試湊法得到最佳PID參數(shù)。同時能更深度地掌握在 自動控制領(lǐng)域應(yīng)用極為廣泛的MATLAB軟件。
目   錄
1.引言
2.單片機控制系統(tǒng)硬件組成
2.1 微控制器
2.2 DAC0808轉(zhuǎn)換器
2.3運算放大器
2.4按鍵輸入和顯示模塊
2.4.1 按鍵輸入
2.4.2 顯示模塊
2.5 直流伺服電動機
3.單片機控制系統(tǒng)軟件設(shè)計
3.1主程序
3.2鍵盤處理子程序
4.控制系統(tǒng)原理圖及仿真
4.1控制系統(tǒng)方框圖
4.2控制系統(tǒng)電路原理圖
4.3 Proteus仿真結(jié)果
5.Simulink組件對直流伺服控制系統(tǒng)的仿真
5.1 MATLAB與Simulink簡介
5.1.1 MATLAB簡介
5.1.2 Simulink簡介
5.2 直流伺服電機數(shù)學(xué)模型
5.3 系統(tǒng)Simulink模型及時域特性仿真
5.3.1 開環(huán)系統(tǒng)Simulink模型及仿真
5.3.2 單位負反饋系統(tǒng)Simulink模型及仿真
5.4 PID校正
5.4.1 PID參數(shù)的湊試法確定
5.4.2 比例控制器校正
5.4.3 比例積分控制器校正
5.4.4 PID控制器校正
6.小結(jié)
參考文獻
附錄
1.引言
本設(shè)計的單片機控制直流伺服電機系統(tǒng)是一個開環(huán)的自動控制系統(tǒng)控制系統(tǒng)。是以單片機為控制器, 通過按鈕設(shè)置設(shè)定值輸入到單片機,單片機對輸入信號處理后輸出控制信號,經(jīng)D/A轉(zhuǎn)換器DAC0808轉(zhuǎn)換后把數(shù)字信號轉(zhuǎn)變?yōu)槟M電壓,再經(jīng)放大器放大后,去控制伺服電機工作,進而控制電機向著預(yù)定的轉(zhuǎn)速轉(zhuǎn)動。同時單片機處理的數(shù)字信號通過LCD來顯示,實時顯示單片機的轉(zhuǎn)速值。
另外本設(shè)計還利用了MATLAB軟件,利用 Simulink構(gòu)造直流電機控制系統(tǒng)模型,通過對各個單元部件的參數(shù)進行設(shè)定,進而對直流伺服電機系統(tǒng)控制進行仿真,就其仿真功能對系統(tǒng)進行時域分析。
2.單片機控制系統(tǒng)硬件組成
本系統(tǒng)是由一片單片機、矩陣式鍵盤,DAC0808轉(zhuǎn)換器、運算放大器、顯示模塊和一臺直流伺服電機組成,另外通過Proteus7.4軟件進行仿真。
2.1 微控制器
選用AT89C52單片機。 AT89C52是51系列單片機的一個型號,它是ATMEL公司生產(chǎn)的。
  AT89C52是一個低電壓,高性能CMOS 8位單片機,片內(nèi)含8k bytes的可反復(fù)擦寫的Flash只讀程序存儲器和256 bytes的隨機存取數(shù)據(jù)存儲器(RAM),器件采用ATMEL公司的高密度、非易失性存儲技術(shù)生產(chǎn),兼容標準MCS-51指令系統(tǒng),片內(nèi)置通用8位中央處理器和Flash存儲單元,功能強大的AT89C52單片機可為您提供許多較復(fù)雜系統(tǒng)控制應(yīng)用場合。
  AT89C52有40個引腳,32個外部雙向輸入/輸出(I/O)端口,同時內(nèi)含2個外中斷口,3個16位可編程定時計數(shù)器,2個全雙工串行通信口,2個讀寫口線,AT89C52可以按照常規(guī)方法進行編程,但不可以在線編程(S系列的才支持在線編程)。其將通用的微處理器和Flash存儲器結(jié)合在一起,特別是可反復(fù)擦寫的Flash存儲器可有效地降低開發(fā)成本。
  AT89C52有PDIP、PQFP/TQFP及PLCC等三種封裝形式,以適應(yīng)不同產(chǎn)品的需求。
主要功能特性:
(1)兼容MCS51指令系統(tǒng),8k可反復(fù)擦寫(>1000次)Flash ROM
(2)32個雙向I/O口,256x8bit內(nèi)部RAM
(3)3個16位可編程定時/計數(shù)器中斷,時鐘頻率0-24MHz
(4)2個串行中斷,可編程UART串行通道
(5)2個外部中斷源,共6個中斷源
(6)2個讀寫中斷口線,3級加密位
(7)低功耗空閑和掉電模式,軟件設(shè)置睡眠和喚醒功能
圖2-1 AT89C52
2.2 DAC0808轉(zhuǎn)換器
設(shè)計中采用的芯片是DAC0808,它是一個8位DAC。圖2是DAC0808典型應(yīng)用電路。圖2-1中輸出的模擬量是一個正電壓,當(dāng)需要負電壓時,在DAC的第4引腳直接接一個3KΩ左右的電阻即可。DAC的第4引腳的電流總是流入的,其最大值為1.992mA。當(dāng)外接一個3KΩ的負載電阻RL時,輸出的電壓是通過RL上所加的電壓,最大的電壓為-3KΩ×1.922mA ≈-6V(當(dāng)所有位輸入都是高電平的時候),與實驗中的數(shù)據(jù)相符合。需要指出的是,負載電阻的大小會影響轉(zhuǎn)換時間,當(dāng)負載電阻為2.5KΩ的時候,在最壞的情況下,會使轉(zhuǎn)換時間增加1.2μs。

圖2-2  DAC0808典型應(yīng)用電路
2.3運算放大器
把D/A轉(zhuǎn)換器的電流輸出轉(zhuǎn)換為電壓輸出,同時也是把微小的電流信號放大為較大的電壓信號,以驅(qū)動電機轉(zhuǎn)動。
2.4按鍵輸入和顯示模塊2.4.1 按鍵輸入
采用自己設(shè)計的形如3×4矩陣式按鈕,按鈕用于設(shè)定某一數(shù)值,即電機轉(zhuǎn)速值。通過
程序設(shè)置延時環(huán)節(jié)來消除按鈕的抖動問題,這樣做使矩陣式按鈕硬件連線簡單,同時按鈕的軟件設(shè)計也不復(fù)雜。
2.4.2 顯示模塊
系統(tǒng)采用點陣式液晶顯示器,顯示電機的當(dāng)前轉(zhuǎn)速值,通過軟件設(shè)計使得連線簡單。
2.5 直流伺服電動機
直流伺服電動機在伺服系統(tǒng)中控制機械元件運轉(zhuǎn)的發(fā)動機.是一種補助馬達間接變速裝置。又稱執(zhí)行電動機,在自動控制系統(tǒng)中,用作執(zhí)行元件,把所收到的電信號轉(zhuǎn)換成電動機軸上的角位移或角速度輸出。其主要特點是,當(dāng)信號電壓為零時無自轉(zhuǎn)現(xiàn)象,轉(zhuǎn)速隨著轉(zhuǎn)矩的增加而勻速下降。其作用可使控制速度,位置精度非常準確。
直流伺服電動機的結(jié)構(gòu)與直流電動機基本相同。只是為減小轉(zhuǎn)動慣量,電機做得細長一些。所不同的是電樞電阻大,機械特性軟、線性(電阻大,可弱磁起動、可直接起動)。供電方式是他勵供電,即勵磁繞組和電樞分別兩個獨立的電源供電?刂品绞接.電樞控制和磁極控制,其中改變電樞電壓U調(diào)速范圍較大,直流伺服電機常用此方法調(diào)速
直流伺服電動機 轉(zhuǎn)速的計算公式如下:
式中:n為轉(zhuǎn)速;Φ為磁通;U為外加電壓;I、R為電樞電流和電阻;Ke為電勢系數(shù)。
3.單片機控制系統(tǒng)軟件設(shè)計
軟件設(shè)計采用模塊化設(shè)計,由主程序模塊和功能實現(xiàn)模塊兩大部分組成。主程序通過讀取鍵值處理后送到D/A轉(zhuǎn)換以達到控制電機的目的;功能實現(xiàn)模塊主要由主函數(shù)模塊、鍵盤處理子程序和D/A轉(zhuǎn)換子程序等組成。
3.1主程序
主程序首先對鍵盤和顯示模塊的程序進行初始化,通過讀取鍵值處理后送到D/A轉(zhuǎn)換以達到控制電機的目的。主程序流程圖如圖2-1所示。
圖2-1 主程序流程圖
3.2鍵盤處理子程序
鍵盤采用程序掃描的工作方式,即在特定的程序位置段上安排鍵盤掃描程序讀取鍵盤狀態(tài)。鍵盤處理子程序的程序掃描法流程圖如圖2-2所示。
圖2-2 鍵盤處理子程序的程序掃描法流程圖
4.控制系統(tǒng)原理圖及仿真4.1控制系統(tǒng)方框圖
控制系統(tǒng)是以單片機為控制器 ,通過鍵盤設(shè)置輸入轉(zhuǎn)速值,經(jīng)單片機處理后送到D/A轉(zhuǎn)換器,模擬信號經(jīng)功率放大后驅(qū)動電機,最終電機以設(shè)定的轉(zhuǎn)速值穩(wěn)定旋轉(zhuǎn)。圖4-1即為控制系統(tǒng)方框圖
圖4-1  控制系統(tǒng)方框圖
4.2控制系統(tǒng)電路原理圖
圖4-2  控制系統(tǒng)電路原理圖
4.3 Proteus仿真結(jié)果
圖4-3 Proteus仿真圖
利用Proteus 7.4a進行仿真,當(dāng)通過鍵盤選擇某一數(shù)值時,電機轉(zhuǎn)速即為相應(yīng)的設(shè)定值,并在仿真電路圖中電機下方顯示電機對應(yīng)轉(zhuǎn)速值的變化及最終穩(wěn)定值。圖4-3中仿真圖是當(dāng)通過按鍵設(shè)定值為158時,電機下方液晶顯示器即顯示158,表明電機轉(zhuǎn)速為158 r/min。經(jīng)多次仿真分析,某些時候與鍵盤輸入值相比較得知當(dāng)電機響應(yīng)輸入值時有很小的穩(wěn)態(tài)誤差存在,原因是沒有加入反饋環(huán)節(jié)。以下利用MATLAB仿真軟件研究PID反饋控制對直流伺服電機控制系統(tǒng)的作用。
5.Simulink組件對直流伺服控制系統(tǒng)的仿真5.1 MATLAB與Simulink簡介5.1.1 MATLAB簡介
MATLAB軟件推出并應(yīng)用到自動控制領(lǐng)域后,極大地改善了自動控制系統(tǒng)的動態(tài)仿真和性能分析環(huán)境。MATLAB(Matrix Laboratory,矩陣實驗室)是一個適用于科學(xué)計算和工程應(yīng)用的數(shù)學(xué)軟件系統(tǒng)。自1982年由Mathworks軟件公司推出后,經(jīng)二十多年的發(fā)展,現(xiàn)已是IEEE
組織認可的最優(yōu)化的科技應(yīng)用軟件,成為大學(xué)教學(xué)和科研中最常用的工具。掌握了MATLAB的應(yīng)用,對直流伺服電機控制效果的改善,肯定有著意想不到的幫助。該軟件具有以下特點:
(1)數(shù)值運算功能強大;
(2)編程環(huán)境簡單;
(3)數(shù)據(jù)可視化功能強;
(4)豐富的程序工具箱;
(5)可擴展性能強等。
5.1.2 Simulink簡介
Simulink是MATLAB軟件的擴展,它是實現(xiàn)動態(tài)系統(tǒng)建模和仿真的一個軟件包,他與MATLAB語言的主要區(qū)別在于,其與用戶的交互接口是基于Windows模型化圖形輸入,使得用戶可以把更多的精力投入到系統(tǒng)模型的構(gòu)建,而非編程上。
使用Simulink進行仿真一般分為兩步:用戶首先需要在仿真模型編輯窗口中搭建好自己的仿真模型,設(shè)置好具體模型參數(shù)和仿真參數(shù),然后就可以開始仿真,Simulink將根據(jù)用戶搭建的模型,模擬系統(tǒng)在用戶設(shè)定條件下的具體行為。下面將以直流伺服電機的自動控制為例,演示MATLAB中Simulink仿真的應(yīng)用。
5.2 直流伺服電機數(shù)學(xué)模型
直流伺服電機開環(huán)系統(tǒng)結(jié)構(gòu)圖如圖圖5-1所示
  
圖5-1  直流伺服電機開環(huán)系統(tǒng)結(jié)構(gòu)圖
其中直流伺服電機的傳遞函數(shù)為
5.3 系統(tǒng)Simulink模型及時域特性仿真
對于單輸入單輸出系統(tǒng),在經(jīng)典控制理論中可用傳遞函數(shù)來描述系統(tǒng), 獲得系統(tǒng)的動態(tài)響應(yīng)。同樣,S仿真軟件也有傳遞函數(shù)模塊,可方便地描述系統(tǒng)的特性,且簡化了仿真模型。從模塊庫窗口創(chuàng)建系統(tǒng)模型如圖1所示,選信號源模塊組中的階躍信號模塊為輸入信號,以輸出模塊組中的示波器模塊作為顯示器來觀察系統(tǒng)階躍響應(yīng)。在模型窗口設(shè)置傳遞函數(shù)模塊的參數(shù)和特性,運行仿真模型,得系統(tǒng)階躍響應(yīng)曲線。
5.3.1 開環(huán)系統(tǒng)Simulink模型及仿真
圖5-2  直流伺服電機開環(huán)系統(tǒng)Simulink模型
端口Step為直流伺服電機的輸入電壓,輸出端口為電機轉(zhuǎn)速。
圖5-3是開環(huán)系統(tǒng)的仿真結(jié)果,即開環(huán)系統(tǒng)的階躍響應(yīng)曲線,也即直流伺服電機輸入1V單位階躍電壓時。電機的轉(zhuǎn)軸輸出呈線性變化。
圖5-3  開環(huán)系統(tǒng)仿真圖
由圖5-3響應(yīng)曲線可知,系統(tǒng)沒有在可視范圍內(nèi)達到穩(wěn)態(tài)值“1”,但從理論上分析知此系統(tǒng)屬穩(wěn)定系統(tǒng),在足夠時間內(nèi)是能夠達到穩(wěn)定狀態(tài)的。上述分析說明:系統(tǒng)的響應(yīng)速度較慢,系統(tǒng)性能較差,從而可能不具備使用價值。這個分析結(jié)果表明,該系統(tǒng)沒有達到預(yù)期的設(shè)計要求。
5.3.2 單位負反饋系統(tǒng)Simulink模型及仿真
圖5-4是在圖5-3的基礎(chǔ)上加一個單位負反饋環(huán)節(jié),構(gòu)成直流伺服電機的單位負反饋系統(tǒng),單位負反饋系統(tǒng)Simulink模型如圖5-4所示
圖5-4 直流伺服電機單位負反饋系統(tǒng)Simulink模型
圖5-5是單位負反饋系統(tǒng)的仿真結(jié)果
圖5-5 單位負反饋系統(tǒng)仿真圖
系統(tǒng)超調(diào):40%,調(diào)節(jié)時間:2 s。由圖5-5和開環(huán)階躍響應(yīng)曲線相比較知:系統(tǒng)應(yīng)經(jīng)可以達到較快達到穩(wěn)態(tài)值。說明閉環(huán)單位負反饋系統(tǒng)對系統(tǒng)性能有很大改善。
5.4 PID校正
為了使系統(tǒng)能夠達到設(shè)計要求,我們可以在圖5-4前向通道上設(shè)置一個控制器構(gòu)成閉環(huán)系統(tǒng)來校正直流伺服電機;赑ID控制(閉環(huán))的直流伺服電機系統(tǒng)框圖如圖5-6所示。
圖5-6  基于PID控制(閉環(huán))的直流伺服電機系統(tǒng)框圖
其控制過程為由測速發(fā)電機輸出電壓得到直流電機輸出量,即轉(zhuǎn)速,通過轉(zhuǎn)速反饋后與系統(tǒng)輸入信號進行比較,得到偏差信號。偏差信號作為PID控制器的輸入信號根據(jù)設(shè)定的PID控制規(guī)律計算后輸出信號U,作為控制量輸入給直流電機,從而實現(xiàn)整個直流電機調(diào)速系統(tǒng)的閉環(huán)負反饋PID控制。
5.4.1 PID參數(shù)的湊試法確定
增大比例系數(shù)KP一般系統(tǒng)響應(yīng)利于減小靜差,但是過大會增大超調(diào),并產(chǎn)生震蕩,是穩(wěn)定性變壞。增大TI有減小超調(diào),減小震蕩,是系統(tǒng)更穩(wěn)定,但靜差消除變慢。增大微分TD利于加快系統(tǒng)響應(yīng)時間,使超調(diào)減小,穩(wěn)定性增加,但對擾動的抑制能力減弱,對擾動有較敏感的響應(yīng)。
在湊試時,對參數(shù)實行下述先比例,后積分,再微分的整定步驟。
(1)首先只整定比例部分。即將比例部分由小變大,并觀察相應(yīng)的系統(tǒng)響應(yīng),直到得到反應(yīng)快,超調(diào)小的響應(yīng)曲線。如果系統(tǒng)沒有靜差或靜差已小到允許范圍內(nèi),并且響應(yīng)曲線已屬滿意,那么只需用比例控制器即可,最優(yōu)比例系數(shù)可由此確定。
(2)如果在比例調(diào)節(jié)的基礎(chǔ)下系統(tǒng)的靜差不能滿足設(shè)計要求,則須加入積分環(huán)節(jié)。整定時首先置積分時間T1為一較大值,并將經(jīng)第一步整定得到的比例系數(shù)略微縮小,然后減小積分時間,并在保持系統(tǒng)良好動態(tài)性能的情況下,靜差得到消除。在此過程中,可根據(jù)響應(yīng)曲線的好壞反復(fù)改變比例系數(shù)與積分時間,以期得到滿意的控制過程與整定參數(shù)。
(3)若使用比例積分控制器消除了靜差,但動態(tài)過程經(jīng)反復(fù)調(diào)整仍不能滿意,則可加入微分環(huán)節(jié),構(gòu)成比例積分微分控制器。在整定時,可先置微分時間Td為零。在第二步整定的基礎(chǔ)上,增大Td,同時相應(yīng)的改變比例系數(shù)和積分時間,逐步湊試,以獲得滿意的調(diào)節(jié)效果和控制參數(shù)。
5.4.2 比例控制器校正
為能要求系統(tǒng)在特別短的時間內(nèi)達到設(shè)定的轉(zhuǎn)速值,比例增益K 應(yīng)盡可能大,以提高比例作用的強度,但必須同時考慮系統(tǒng)的穩(wěn)定性。采用單純的比例控制,其調(diào)整時間和超調(diào)量是一對矛盾,無法同時滿足:要縮短調(diào)整時間,K 要加大;而K 加大,超調(diào)量也同時加大了。經(jīng)過多次參數(shù)選擇,當(dāng)K。=10時,階躍響應(yīng)曲線較為理想,呈現(xiàn)接近0.75衰減率的振蕩過程。
比例控制系統(tǒng)Simulink模型及仿真
圖5-7 比例控制系統(tǒng)Simulink模型
Kp=1時仿真圖
Kp=3時仿真圖
Kp=5時仿真圖
由以上三個比例控制的仿真圖可知,增大比例系數(shù)KP一般系統(tǒng)響應(yīng)利于減小靜差,但是過大會增大超調(diào),并產(chǎn)生震蕩,是穩(wěn)定性變壞。
5.4.3 比例積分控制器校正
積分控制的作用是只要系統(tǒng)存在誤差,積分控制作用就不斷地積累,輸出控制量以消除誤差,因而,只要有足夠的時間,積分控制將能完全消除誤差。在比例環(huán)節(jié)基礎(chǔ)上加入積分環(huán)節(jié),只要參數(shù)設(shè)置合適就能完全消除系統(tǒng)偏差。
比例積分控制系統(tǒng)Simulink模型
圖5-8 比例積分控制系統(tǒng)Simulink模型
Kp=1、Ki=1時仿真圖
Kp=1、Ki=3時仿真圖
Kp=5、Ki=3時仿真圖
由以上三個比例積分控制的仿真圖可知,增大TI有減小超調(diào),減小震蕩,使系統(tǒng)更穩(wěn)定,但靜差消除變慢。PI控制參數(shù)設(shè)置適當(dāng)可使系統(tǒng)靜差為零。經(jīng)多次試湊,選KI=1.
5.4.4 PID控制器校正
比例積分作用雖能是系統(tǒng)誤差為零,但系統(tǒng)動態(tài)性能不能得到滿足。積分作用太強可能會使系統(tǒng)出現(xiàn)震蕩。微分控制具有超前控制能力,可抑制最大動態(tài)偏差,改善系統(tǒng)動態(tài)性能,提高系統(tǒng)的穩(wěn)定性。為此,在PI作用基礎(chǔ)上引入微分控制,構(gòu)成PID控制器,以使系統(tǒng)滿足穩(wěn)、準、快的要求。
PID控制控制系統(tǒng)Simulink模型如圖
圖5-9 PID控制系統(tǒng)Simulink模型
Kp=1、Ki=1、Kd=0.1時仿真圖
和PI控制閉環(huán)響應(yīng)曲線相比較可知:系統(tǒng)響應(yīng)時間變短,超調(diào)變小,但仍不符合要求;
Kp=5、Ki=1、Kd=0.1時仿真圖
與KP=1、KI=1、KD=0.1時的仿真圖相比,系統(tǒng)超調(diào)和調(diào)節(jié)時間都變小,仍然不符合要求,繼續(xù)校正。需加大Kp及Ki。
Kp=12、Ki=1、Kd=0.5時仿真圖
由上曲線知此時系統(tǒng)有微量的超調(diào),進一步加大Ki時超調(diào)為零。
Kp=12、Ki=1、Kd=0.9時仿真圖
經(jīng)過多次校正參數(shù),此時當(dāng) Kp=12、Ki=1、Kd=0.9時系統(tǒng)超調(diào)量為0,穩(wěn)態(tài)誤差為0,性能滿足設(shè)計要求,穩(wěn)定、準確、快速得到了完滿的統(tǒng)一。
6.小結(jié)
控制系統(tǒng)特點是以單片機為控制器 ,通過鍵盤設(shè)置輸入轉(zhuǎn)速值,使得電機的轉(zhuǎn)速設(shè)置方便快捷,另外又通過軟件實現(xiàn)系統(tǒng)轉(zhuǎn)速設(shè)置范圍的保護。
    但在proteus中沒能實現(xiàn)閉環(huán)系統(tǒng)的PID控制。此缺點通過軟件彌補,在MATLAB軟件中的SIMULINK中進行了直流伺服電機的開環(huán)控制系統(tǒng)仿真,單位閉環(huán)控制系統(tǒng)仿真,閉環(huán)PI控制系統(tǒng)仿真,閉環(huán)PD控制仿真,閉環(huán)PID控制仿真能夠更好的測試和控制系統(tǒng)的性能,從而為設(shè)計事物提供了更準確的性能指標。

  1. #include "reg52.h"
  2. //#include "absacc.h"
  3. //#include "stdio.h"
  4. //#include "math.h"
  5. //#include "string.h"
  6. #define unchar unsigned char
  7. #define unint unsigned int
  8. void wdata(unchar dat);//write data function
  9. void wcom(unchar com);//write command function
  10. void delay(unchar t);//delay function
  11. sbit rw=P3^1;//rw
  12. sbit rs=P3^0;//rs
  13. sbit en=P3^2;//en
  14. #define MAX_LEN 16    // 數(shù)據(jù)最大長度
  15. #define count_M1 50000
  16. #define H_0 (65536-count_M1)/256
  17. #define L_0 (65536-count_M1)%256
  18. unchar code tab2[]={0x31,0x32,0x33,0x41,0x34,0x35,0x36,0x42,0x37,0x38,0x39,
  19.                     0x43,0x0e,0x30,0x0f,0x44};      //鍵盤求值表
  20. unchar code tab3[]={"Target Value:  "};
  21. unchar code tab4[]={" "};
  22. unchar code tab6[]={" input ERR "};
  23. unchar serial_data[MAX_LEN],serial_len=0,sure_flag=0;

  24. void wdata(unchar dat);//write data function
  25. void wcom(unchar com);//write command function
  26. void delay(unchar t);//delay function
  27. void keyscan(void);//鍵盤操作程序
  28. unchar scankey(void);//鍵盤求值程序
  29. void chushi(void);//初始化程序
  30. //void init_serial(void);//串口初始化
  31. //void uart_serial(void);//串口主程序
  32. void lcd_write(void);//液晶顯示待發(fā)送指令
  33. unchar jisuan(void);//計算結(jié)果為十進制
  34. unint freq = 0;//頻率變量
  35. sfr16 DPTR=0x82;//申明DPTR
  36. char times=0;//計算T0中斷次數(shù)
  37. //delay function
  38. //P0=0x00;
  39. //中斷初始化
  40. void init_interrup(void)
  41.               {
  42.                 IE=0x8a;//啟用T0,T1中斷
  43.                 TMOD=0x51;//T1為計數(shù)器,T2為定時器,都采用mode1
  44.                 TH0=H_0;
  45.                 TL0=L_0;
  46.                 TH1=0;
  47.                 TL1=0;
  48.                 TR0=1;
  49.                 TR1=1;            
  50.               }
  51. void delay(unchar t)
  52.      {
  53.      unchar a,b;
  54.      for(a=0;a<t;a++)
  55.      for(b=0;b<128;b++);
  56.      }
  57. //The function for write data to LCD screen
  58. void wdata(unchar dat)
  59.      {
  60.        P1=dat;
  61.        rs=1;
  62.        rw=0;
  63.        en=0;
  64.        delay(6);
  65.        en=1;
  66.      }
  67. //The function for write command to LCD screen
  68. void wcom(unchar com)
  69.      {
  70.      P1=com;
  71.      rs=0;
  72.      rw=0;
  73.      en=0;
  74.      delay(6);
  75.      en=1;
  76.      }
  77. //初始程序
  78. void chushi(void)
  79.      {
  80.               unchar i;
  81.      wcom(0x01);
  82.      wcom(0x38);
  83.      wcom(0x0c);
  84.      wcom(0x06);
  85.               delay(4);
  86.               wcom(0x80);
  87.               delay(4);
  88.      for(i=0;i<17;i++)
  89.          {
  90.          wdata(tab3[i]);
  91.          }
  92.      wcom(0xc0);
  93.      delay(2);
  94.      }
  95. //鍵盤求值程序
  96. unchar scankey(void)
  97.    {
  98.      unchar temp,c,d;
  99.               P2=0x0f;
  100.               temp=P2;
  101.      temp=temp&0x0f;//屏蔽高四位,取列值
  102.      temp=~(temp|0xf0);//將temp中的內(nèi)容與0xf0進行相加,最后求反可得到是那列按下
  103.      if(temp==1)
  104.          c=0;//P2.0位低電平
  105.      else if(temp==2)
  106.          c=1;//P2.1位低電平
  107.      else if(temp==4)
  108.          c=2;//P2.2位低電平
  109.      else if(temp==8)
  110.          c=3;//P2.3位低電平
  111.      else
  112.          c=0;//否則給返回值C=0
  113.      P2=0xf0;//給P2的行為高電平,以來判斷是高四為的那位為低電平
  114.      delay(1);
  115.      temp=P2;
  116.      temp=temp&0xf0;//屏蔽低四位
  117.      temp=~((temp>>4)|0xf0);//將temp中的高四位向右移動4位,與0xf0相加,最后求反可以得到是那行按下
  118.      if(temp==1)
  119.         c=c+0;//將行P2.4的值加上列的值
  120.      else if(temp==2)
  121.         c=c+4;//將行P2.5的值加上列的值
  122.      else if(temp==4)
  123.         c=c+8;//將行P2.6的值加上列的值
  124.      else if(temp==8)
  125.         c=c+12;//將行P2.7的值加上列的值
  126.      else
  127.         c=0;
  128.               d=tab2[c];
  129.     return (d);//最后返回行加列的值
  130.    }

  131. //lcd_write function
  132. void lcd_write(void)
  133.     {
  134.               unchar write_0,write_1,jian_zhi[MAX_LEN];
  135.               for(write_0=0;write_0<MAX_LEN;write_0++)
  136.                     {
  137.                                serial_data[write_0]=0;
  138.                               }   //清空發(fā)送緩沖數(shù)組
  139.               wcom(0x0f);   // 將光標置在oxc0處
  140.               serial_len=0;
  141.               delay(2);
  142.               while(1)     
  143.                 {
  144.               write_1=0xc0;   //光標地址
  145.               wcom(write_1);
  146.               for(write_0=0;write_0<MAX_LEN; )   //輸入指令  最大為MAX_LEN
  147.                     {
  148.                        wcom(write_1);
  149.            P2=0x0f;                      //等待鍵盤值
  150.                                while((P2&0x0f)==0x0f);
  151.                                jian_zhi[write_0]=scankey();
  152.                                delay(1);
  153.                                P2=0x0f;
  154.                                while((P2&0x0f)!=0x0f);       //等待按鍵放松
  155.                                             if(jian_zhi[write_0]==0x0e)   //當(dāng)按一下取消鍵時 清空所有發(fā)送緩沖數(shù)組,
  156.                                         {                      //當(dāng)連續(xù)按下兩次時則取消本次通訊,退出
  157.                                                           if(write_0==0)
  158.                                                               goto write_out;
  159.                                                           else if(write_0>=1)
  160.                                                               {
  161.                                                                         write_1-=1;
  162.                                                                         wcom(write_1);
  163.                                                                         write_0-=1;
  164.                                                                         wdata(tab4[0]);
  165.                                                                         serial_data[write_0]=0;
  166.                                                                         serial_len--;
  167.                                                                         }
  168.                                                         }
  169.                                             else if(jian_zhi[write_0]==0x0f)      //確定發(fā)送的指令
  170.                                                {
  171.                                                           if(serial_len==3)
  172.                                                                       {if(serial_data[0]<2)
  173.                                                                                     sure_flag++;
  174.                                                                       else if(serial_data[0]>2);
  175.                                                                       else
  176.                                                                           {
  177.                                                                             if(serial_data[1]<5)
  178.                                                                                       sure_flag++;
  179.                                                                                       else if(serial_data[1]>5);
  180.                                                                                       else
  181.                                                                                         {
  182.                                                                                                     if(serial_data[2]<6)
  183.                                                                                                     sure_flag++;
  184.                                                                                                     else ;
  185.                                                                                                   }
  186.                                                                           }
  187.                                                                         }
  188.                                                           else
  189.                                                                       sure_flag++;                      //確定的標志位
  190.                                                         goto write_out;                      //退出本次輸入指令
  191.                                                         }
  192.                                             else
  193.                                                {
  194.                                                         wdata(jian_zhi[write_0]);
  195.                                                         if(jian_zhi[write_0]<=0x39)
  196.                                                              serial_data[write_0]=jian_zhi[write_0]-0x30;
  197.                                                         else
  198.                                                              serial_data[write_0]=jian_zhi[write_0]-0x37;
  199.                                                         write_1++;
  200.                                                         write_0++;
  201.                                                         serial_len++;
  202.                                                         }
  203.                     }
  204.                  }
  205.     write_out :
  206.                          delay(1);
  207.     }
  208. //合并數(shù)組
  209. void serial_and(void)
  210.     {
  211.               unchar and0,and1,and2=0;
  212.               and1=serial_len/2;
  213.               for(and0=0;and0<and1;and0++)
  214.                   {
  215.                             serial_data[and0]=(serial_data[and0+and2++]<<4)|serial_data[and0+and2];
  216.                             }
  217.               }                           
  218. //鍵盤操作
  219. void keyscan(void)
  220.    {
  221.      unchar ks_0,ks_1;
  222.      delay(2);//延時去抖動
  223.               P2=0x0f;
  224.      if((P2&0x0f)!=0x0f)//延時后在判斷一次,去除抖動影響
  225.                   {
  226.                             ks_0=scankey(); //求鍵盤值
  227.                             P2=0x0f;
  228.                             while((P2&0x0f)!=0x0f);  //等待放松
  229.         while(ks_0==0x41)
  230.                                  {
  231.                                           switch(ks_0)
  232.                                               {
  233.                                              case 0x41 :
  234.                                                        {
  235.                                                                                     chushi();
  236.                                                                                     lcd_write();   //調(diào)用寫指令程序
  237.                                                                            if((sure_flag==1)&&(serial_len<=3)&&(jisuan()<256))
  238. //發(fā)送指令的條為確認發(fā)送標志sure_flag=1&&本次發(fā)送指令的個數(shù)erial_len=6
  239.                                                 {
  240.                                        sure_flag=0;  //清除確定標志
  241.                                                                                                   //serial_and();//合并數(shù)組
  242.                                                                                     //              serial_len/=2;
  243.                                                 // uart_serial();//調(diào)用發(fā)送指令程序
  244.                                                                                     //              P0=serial_data[0];
  245.                                                                                                   P0=jisuan();
  246.                                                                                     //              P0=255;
  247.                                                                                                   }
  248.                                                                                       else
  249.                                                                                           {
  250.                                                                                           wcom(0xc0);
  251.                                for(ks_0=0;ks_0<10;ks_0++)
  252.                                  {
  253.                                   wdata(tab6[ks_0]);
  254.                                  }                           
  255.                                                                                                         for(ks_0=0;ks_0<10;ks_0++)
  256.                                            {
  257.                                  delay(250);
  258.                                            }
  259.                                                   }
  260.                                                                                       delay(1);
  261.                                                                                     }break;
  262.                default :
  263.                                                       break;
  264.                                               }
  265.                                           ks_0=0;
  266.                                 }
  267.          sure_flag=0;
  268.                             serial_len=0;
  269.                    chushi();        //初始化,等待下一次發(fā)送指令
  270.                             wcom(0xc0);  
  271.                    for(ks_1=0;ks_1<MAX_LEN;ks_1++)    //清空發(fā)送緩沖數(shù)組
  272.                        serial_data[ks_1]=0;
  273.        }
  274.    }
  275. // 求取輸入值轉(zhuǎn)換為十進制
  276. unchar jisuan(void)
  277. {
  278. unchar jieguo;
  279. if(serial_len==3)
  280. jieguo=serial_data[0]*100+serial_data[1]*10+serial_data[2];
  281. else if(serial_len==2)
  282. jieguo=serial_data[0]*10+serial_data[1];
  283. else if(serial_len==1)
  284. jieguo=serial_data[0];
  285. else ;
  286. ……………………

  287. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼

完整的Word格式文檔51黑下載地址:
直流伺服電機控制系統(tǒng)設(shè)計62701844.doc (605.31 KB, 下載次數(shù): 142)



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏6 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:579411 發(fā)表于 2019-12-14 18:59 | 只看該作者
我來學(xué)習(xí)下,剛好做這個題目
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表