




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第7章
單片機常用算法設計7.1單片機濾波算法的設計7.2信號處理的FFT變換7.3SPWM正弦逆變算法的設計7.4PID控制算法7.551單片機PID算法程序7.6模糊控制算法7.1單片機濾波算法的設計電路的濾波分為模擬濾波與數字濾波。其中數字濾波器具有精度高、高可靠性和高穩定性的特點
,因此被廣泛應用。用數字濾波算法克服隨機誤差主要有如下優點:數字濾波由軟件程序實現
,不需要硬件
,因此不存在阻抗匹配的問題;對于多路信號輸入通道
,可以共用一個軟件“濾波器”,降低儀表的設計成本;只要改變濾波器程序或元算參數
,就能方便的改變濾波特性。下面我們介紹幾種主要的數字濾波法:A.限幅濾波法對于隨機干擾
,限幅濾波是一種有效的方法;基本方法:比較相鄰n和
n-1時刻的兩個采樣值y(n)和
y(n–1),根據經驗確定兩次采樣允許的最大偏差。如果兩次采樣值的差值超過最大偏差范圍
,認為發生可隨機干擾
,并認為后一次采樣值y(n)為非法值
,應予刪除
,刪除y(n)后
,可用y(n–1)代替y(n);若未超過所允許的最大偏差范圍
,則認為本次采樣值有效。下面是限幅濾波程序:(A
值可根據實際情況調整,value為有效值
,new_value
為當前采樣值濾波程序返回有效的實際值
)#defineA10charvalue;charfilter(){
charnew_value;
new_value=get_ad();
if((new_value-value>A)||(value-new_value>A))returnvalue;
returnnew_value;}B.中位值濾波法中位值濾波法能有效克服偶然因素引起的波動或采樣不穩定引起的誤碼等脈沖干擾;對溫度液位等緩慢變化的被測參數用此法能收到良好的濾波效果
,但是對于流量壓力等快速變化的參數一般不宜采用中位值濾波法;基本方法:對某一被測參數連續采樣
n次(一般
n取奇數),然后再把采樣值按大小排列
,取中間值為本次采樣值。#defineN
11charfilter(){
charvalue_buf[N],count,i,j,temp;
for(count=0;count<N;count++)
{
value_buf[count]=get_ad();
delay();
}
for(j=0;j<N-1;j++)
{
for(i=0;i<N-j;i++)
{
if(value_buf[i]>value_buf[i+1])
{temp=value_buf[i];value_buf[i]=value_buf[i+1];value_buf[i+1]=temp;
}
}
}
returnvalue_buf[(N-1)/2];}
下面是中位值濾波程序:C.算術平均濾波法算術平均濾波法適用于對一般的具有隨機干擾的信號進行濾波。這種信號的特點是信號本身在某一數值范圍附近上下波動
,如測量流量、液位;基本方法:按輸入的N
個采樣數據,尋找這樣一個
Y,使得
Y
與各個采樣值之間的偏差的平方和最小。編寫算術平均濾波法程序時嚴格注意:一.為了加快數據測量的速度
,可采用先測量數據
存放在存儲器中
,測完
N點后
,再對
N個數據進行平均值計算;二.選取適當的數據格式
,也就是說采用定點數還是采用浮點數。其程序如下所示:#defineN12charfilter(){int
sum=0,count;
for(count=0;count<N;count++)
{
sum+=get_ad();
delay();}return(char)(sum/N);}D.遞推平均濾波法基本方法:采用隊列作為測量數據存儲器
,設隊列的長度為
N,每進行一次測量
,把測量結果放于隊尾
,而扔掉原來隊首的一個數據
,這樣在隊列中始終就有
N個“最新”的數據。當計算平均值時
,只要把隊列中的
N
個數據進行算數平均
,就可得到新的算數平均值。這樣每進行一次測量
,就可得到一個新的算術平均值。#defineN12charvalue_buf[N],i=0;charfilter(){charcount;int
sum=0;
value_buf[i++]=get_ad();
if(i==N)
i=0;
for(count=0;count<N;count++)sum=value_buf[count];
return(char)(sum/N);}程序如下:E.一階滯后濾波法優點:對周期性干擾具有良好的抑制作用,適用于波動頻率較高的場合;缺點:相位滯后,靈敏度低.滯后程度取決于a值大小.不能消除濾波頻率高于采樣頻率的1/2的干擾信號。程序如下:#definea50charvalue;charfilter(){char
new_value;
new_value=get_ad();
return(100-a)*value+a*new_value;}7.2信號處理的FFT變換快速傅里葉變換(FastFourierTransfonn,FFT)
是為了減少離散傅里葉變換(DiscreteFourierTransform,DFT)計算次數的一種快速有效的算法。它是根據離散傅氏變換的奇、偶、虛、實等特性,對離散傅立葉變換的算法進行改進獲得的。FFT變換算法的基本思想:利用WN的周期性和對稱性,把一個N項序列(設N=2k,k為正整數),分為兩個N/2項的子序列,每個N/2點DFT變換需要(N/2)^2次運算,再用N次運算把兩個N/2點的DFT變換組合成一個N點的DFT變換。這樣變換以后,總的運算次數就變成N+2(N/2)2=N+N^2/2。其程序片段如下所示:#include<stdio.h>
#include<stdlib.h>
#include<math.h>typedefstruct{
doubler;
doublei;
}my_complex;//檢查a是否為2的整數次方數
#defineNOT2POW(a)(((a)-1)&(a)||(a)<=0)
#defineMYPI3.14159265358979323846//pimy_complex*fft(constmy_complex*x,unsignedintlen){
unsignedintex=0,t=len;
unsignedinti,j,k;
my_complex*y;
doubletr,ti,rr,ri,yr,yi;if(NOT2POW(len))returnNULL;
//如果失敗,返回空指針
for(;!(t&1);t>>=1)ex++;
//len應該等于2的ex次方
y=(my_complex*)malloc(len*sizeof(my_complex));
if(!y)returnNULL;//變址計算,庫里-圖基算法
for(i=0;i<len;i++){k=i;j=0;=ex;
while((t--)>0){j<<=1;j|=k&1;k>>=1;}
if(j>=i){y[i]=x[j];y[j]=x[i];}
}//用變址后的y向量進行計算
for(i=0;i<ex;i++){t=1<<i;
for(j=0;j<len;j+=t<<1){for(k=0;k<t;k++){ti=-MYPI*k/t;rr=cos(ti);ri=sin(ti);
tr=y[j+k+t].r;ti=y[j+k+t].i;
yr=rr*tr-ri*ti;yi=rr*ti+ri*tr;
tr=y[j+k].r;ti=y[j+k].i;y[j+k].r=tr+yr;y[j+k].i=ti+yi;y[j+k+t].r=tr-yr;y[j+k+t].i=ti-yi;}}}
returny;}
//以下為測試
intmain()
{inti,DATA_LEN;
my_complex*x,*y;
printf("基二FFT測試\n輸入生成序列長度:");
scanf("%d",&DATA_LEN);
x=(my_complex*)malloc(DATA_LEN*sizeof(my_complex));
for(i=0;i<DATA_LEN;i++){x[i].r=i;x[i].i=i-1;}
printf("處理前...\n實部\t\t虛部\n");for(i=0;i<DATA_LEN;i++)
printf("%lf\t%lf\n",x[i].r,x[i].i);y=fft(x,DATA_LEN);
if(!y){printf("序列長度不為2的整數次方!\n");
return0;}printf("處理后...\n實部\t\t虛部\n");
for(i=0;i<DATA_LEN;i++)printf("%lf\t%lf\n",y[i].r,y[i].i);
free(y);free(x);return0;
}7.3SPWM正弦逆變算法的設計PWM的全稱是PulseWidthModulation(脈沖寬度調制),它是通過改變輸出方波的占空比來改變等效的輸出電壓,廣泛地用于電動機調速和閥門控制;SPWM是在PWM的基礎上改變了調制脈沖方式,脈沖寬度時間占空比按正弦規率排列,這樣輸出波形經過適當的濾波可以做到正弦波輸出,它廣泛地用于直流交流逆變器等;SPWM理論基礎:沖量相等而形狀不同的窄脈沖加在具有慣性的環節上時,其效果基本相同。實現SPWM法的幾種方案:A.等面積法該方案是用同樣數量等幅而不等寬的矩形脈沖序列代替正弦波,然后計算各脈沖的寬度和間隔,并把這些數據存于微機中,通過查表的方式生成PWM信號控制開關器件的通斷,以達到預期的目的;優點:可準確計算出各開關器件的通斷時刻,所得的波形很接近正弦波;缺點:計算繁瑣,數據占用內存大,不能實時控制。用面積法實現SPWM正弦波逆變換的程序片段:voidCalcSpwmWithArea(float32a/*調制比*/,Uint16w_Hz/*調制頻率*/,Uint32z_Hz/*載波頻率*/){//Uint16tmp_PR;//T1周期值
volatileUint16i,n,*p;float32m,n1,n2;m=z_Hz/w_Hz;//求出載波比g_SPWM_Table.SpwmSize=(Uint16)m;//tmp_PR=g_T1_Clk/(2*z_Hz);//計算出其周期值p=g_SPWM_Table.p_HeadTable;//得到數據表頭指針n=m;m/=2;//除去一半計算半波
n1=(float32)g_T1_Clk/(8.0*m*w_Hz);//計算首相n2=(float32)g_T2_Clk/(8.0*PI*w_Hz)*a;for(i=0;i<n;i++){*p=n1-n2*(cos(i*PI/m)-cos((i+1)*PI/m));p++;}}B.硬件調制法方案原理:把所希望的波形作為調制信號,把接受調制的信號作為載波,通過對載波的調制得到所期望的PWM波形.用等腰三角波作為載波,當調制信號波為正弦波時,所得到的就是SPWM波形;優點:實現方法簡單,可以解決等面積法計算繁瑣的缺點;缺點:模擬電路結構復雜,難以實現精確的控制。C.自然采樣法方案原理:以正弦波為調制波,等腰三角波為載波進行比較,在兩個波形的自然交點時刻控制開關器件的通斷;優點:所得SPWM波形最接近正弦波;缺點:脈寬表達式是一個超越方程,計算繁瑣,難以實時控制。D.規則采樣法方案原理:用三角波對正弦波進行采樣得到階梯波,再以階梯波與三角波的交點時刻控制開關器件的通斷,從而實現SPWM法;按照三角波在其頂點或底點的位置不同又分為對稱規則采樣和非對稱規則采樣;優點:計算簡單,便于在線實時運算,其中非對稱規則采樣法因階數多而更接近正弦;缺點:直流電壓利用率較低,線性控制范圍較小。用對稱規則采樣實現SPWM正弦波逆變換的程序片段:voidCalcSpwmWithSym(float32a/*調制比*/,float32w_Hz/*調制頻率*/,float32z_Hz/*載波頻率*/){Uint16tmp_PR;//T1周期值
volatileUint16i,n,*p;float32m;m=z_Hz/w_Hz;//求出載波比g_SPWM_Table.SpwmSize=(Uint16)m;tmp_PR=g_T1_Clk/(2*z_Hz);//計算出其周期值p=g_SPWM_Table.p_HeadTable;//得到數據表頭指針for(i=0;i<(Uint16)m;i++){n=tmp_PR*(0.5-0.5*a*sin((i+0.75)*2*PI/m));*p=n;p++;}}用非對稱規則采樣實現SPWM正弦波逆變換的程序片段:voidCalcSpwmWithImSym(float32a/*調制比*/,Uint16w_Hz/*調制頻率*/,Uint32z_Hz/*載波頻率*/){Uint16tmp_PR;//T1周期值
volatileUint16i,n,*p;float32m;m=z_Hz/w_Hz;//求出載波比g_SPWM_Table.SpwmSize=(Uint16)m;tmp_PR=g_T1_Clk/(2*z_Hz);//計算出其周期值p=g_SPWM_Table.p_HeadTable;//得到數據表頭指針for(i=0;i<(Uint16)m;i++){n=tmp_PR*(0.5-0.25*a*(sin((i+0.25)*2*PI/m)+sin((i+0.75)*2*PI/m)));*p=n;p++;}}E.梯形波與三角波比較法方案原理:采用梯形波作為調制信號,三角波為載波,且使兩波幅值相等,以兩波的交點時刻控制開關器件的通斷實現PWM控制;優點:可以有效地提高直流電壓利用率;缺點:輸出波形中含有5次,7次等低次諧波。7.4PID控制算法在過程控制中,按偏差的比例(P)、積分(I)和微分(D)進行控制的PID控制器(亦稱PID調節器)是應用最為廣泛的一種自動控制器;對于過程控制的典型對象──“一階滯后+純滯后”與“二階滯后+純滯后”的控制對象,PID控制器是一種最優控制;PID調節規律是連續系統動態品質校正的一種有效方法,它的參數整定方式簡便,結構改變靈活(PI、PD、…)。一模擬PID調節器模擬PID控制系統原理框圖比例環節:即時成比例地反應控制系統的偏差信號e(t),偏差一旦產生,調節器立即產生控制作用以減小偏差;積分環節:主要用于消除靜差,提高系統的無差度。積分時間常數TI越大,積分作用越弱,反之則越強;微分環節:能反應偏差信號的變化趨勢(變化速率),并能在偏差信號的值變得太大之前,在系統中引入一個有效的早期修正信號,從而加快系統的動作速度,減小調節時間。PID調節器各校正環節的作用:PID調節器是一種線性調節器,它將給定值r(t)與實際輸出值c(t)的偏差的比例(P)、積分(I)、微分(D)通過線性組合構成控制量,對控制對象進行控制。PID調節器的微分方程【其中】PID調節器的傳遞函數二數字PID控制器模擬形式離散化形式模擬PID控制規律的離散化形式數字PID控制器的差分方程:式中:
,為比例項;,為積分項;
,為微分項。常用的控制方式:①
P控制
②PI控制
③PD控制
④PID控制
PID算法的兩種類型①位置型控制②增量型控制三PID算法的程序流程增量型PID算法的程序流程算式:式中:位置型PID算法的程序流程遞推形式:對控制量的限制①控制算法總是受到一定運算字長的限制;②執行機構的實際位置不允許超過上/下極限。7.551單片機PID算法程序一位置式PID控制算法位置式PID控制算法的簡化示意圖上圖中傳遞函數為:在時域的傳遞函數表達式:對上式中的微分和積分進行近似:于是傳遞函數可以簡化為:其中:u(n)——第k個采樣時刻的控制;
KP——比例放大系數;
Ki——積分放大系數;Kd——微分放大系數;①由于全量輸出,所以每次輸出均與過去狀態有關,計算時要對e(k)(k=0,1,…n)進行累加,工作量大;②因為計算機輸出的u(n)對應的是執行機構的實際位置,如果計算機出現故障,輸出u(n)將大幅度變化,會引起執行機構的大幅度變化,有可能因此造成嚴重的生產事故,這在實際生產中是不允許的。這種算法有以下缺點:程序片段如下:#include<reg52.h>
#include<string.h>typedefstructPID{
doubleSetPoint;//設定目標Desiredvalue
doubleProportion;//比例常數ProportionalConst
doubleIntegral;//積分常數IntegralConst
doubleDerivative;//微分常數DerivativeConst
doubleLastError;//Error[-1]
doublePrevError;//Error[-2]
doubleSumError;//SumsofErrors
}PID;PID計算部分:doublePIDCalc(PID*pp,doubleNextPoint)
{
doubledError,Error;
Error=pp->SetPoint-NextPoint;//偏差
pp->SumError+=Error;//積分
dError=Error-pp->LastError;//當前微分
pp->PrevError=pp->LastError;
pp->LastError=Error;
return(pp->Proportion*Error//比例項
+pp->Integral*pp->SumError//積分項
+pp->Derivative*dError);}//微分項
voidPIDInit(PID*pp)
{memset(pp,0,sizeof(PID));
}doublesensor(void)
{
return100.0;}
voidactuator(doublerDelta)
{}
voidmain(void)
{
PIDsPID;
doublerOut;
doublerIn;
PIDInit(&sPID);
sPID.Proportion=0.5;
sPID.Derivative=0.0;
sPID.SetPoint=100.0;for(;;){
rIn=sensor();
rOut=PIDCalc(&sPID,rIn);
actuator(rOut);
}}主程序:二增量式PID控制算法增量式PID控制算法公式為:其中:程序如下:typedefstructPID{intSetPoint;//設定目標longSumError;//誤差累計
doubleProportion;//比例常數doubleIntegral;//積分常數doubleDerivative;//微分常數intLastError;//Error[-1]intPrevError;//Error[-2]}PID;staticPIDsPID;staticPID*sptr=&sPID;/*PID參數初始化*/voidIncPIDInit(void){sptr->SumError=0;sptr->LastError=0;//Error[-1]sptr->PrevError=0;//Error[-2]sptr->Proportion=0;//比例常數sptr->Integral=0;//積分常數sptr->Derivative=0;//微分常數sptr->SetPoint=0;}/*增量式PID計算部分*/intIncPIDCalc(intNextPoint){registerintiError,i
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論