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

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第7章

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

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

,不需要硬件

,因此不存在阻抗匹配的問題;對(duì)于多路信號(hào)輸入通道

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

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

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

n-1時(shí)刻的兩個(gè)采樣值y(n)和

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

,認(rèn)為發(fā)生可隨機(jī)干擾

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

,應(yīng)予刪除

,刪除y(n)后

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

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

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

,new_value

為當(dāng)前采樣值濾波程序返回有效的實(shí)際值

)#defineA10charvalue;charfilter(){

charnew_value;

new_value=get_ad();

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

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

,但是對(duì)于流量壓力等快速變化的參數(shù)一般不宜采用中位值濾波法;基本方法:對(duì)某一被測(cè)參數(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ù)平均濾波法算術(shù)平均濾波法適用于對(duì)一般的具有隨機(jī)干擾的信號(hào)進(jìn)行濾波。這種信號(hào)的特點(diǎn)是信號(hào)本身在某一數(shù)值范圍附近上下波動(dòng)

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

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

Y,使得

Y

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

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

存放在存儲(chǔ)器中

,測(cè)完

N點(diǎn)后

,再對(duì)

N個(gè)數(shù)據(jù)進(jìn)行平均值計(jì)算;二.選取適當(dāng)?shù)臄?shù)據(jù)格式

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

sum=0,count;

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

{

sum+=get_ad();

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

,設(shè)隊(duì)列的長度為

N,每進(jìn)行一次測(cè)量

,把測(cè)量結(jié)果放于隊(duì)尾

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

,這樣在隊(duì)列中始終就有

N個(gè)“最新”的數(shù)據(jù)。當(dāng)計(jì)算平均值時(shí)

,只要把隊(duì)列中的

N

個(gè)數(shù)據(jù)進(jìn)行算數(shù)平均

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

,就可得到一個(gè)新的算術(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)點(diǎn):對(duì)周期性干擾具有良好的抑制作用,適用于波動(dòng)頻率較高的場(chǎng)合;缺點(diǎn):相位滯后,靈敏度低.滯后程度取決于a值大小.不能消除濾波頻率高于采樣頻率的1/2的干擾信號(hào)。程序如下:#definea50charvalue;charfilter(){char

new_value;

new_value=get_ad();

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

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

y=(my_complex*)malloc(len*sizeof(my_complex));

if(!y)returnNULL;//變址計(jì)算,庫里-圖基算法

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向量進(jìn)行計(jì)算

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;}

//以下為測(cè)試

intmain()

{inti,DATA_LEN;

my_complex*x,*y;

printf("基二FFT測(cè)試\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實(shí)部\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實(shí)部\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正弦逆變算法的設(shè)計(jì)PWM的全稱是PulseWidthModulation(脈沖寬度調(diào)制),它是通過改變輸出方波的占空比來改變等效的輸出電壓,廣泛地用于電動(dòng)機(jī)調(diào)速和閥門控制;SPWM是在PWM的基礎(chǔ)上改變了調(diào)制脈沖方式,脈沖寬度時(shí)間占空比按正弦規(guī)率排列,這樣輸出波形經(jīng)過適當(dāng)?shù)臑V波可以做到正弦波輸出,它廣泛地用于直流交流逆變器等;SPWM理論基礎(chǔ):沖量相等而形狀不同的窄脈沖加在具有慣性的環(huán)節(jié)上時(shí),其效果基本相同。實(shí)現(xiàn)SPWM法的幾種方案:A.等面積法該方案是用同樣數(shù)量等幅而不等寬的矩形脈沖序列代替正弦波,然后計(jì)算各脈沖的寬度和間隔,并把這些數(shù)據(jù)存于微機(jī)中,通過查表的方式生成PWM信號(hào)控制開關(guān)器件的通斷,以達(dá)到預(yù)期的目的;優(yōu)點(diǎn):可準(zhǔn)確計(jì)算出各開關(guān)器件的通斷時(shí)刻,所得的波形很接近正弦波;缺點(diǎn):計(jì)算繁瑣,數(shù)據(jù)占用內(nèi)存大,不能實(shí)時(shí)控制。用面積法實(shí)現(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);//計(jì)算出其周期值p=g_SPWM_Table.p_HeadTable;//得到數(shù)據(jù)表頭指針n=m;m/=2;//除去一半計(jì)算半波

n1=(float32)g_T1_Clk/(8.0*m*w_Hz);//計(jì)算首相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)制信號(hào),把接受調(diào)制的信號(hào)作為載波,通過對(duì)載波的調(diào)制得到所期望的PWM波形.用等腰三角波作為載波,當(dāng)調(diào)制信號(hào)波為正弦波時(shí),所得到的就是SPWM波形;優(yōu)點(diǎn):實(shí)現(xiàn)方法簡單,可以解決等面積法計(jì)算繁瑣的缺點(diǎn);缺點(diǎn):模擬電路結(jié)構(gòu)復(fù)雜,難以實(shí)現(xiàn)精確的控制。C.自然采樣法方案原理:以正弦波為調(diào)制波,等腰三角波為載波進(jìn)行比較,在兩個(gè)波形的自然交點(diǎn)時(shí)刻控制開關(guān)器件的通斷;優(yōu)點(diǎn):所得SPWM波形最接近正弦波;缺點(diǎn):脈寬表達(dá)式是一個(gè)超越方程,計(jì)算繁瑣,難以實(shí)時(shí)控制。D.規(guī)則采樣法方案原理:用三角波對(duì)正弦波進(jìn)行采樣得到階梯波,再以階梯波與三角波的交點(diǎn)時(shí)刻控制開關(guān)器件的通斷,從而實(shí)現(xiàn)SPWM法;按照三角波在其頂點(diǎn)或底點(diǎn)的位置不同又分為對(duì)稱規(guī)則采樣和非對(duì)稱規(guī)則采樣;優(yōu)點(diǎn):計(jì)算簡單,便于在線實(shí)時(shí)運(yùn)算,其中非對(duì)稱規(guī)則采樣法因階數(shù)多而更接近正弦;缺點(diǎn):直流電壓利用率較低,線性控制范圍較小。用對(duì)稱規(guī)則采樣實(shí)現(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);//計(jì)算出其周期值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++;}}用非對(duì)稱規(guī)則采樣實(shí)現(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);//計(jì)算出其周期值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)制信號(hào),三角波為載波,且使兩波幅值相等,以兩波的交點(diǎn)時(shí)刻控制開關(guān)器件的通斷實(shí)現(xiàn)PWM控制;優(yōu)點(diǎn):可以有效地提高直流電壓利用率;缺點(diǎn):輸出波形中含有5次,7次等低次諧波。7.4PID控制算法在過程控制中,按偏差的比例(P)、積分(I)和微分(D)進(jìn)行控制的PID控制器(亦稱PID調(diào)節(jié)器)是應(yīng)用最為廣泛的一種自動(dòng)控制器;對(duì)于過程控制的典型對(duì)象──“一階滯后+純滯后”與“二階滯后+純滯后”的控制對(duì)象,PID控制器是一種最優(yōu)控制;PID調(diào)節(jié)規(guī)律是連續(xù)系統(tǒng)動(dòng)態(tài)品質(zhì)校正的一種有效方法,它的參數(shù)整定方式簡便,結(jié)構(gòu)改變靈活(PI、PD、…)。一模擬PID調(diào)節(jié)器模擬PID控制系統(tǒng)原理框圖比例環(huán)節(jié):即時(shí)成比例地反應(yīng)控制系統(tǒng)的偏差信號(hào)e(t),偏差一旦產(chǎn)生,調(diào)節(jié)器立即產(chǎn)生控制作用以減小偏差;積分環(huán)節(jié):主要用于消除靜差,提高系統(tǒng)的無差度。積分時(shí)間常數(shù)TI越大,積分作用越弱,反之則越強(qiáng);微分環(huán)節(jié):能反應(yīng)偏差信號(hào)的變化趨勢(shì)(變化速率),并能在偏差信號(hào)的值變得太大之前,在系統(tǒng)中引入一個(gè)有效的早期修正信號(hào),從而加快系統(tǒng)的動(dòng)作速度,減小調(diào)節(jié)時(shí)間。PID調(diào)節(jié)器各校正環(huán)節(jié)的作用:PID調(diào)節(jié)器是一種線性調(diào)節(jié)器,它將給定值r(t)與實(shí)際輸出值c(t)的偏差的比例(P)、積分(I)、微分(D)通過線性組合構(gòu)成控制量,對(duì)控制對(duì)象進(jìn)行控制。PID調(diào)節(jié)器的微分方程【其中】PID調(diào)節(jié)器的傳遞函數(shù)二數(shù)字PID控制器模擬形式離散化形式模擬PID控制規(guī)律的離散化形式數(shù)字PID控制器的差分方程:式中:

,為比例項(xiàng);,為積分項(xiàng);

,為微分項(xiàng)。常用的控制方式:①

P控制

②PI控制

③PD控制

④PID控制

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

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

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

#include<string.h>typedefstructPID{

doubleSetPoint;//設(shè)定目標(biāo)Desiredvalue

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

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

doubleDerivative;//微分常數(shù)DerivativeConst

doubleLastError;//Error[-1]

doublePrevError;//Error[-2]

doubleSumError;//SumsofErrors

}PID;PID計(jì)算部分:doublePIDCalc(PID*pp,doubleNextPoint)

{

doubledError,Error;

Error=pp->SetPoint-NextPoint;//偏差

pp->SumError+=Error;//積分

dError=Error-pp->LastError;//當(dāng)前微分

pp->PrevError=pp->LastError;

pp->LastError=Error;

return(pp->Proportion*Error//比例項(xiàng)

+pp->Integral*pp->SumError//積分項(xiàng)

+pp->Derivative*dError);}//微分項(xiàng)

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;//設(shè)定目標(biāo)longSumError;//誤差累計(jì)

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計(jì)算部分*/intIncPIDCalc(intNextPoint){registerintiError,i

溫馨提示

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

評(píng)論

0/150

提交評(píng)論