單片機常用算法設計_第1頁
單片機常用算法設計_第2頁
單片機常用算法設計_第3頁
單片機常用算法設計_第4頁
單片機常用算法設計_第5頁
已閱讀5頁,還剩49頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第7章

單片機常用算法設計7.1單片機濾波算法的設計7.2信號處理的FFT變換7.3SPWM正弦逆變算法的設計7.4PID控制算法7.551單片機PID算法程序7.6模糊控制算法7.1單片機濾波算法的設計電路的濾波分為模擬濾波與數(shù)字濾波。其中數(shù)字濾波器具有精度高、高可靠性和高穩(wěn)定性的特點

,因此被廣泛應用。用數(shù)字濾波算法克服隨機誤差主要有如下優(yōu)點:數(shù)字濾波由軟件程序?qū)崿F(xiàn)

,不需要硬件

,因此不存在阻抗匹配的問題;對于多路信號輸入通道

,可以共用一個軟件“濾波器”,降低儀表的設計成本;只要改變?yōu)V波器程序或元算參數(shù)

,就能方便的改變?yōu)V波特性。下面我們介紹幾種主要的數(shù)字濾波法:A.限幅濾波法對于隨機干擾

,限幅濾波是一種有效的方法;基本方法:比較相鄰n和

n-1時刻的兩個采樣值y(n)和

y(n–1),根據(jù)經(jīng)驗確定兩次采樣允許的最大偏差。如果兩次采樣值的差值超過最大偏差范圍

,認為發(fā)生可隨機干擾

,并認為后一次采樣值y(n)為非法值

,應予刪除

,刪除y(n)后

,可用y(n–1)代替y(n);若未超過所允許的最大偏差范圍

,則認為本次采樣值有效。下面是限幅濾波程序:(A

值可根據(jù)實際情況調(diào)整,value為有效值

,new_value

為當前采樣值濾波程序返回有效的實際值

)#defineA10charvalue;charfilter(){

charnew_value;

new_value=get_ad();

if((new_value-value>A)||(value-new_value>A))returnvalue;

returnnew_value;}B.中位值濾波法中位值濾波法能有效克服偶然因素引起的波動或采樣不穩(wěn)定引起的誤碼等脈沖干擾;對溫度液位等緩慢變化的被測參數(shù)用此法能收到良好的濾波效果

,但是對于流量壓力等快速變化的參數(shù)一般不宜采用中位值濾波法;基本方法:對某一被測參數(shù)連續(xù)采樣

n次(一般

n取奇數(shù)),然后再把采樣值按大小排列

,取中間值為本次采樣值。#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.算術平均濾波法算術平均濾波法適用于對一般的具有隨機干擾的信號進行濾波。這種信號的特點是信號本身在某一數(shù)值范圍附近上下波動

,如測量流量、液位;基本方法:按輸入的N

個采樣數(shù)據(jù),尋找這樣一個

Y,使得

Y

與各個采樣值之間的偏差的平方和最小。編寫算術平均濾波法程序時嚴格注意:一.為了加快數(shù)據(jù)測量的速度

,可采用先測量數(shù)據(jù)

存放在存儲器中

,測完

N點后

,再對

N個數(shù)據(jù)進行平均值計算;二.選取適當?shù)臄?shù)據(jù)格式

,也就是說采用定點數(shù)還是采用浮點數(shù)。其程序如下所示:#defineN12charfilter(){int

sum=0,count;

for(count=0;count<N;count++)

{

sum+=get_ad();

delay();}return(char)(sum/N);}D.遞推平均濾波法基本方法:采用隊列作為測量數(shù)據(jù)存儲器

,設隊列的長度為

N,每進行一次測量

,把測量結果放于隊尾

,而扔掉原來隊首的一個數(shù)據(jù)

,這樣在隊列中始終就有

N個“最新”的數(shù)據(jù)。當計算平均值時

,只要把隊列中的

N

個數(shù)據(jù)進行算數(shù)平均

,就可得到新的算數(shù)平均值。這樣每進行一次測量

,就可得到一個新的算術平均值。#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.一階滯后濾波法優(yōu)點:對周期性干擾具有良好的抑制作用,適用于波動頻率較高的場合;缺點:相位滯后,靈敏度低.滯后程度取決于a值大小.不能消除濾波頻率高于采樣頻率的1/2的干擾信號。程序如下:#definea50charvalue;charfilter(){char

new_value;

new_value=get_ad();

return(100-a)*value+a*new_value;}7.2信號處理的FFT變換快速傅里葉變換(FastFourierTransfonn,F(xiàn)FT)

是為了減少離散傅里葉變換(DiscreteFourierTransform,DFT)計算次數(shù)的一種快速有效的算法。它是根據(jù)離散傅氏變換的奇、偶、虛、實等特性,對離散傅立葉變換的算法進行改進獲得的。FFT變換算法的基本思想:利用WN的周期性和對稱性,把一個N項序列(設N=2k,k為正整數(shù)),分為兩個N/2項的子序列,每個N/2點DFT變換需要(N/2)^2次運算,再用N次運算把兩個N/2點的DFT變換組合成一個N點的DFT變換。這樣變換以后,總的運算次數(shù)就變成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的整數(shù)次方數(shù)

#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的整數(shù)次方!\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(脈沖寬度調(diào)制),它是通過改變輸出方波的占空比來改變等效的輸出電壓,廣泛地用于電動機調(diào)速和閥門控制;SPWM是在PWM的基礎上改變了調(diào)制脈沖方式,脈沖寬度時間占空比按正弦規(guī)率排列,這樣輸出波形經(jīng)過適當?shù)臑V波可以做到正弦波輸出,它廣泛地用于直流交流逆變器等;SPWM理論基礎:沖量相等而形狀不同的窄脈沖加在具有慣性的環(huán)節(jié)上時,其效果基本相同。實現(xiàn)SPWM法的幾種方案:A.等面積法該方案是用同樣數(shù)量等幅而不等寬的矩形脈沖序列代替正弦波,然后計算各脈沖的寬度和間隔,并把這些數(shù)據(jù)存于微機中,通過查表的方式生成PWM信號控制開關器件的通斷,以達到預期的目的;優(yōu)點:可準確計算出各開關器件的通斷時刻,所得的波形很接近正弦波;缺點:計算繁瑣,數(shù)據(jù)占用內(nèi)存大,不能實時控制。用面積法實現(xiàn)SPWM正弦波逆變換的程序片段:voidCalcSpwmWithArea(float32a/*調(diào)制比*/,Uint16w_Hz/*調(diào)制頻率*/,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;//得到數(shù)據(jù)表頭指針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.硬件調(diào)制法方案原理:把所希望的波形作為調(diào)制信號,把接受調(diào)制的信號作為載波,通過對載波的調(diào)制得到所期望的PWM波形.用等腰三角波作為載波,當調(diào)制信號波為正弦波時,所得到的就是SPWM波形;優(yōu)點:實現(xiàn)方法簡單,可以解決等面積法計算繁瑣的缺點;缺點:模擬電路結構復雜,難以實現(xiàn)精確的控制。C.自然采樣法方案原理:以正弦波為調(diào)制波,等腰三角波為載波進行比較,在兩個波形的自然交點時刻控制開關器件的通斷;優(yōu)點:所得SPWM波形最接近正弦波;缺點:脈寬表達式是一個超越方程,計算繁瑣,難以實時控制。D.規(guī)則采樣法方案原理:用三角波對正弦波進行采樣得到階梯波,再以階梯波與三角波的交點時刻控制開關器件的通斷,從而實現(xiàn)SPWM法;按照三角波在其頂點或底點的位置不同又分為對稱規(guī)則采樣和非對稱規(guī)則采樣;優(yōu)點:計算簡單,便于在線實時運算,其中非對稱規(guī)則采樣法因階數(shù)多而更接近正弦;缺點:直流電壓利用率較低,線性控制范圍較小。用對稱規(guī)則采樣實現(xiàn)SPWM正弦波逆變換的程序片段:voidCalcSpwmWithSym(float32a/*調(diào)制比*/,float32w_Hz/*調(diào)制頻率*/,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;//得到數(shù)據(jù)表頭指針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++;}}用非對稱規(guī)則采樣實現(xiàn)SPWM正弦波逆變換的程序片段:voidCalcSpwmWithImSym(float32a/*調(diào)制比*/,Uint16w_Hz/*調(diào)制頻率*/,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;//得到數(shù)據(jù)表頭指針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.梯形波與三角波比較法方案原理:采用梯形波作為調(diào)制信號,三角波為載波,且使兩波幅值相等,以兩波的交點時刻控制開關器件的通斷實現(xiàn)PWM控制;優(yōu)點:可以有效地提高直流電壓利用率;缺點:輸出波形中含有5次,7次等低次諧波。7.4PID控制算法在過程控制中,按偏差的比例(P)、積分(I)和微分(D)進行控制的PID控制器(亦稱PID調(diào)節(jié)器)是應用最為廣泛的一種自動控制器;對于過程控制的典型對象──“一階滯后+純滯后”與“二階滯后+純滯后”的控制對象,PID控制器是一種最優(yōu)控制;PID調(diào)節(jié)規(guī)律是連續(xù)系統(tǒng)動態(tài)品質(zhì)校正的一種有效方法,它的參數(shù)整定方式簡便,結構改變靈活(PI、PD、…)。一模擬PID調(diào)節(jié)器模擬PID控制系統(tǒng)原理框圖比例環(huán)節(jié):即時成比例地反應控制系統(tǒng)的偏差信號e(t),偏差一旦產(chǎn)生,調(diào)節(jié)器立即產(chǎn)生控制作用以減小偏差;積分環(huán)節(jié):主要用于消除靜差,提高系統(tǒng)的無差度。積分時間常數(shù)TI越大,積分作用越弱,反之則越強;微分環(huán)節(jié):能反應偏差信號的變化趨勢(變化速率),并能在偏差信號的值變得太大之前,在系統(tǒng)中引入一個有效的早期修正信號,從而加快系統(tǒng)的動作速度,減小調(diào)節(jié)時間。PID調(diào)節(jié)器各校正環(huán)節(jié)的作用:PID調(diào)節(jié)器是一種線性調(diào)節(jié)器,它將給定值r(t)與實際輸出值c(t)的偏差的比例(P)、積分(I)、微分(D)通過線性組合構成控制量,對控制對象進行控制。PID調(diào)節(jié)器的微分方程【其中】PID調(diào)節(jié)器的傳遞函數(shù)二數(shù)字PID控制器模擬形式離散化形式模擬PID控制規(guī)律的離散化形式數(shù)字PID控制器的差分方程:式中:

,為比例項;,為積分項;

,為微分項。常用的控制方式:①

P控制

②PI控制

③PD控制

④PID控制

PID算法的兩種類型①位置型控制②增量型控制三PID算法的程序流程增量型PID算法的程序流程算式:式中:位置型PID算法的程序流程遞推形式:對控制量的限制①控制算法總是受到一定運算字長的限制;②執(zhí)行機構的實際位置不允許超過上/下極限。7.551單片機PID算法程序一位置式PID控制算法位置式PID控制算法的簡化示意圖上圖中傳遞函數(shù)為:在時域的傳遞函數(shù)表達式:對上式中的微分和積分進行近似:于是傳遞函數(shù)可以簡化為:其中:u(n)——第k個采樣時刻的控制;

KP——比例放大系數(shù);

Ki——積分放大系數(shù);Kd——微分放大系數(shù);①由于全量輸出,所以每次輸出均與過去狀態(tài)有關,計算時要對e(k)(k=0,1,…n)進行累加,工作量大;②因為計算機輸出的u(n)對應的是執(zhí)行機構的實際位置,如果計算機出現(xiàn)故障,輸出u(n)將大幅度變化,會引起執(zhí)行機構的大幅度變化,有可能因此造成嚴重的生產(chǎn)事故,這在實際生產(chǎn)中是不允許的。這種算法有以下缺點:程序片段如下:#include<reg52.h>

#include<string.h>typedefstructPID{

doubleSetPoint;//設定目標Desiredvalue

doubleProportion;//比例常數(shù)ProportionalConst

doubleIntegral;//積分常數(shù)IntegralConst

doubleDerivative;//微分常數(shù)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;//比例常數(shù)doubleIntegral;//積分常數(shù)doubleDerivative;//微分常數(shù)intLastError;//Error[-1]intPrevError;//Error[-2]}PID;staticPIDsPID;staticPID*sptr=&sPID;/*PID參數(shù)初始化*/voidIncPIDInit(void){sptr->SumError=0;sptr->LastError=0;//Error[-1]sptr->PrevError=0;//Error[-2]sptr->Proportion=0;//比例常數(shù)sptr->Integral=0;//積分常數(shù)sptr->Derivative=0;//微分常數(shù)sptr->SetPoint=0;}/*增量式PID計算部分*/intIncPIDCalc(intNextPoint){registerintiError,i

溫馨提示

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

評論

0/150

提交評論