基于單片機的閉環控制 附帶源程序_第1頁
基于單片機的閉環控制 附帶源程序_第2頁
基于單片機的閉環控制 附帶源程序_第3頁
基于單片機的閉環控制 附帶源程序_第4頁
基于單片機的閉環控制 附帶源程序_第5頁
已閱讀5頁,還剩15頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、電氣技術研究生課程設計報告題 目 基于51單片機的直流電機PID調速系統 學 院 機械與汽車工程學院 專業班級 車輛工程 學 號 221601852023 學生姓名 木飛 指導教師 完成日期 2017年01月12日 1 引言1.1研究對象介紹1.2選題的目的和意義直流電動機具有良好的起動、制動性能,宜于在大范圍內平滑調速,在許多需要調速或快速正反向的電力拖動領域中得到了廣泛的應用。從控制的角度來看,直流調速還是交流拖動系統的基礎。早期直流電動機的控制均以模擬電路為基礎,采用運算放大器、非線性集成電路以及少量的數字電路組成,控制系統的硬件部分非常復雜,功能單一,而且系統非常不靈活、調試困難,阻礙

2、了直流電動機控制技術的發展和應用范圍的推廣。2 設計原理、方法及概述2.1 設計原理及方法直流電動機根據勵磁方式不同,直流電動機分為自勵和他勵兩種類型。不同勵磁方式的直流電動機機械特性曲線有所不同。但是對于直流電動機的轉速有以下公式: n=U/Ccf-TR內/CrCcf 其中:U電壓;R內勵磁繞組本身的電阻;f每極磁通(Wb);Cc電勢常數;Cr轉矩常量。由上式可知,直流電機的速度控制既可采用電樞控制法,改變電樞回路電阻,也可采用磁場控制法。對于要求在一定范圍內無級平滑調速系統來說,以調節電樞供電電壓的方式為最好。改變電阻只能是有級調速;減弱磁通雖然能夠平滑調速,但是調速范

3、圍不大,往往只是配合調壓方案,在基速(額定轉速)以上做小范圍的減弱升速。因此,自動控制的直流調速往往以變壓調速為主。本文主要研究了利用MCS-51系列單片機,通過PWM方式控制直流電機調速的方法。PWM控制技術以其控制簡單、靈活和動態響應好的優點而成為電力電子技術最廣泛應用的控制方式,也是人們研究的熱點。由于當今科學技術的發展已經沒有了學科之間的界限,結合現代控制理論思想或實現無諧振軟開關技術將會成為PWM控制技術發展的主要方向之一。 2.2 設計總概述以直流電機電樞上電壓的占空比來改變平均電壓的大小,從而控制電動機的轉速為依據,實現對直流電動機的平滑調速,并通過單片機控制速度的變化

4、。本文所研究的直流電機調速系統主要是由硬件和軟件兩大部分組成。硬件部分是前提,是整個系統執行的基礎,它主要為軟件提供程序運行的平臺。而軟件部分,是對硬件端口所體現的信號,加以采集、分析、處理,最終實現控制器所要實現的各項功能,達到控制器自動對電機速度的有效控制。但是此設計中電機只需要正轉,所以相對來說簡單點。3硬件設計3.1 8051單片機簡介AT89C52是一個低電壓,高性能CMOS 8位單片機,片內含8k bytes的可反復擦寫的Flash只讀程序存儲器和256 bytes的隨機存取數據存儲器(RAM),器件采用ATMEL公司的高密度、非易失性存儲技術生產,兼容標準MCS-51指

5、令系統,片內置通用8位中央處理器和Flash存儲單元,AT89C52單片機在電子行業中有著廣泛的應用。AT89C52有40個引腳,32個外部雙向輸入/輸出(I/O)端口,同時內含2個外中斷口,3個16位可編程定時計數器,2個全雙工串行通信口,2 個讀寫口線,AT89C52可以按照常規方法進行編程,也可以在線編程。其將通用的微處理器和Flash存儲器結合在一起,特別是可反復擦寫的 Flash存儲器可有效地降低開發成本。部分功能如下:(1)8kB可反復擦寫(大于1000次)Flash ROM;(2)32個雙向I/O口;(3)256x8bit內部RAM;(4)3個16位可編程定時/計數器中斷;(5)

6、時鐘頻率0-24MHz;(6)2個串行中斷,可編程UART串行通道;(7)2個外部中斷源,共8個中斷源;(8)2個讀寫中斷口線,3級加密位;3.2直流電機設計中采用直流電機,自帶高精度的磁編碼器,性能介紹如圖一所示,接線說明如圖二所示: 性能介紹圖一 接線圖二3.3 L298N恒壓恒流橋式2A驅動芯片L298N,簡稱H橋。L298是SGS公司的產品,比較常見的是15腳Multiwatt封裝的L298N,內部同樣包含4通道邏輯驅動電路。可以方便的驅動兩個直流電機,或一個兩相步進電機。L298N芯片可以驅動兩個二相電機,也可以驅動一個四相電機,輸出電壓最高可達50V,可以直接通過電源來調節輸出電壓

7、;可以直接用單片機的IO口提供信號;而且電路簡單,使用比較方便。L298N可接受標準TTL邏輯電平信號VSS,VSS可接457 V電壓。4腳VS接電源電壓,VS電壓范圍VIH為2546 V。輸出電流可達25 A,可驅動電感性負載。1腳和15腳下管的發射極分別單獨引出以便接入電流采樣電阻,形成電流傳感信號。L298可驅動2個電動機,OUT1,OUT2和OUT3,OUT4之間可分別接電動機,本實驗裝置我們選用驅動一臺電動機。5,7,10,12腳接輸入控制電平,控制電機的正反轉。EnA,EnB接控制使能端,控制電機的停轉。L298芯片驅動電路圖如下:圖1 L298芯片驅動電路圖3.4 系統總體電路圖

8、中控制器模塊為系統的核心部件,電位器和顯示器是用來實現人機交換功能,其中通過鍵盤將需要設置的參數和狀態輸入到單片機中,并且通過控制器顯示到顯示器上。在運行過程中控制器產生PWM脈沖送到電機驅動電路中,經過放大后控制直流電機轉速,同時利用速度檢測模塊將當前轉速反饋到控制器中,控制器經過數字PID運算后改變PWM脈沖的占空比,實現電機轉速實時控制的目的。顯示模塊 電機驅動模塊控制器模塊電位器直流電機PWM脈沖速度檢測模塊圖1系統方案框圖4 軟件設計4.1 PID算法PI調節器是電力拖動自動控制中最常用的的一種,在微機數字控制系統中,當采樣頻率足夠高時,可以先按模擬系統的設計方法設計,然后再離散化,

9、得到數字控制器的算法。PI調節器的傳遞函數如4.1式所示: (4.1)若輸入誤差函數為e(t),輸出函數為u(t),則e(t) 和u(t)的關系時域表達式可寫成 : (4.2)式子中為比例系數, 為比例系數。將式4.2轉化為差分方程,得到數字PI調節器的表達式,其第k拍輸出為 : (4.3)式中 為采樣周期。增量式算法只需要當前的和上一拍的偏差即可計算出輸出值。增量式PI調節器算法為: (4.4) 在控制系統中,常需要對調節器的輸出實施限幅。在數字控制算法中,要對u限幅,只需要在程序中設置限幅值。不考慮限幅時,位置式和增量式兩種算法完全等同,考慮限幅時,則兩者略有差異。增量式PI調節器算法只需

10、要輸出限幅,而位置式算法必須同時設置積分限幅和輸出限幅。若沒有積分限幅,積分項可能很大,將產生較大的退飽和超調。 算法模塊如下 :int e=0,e1=0,e2=0;float uk=0,uk1=0.0,duk=0.0;/PID輸出值float kp=5,ki=1.5,kd=0.9;/PID控制系數 上面是初始化部分void PIDControl() /PID偏差計算 e=temp-num;/變量temp 是AD采集過來的值,num是通過M法測出點值duk=(kp*(e-e1)+ki*e+kd*(e-2e1+e2)uk=uk1+duk;out=(int)uk;if(out>250)out

11、=100;else if(out<0)out=0;uk1=uk;e2=e1;e1=e; value=out; /value最后送給PWM。這部分是子程序4.2 M法測速 在一定時間Tc內測取旋轉編碼器輸出脈沖個數M1,用以計算這段時間內的轉速,稱作M法測速。把M1除以Tc就可以得到旋轉編碼器輸出脈沖的頻率f1=M1/Tc,所以又稱頻率法。電機每轉一圈共產生Z個脈沖(Z=倍頻系數*編碼器光柵數),把f1除以Z就得到在單位時間內電機的轉速。在習慣上,時間Tc以s為單位,而轉速是以r/min為單位,則電動機的轉速為:n=60M1/ZTc (4.5) 由于Z和Tc都是常數,因此轉速n與計數值M1

12、成正比,故此測速方法稱M法測速。具體程序部分用外部中斷計數和定時器來完成,程序如下:void exter0() interrupt 0 /外部中斷脈沖計數 /M法測速度(外部中斷0和定時器0用在M法測速上)Inlpuse+;void timer0() interrupt 1 TH0 = 0x3c;/重裝初值 TL0 = 0xb0; time+;if(time>=20) /1s鐘讀取一次轉速 (2*60ms) EX0 = 0;TR0 = 0;num=Inlpuse; /計算轉速 Inlpuse=0;PIDControl();/ 100ms 控制一次 Inlpuse=0; EX0 = 1;T

13、R0 = 1; 4.3 參數設定在程序中修改PID調節算法中的比例系列、積分系數和微分系數可以得到不同特性的轉速曲線。參數改變,轉速響應的超調量和調整時間發生變化。系統的穩定性和快速性是一對矛盾,因此我們必須選擇一個合適的PI參數。 在調試過程中,當令kp =5、ki =1.5、kd=0.9時系統的快速性和穩定性達到最佳狀態。4.4 電位器的AD采集模塊 AD 采集模塊利用是我是直接調用了開發板里面的程序,這個模塊可以也可以自己制作。我用的 XPT2046是一款4線制電阻式觸摸屏控制器,內含12位分辨率125KHz轉換速率逐步逼近型A/D轉換器。此芯片支持從1.5V到5.2V的低電壓I/O接口

14、。XPT2046能通過執行兩次A/D轉換查出被按屏幕位置,除此之外,還可以測量加在觸摸屏上的壓力。主要特性如下:(1) 工作電壓范圍為1.5V到5.25V(2) 支持1.5V-5.25V的數字I/O口(3) 內建2.5V參考電壓(4) 內建結溫測量功能(5) 觸摸壓力測量,具有自動省電功能(6) 采用3線制SPI通信接口程序見最后的程序清單。5 課題總結從課題選定開始,先是看了一遍課本以及網上找了對應的論文,然后看了老師發的試驗資料以及各個元器件的原理和用法,最后把硬件焊接起來,然后想如何測測速,如何給定,如何用PID進行控制,最后如何通過PID去控制PWM的占空比。在調試的過程中遇到一個很簡

15、單和致命的問題,就是我用的開發板和L298N開始的時候沒有共接地導致調速一直失敗,最后通過用示波器觀測PWM輸出的波形發現了問題,當真正的實現調速的時候感覺很好,終于通過自己的努力完成了一項有點技術含量的事情。繼續加油。全部程序如下:對于程序,每個讀者的I/0口或者用的ad采集方式不一樣,程序可能不同,但是解決閉環問題的核心是讀取給定值用AD轉換,讀取測速值用外部中斷和定時器中段,PWM輸出也用一個定時器。#include"reg51.h"#include"XPT2046.h"/-定義使用的IO-/#define GPIO_DIG P0sbit PWM=

16、P10;int e=0,e1=0,e2=0;/PID偏 float uk=0,uk1=0.0,duk=0.0;/PID輸出值float kp=5,ki=1.5,kd=0.9;/PID控制系數 int out=0;sbit IN2=P11;/-定義一個全局變量-/ unsigned int value,timer1;uint num;uint Inlpuse=0,num=0;/脈沖計數單元uint temp,count,temp1;unsigned int time=0;sbit zhongduan=P32;sbit LSA=P22;sbit LSB=P23;sbit LSC=P24;/-定義全

17、局變量-/unsigned char code DIG_CODE17=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;/0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的顯示碼uchar DisplayData8;/用來存放要顯示的8位數的值void DigDisplay(void); void PIDControl() /PID偏差計算 e=temp-num;duk=(kp*(e-e1)+ki*e+kd*(e-2e1+e2)uk=uk1+duk;out=(int)uk

18、;if(out>250)out=100;else if(out<0) out=0;uk1=uk;e2=e1;e1=e; value=out; void SetSpeed(void)temp1= Read_AD_Data(0x94);/ AIN0 電位器(100us 采集一次temp=2*temp1>>5;/temp的變化范圍在0-250之間 void DigDisplay(void)unsigned char i;unsigned int j; DisplayData7=DIG_CODEnum%10000/1000; DisplayData6=DIG_CODEnum%1

19、000/100; DisplayData5=DIG_CODEnum%100/10; DisplayData4=DIG_CODEnum%10/1; DisplayData3=DIG_CODEtemp%10000/1000; DisplayData2=DIG_CODEtemp%1000/100; DisplayData1=DIG_CODEtemp%100/10; DisplayData0=DIG_CODEtemp%10/1;for(i=0;i<8;i+)switch(i) /位選,選擇點亮的數碼管,case(0):LSA=0;LSB=0;LSC=0; break;/顯示第0位case(1):

20、LSA=1;LSB=0;LSC=0; break;/顯示第1位case(2):LSA=0;LSB=1;LSC=0; break;/顯示第2位case(3):LSA=1;LSB=1;LSC=0; break;/顯示第3位case(4):LSA=0;LSB=0;LSC=1; break;/顯示第4位case(5):LSA=1;LSB=0;LSC=1; break;/顯示第5位case(6):LSA=0;LSB=1;LSC=1; break;/顯示第6位case(7):LSA=1;LSB=1;LSC=1; break;/顯示第7位GPIO_DIG=DisplayDatai;/發送段碼j=50; /掃

21、描間隔時間設定while(j-);GPIO_DIG=0x00;/消隱void exter0() interrupt 0 /外部中斷脈沖計數 /M法測速度(外部中斷0和定時器0用在M法測速上)Inlpuse+;void timer0() interrupt 1 TH0 = 0x3c;/重裝初值TL0 = 0xb0; time+;if(time>=20) /1s鐘讀取一次轉速 (2*60ms) EX0 = 0;TR0 = 0;num=Inlpuse; /計算轉速 Inlpuse=0;PIDControl();/ 100ms 控制一次 Inlpuse=0; EX0 = 1;TR0 = 1; v

22、oid T1_time() interrupt 3count1+;if(count1 >= 100) count1 = 0; /計時100us*100=10ms=100Hzif(count1 < value) pwm = 1;/占空比else pwm = 0;void SystemInit() TMOD = 0x21; /設定時器0為工作方式1,定時器1為工作方式2(自動重裝初值)TH0 = 0x3c;/設定50ms一次中斷TL0 = 0xb0; TH1 = 0x9c;/設定100us一次中斷TL1 = 0x9c; EA = 1;/開總中斷 ET0 = 1;/開定時器0中斷 ET1

23、 = 1;/開定時器1中斷EX0 = 1;/開外部中斷0IT0 = 1;/啟動下降沿觸發有效 TR1 = 1;/啟動定時器1 TR0 = 1;/啟動定時器0 void main() SystemInit();while(1) DigDisplay(); AD采集模塊:(這一部分程序只是AD采集模塊,用的芯片是XPT2046,用spi通信方式,最后改變電位器可以改變temp的值,這部分程序讀者可以自己解決,)#ifndef _XPT2046_H_#define _XPT2046_H_/-包含頭文件-/#include<reg51.h>#include<intrins.h>/-重定義關鍵詞-/#ifndef uchar#define uchar unsigned char#endif#ifndef uint#define uint unsigned int#endif#ifndef ulong#define ulong unsigned long#endif/-定義使用的IO口-/sbit DOUT = P37; /輸出sbit CLK = P36; /時鐘sbit DIN = P34; /輸入sbit CS = P35; /片選uint Read_AD_Data(uchar cmd);uint SPI_Read(void);void SPI_W

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論