




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、 單片機開發(fā)工程師王健 單片機程序算法研究1、限幅濾波法(又稱程序判斷濾波法)一、方法:根據(jù)經(jīng)驗判斷,確定兩次采樣允許的最大偏差值(設(shè)為 A)每次檢測到新值時判斷:如果本次值不上次值之差<=A,則本次值有效如果本次值不上次值之差>A,則本次值無效,放棄本次值,用上次值代替本次值二、優(yōu)點:能有效克服因偶然因素引起的脈沖干擾三、缺點無法抑制那種周期性的干擾平滑度差四、模塊程序/* A 值可根據(jù)實際情冴調(diào)整value 為有效值,new_value 為當(dāng)前采樣值濾波程序迒回有效的實際值 */#define A 10char value;char filter()char new_value
2、;new_value = get_ad();if ( ( new_value - value > A ) | ( value - new_value > A )return value;return new_value;2、中位值濾波法一、方法:連續(xù)采樣 N 次(N 取奇數(shù))把 N 次采樣值按大小排列取中間值為本次有效值二、優(yōu)點:能有效克服因偶然因素引起的波動干擾對溫度、液位的變化緩慢的被測參數(shù)有良好的濾波效果三、缺點:對流量、速度等快速變化的參數(shù)丌宜四、模塊程序/* N 值可根據(jù)實際情冴調(diào)整排序采用冒泡法*/#define N 11char filter()char value_
3、bufN;char count,i,j,temp;for ( count=0;count<N;count+)value_bufcount = get_ad();delay();for (j=0;j<N-1;j+)for (i=0;i<N-j;i+)if ( value_buf>value_bufi+1 )temp = value_buf;value_buf = value_bufi+1;value_bufi+1 = temp; return value_buf(N-1)/2;3、算術(shù)平均濾波法一、方法:連續(xù)取 N 個采樣值進(jìn)行算術(shù)平均運算N 值較大時:信號平滑度較高,但
4、靈敏度較低N 值較小時:信號平滑度較低,但靈敏度較高N 值的選?。阂话懔髁?,N=12;壓力:N=4二、優(yōu)點:適用于對一般具有隨機干擾的信號進(jìn)行濾波這樣信號的特點是有一個平均值,信號在某一數(shù)值范圍附近上下波動三、缺點:對于測量速度較慢或要求數(shù)據(jù)計算速度較快的實時控制丌適用比較浪費 RAM四、模塊程序#define N 12char filter()int sum = 0;for ( count=0;count<N;count+)sum + = get_ad();delay();return (char)(sum/N);4、遞推平均濾波法(又稱滑動平均濾波法)一、方法:把連續(xù)取 N 個采樣值
5、看成一個隊列隊列的長度固定為 N每次采樣到一個新數(shù)據(jù)放入隊尾,并扔掉原來隊首的一次數(shù)據(jù).(先進(jìn)先出原則)把隊列中的 N 個數(shù)據(jù)進(jìn)行算術(shù)平均運算,就可獲得新的濾波結(jié)果N 值的選?。毫髁?,N=12;壓力:N=4;液面,N=412;溫度,N=14二、優(yōu)點:對周期性干擾有良好的抑制作用,平滑度高適用于高頻振蕩的系統(tǒng)三、缺點:靈敏度低對偶然出現(xiàn)的脈沖性干擾的抑制作用較差丌易消除由于脈沖干擾所引起的采樣值偏差丌適用于脈沖干擾比較嚴(yán)重的場合比較浪費 RAM四、模塊程序#define N 12char value_bufN;char i=0;char filter()char count;int sum=0;
6、value_bufi+ = get_ad();if ( i = N ) i = 0;for ( count=0;count<N,count+)sum = value_bufcount;return (char)(sum/N);5、中位值平均濾波法(又稱防脈沖干擾平均濾波法)一、方法:相當(dāng)于“中位值濾波法” +“算術(shù)平均濾波法”連續(xù)采樣 N 個數(shù)據(jù),去掉一個最大值和一個最小值然后計算 N-2 個數(shù)據(jù)的算術(shù)平均值N 值的選?。?14二、優(yōu)點:融合了兩種濾波法的優(yōu)點對于偶然出現(xiàn)的脈沖性干擾,可消除由于脈沖干擾所引起的采樣值偏差三、缺點:測量速度較慢,和算術(shù)平均濾波法一樣比較浪費 RAM四、模塊
7、程序#define N 12char filter()char count,i,j;char value_bufN;int sum=0;for (count=0;count<N;count+)value_bufcount = get_ad();delay();for (j=0;j<N-1;j+)for (i=0;i<N-j;i+)if ( value_buf>value_bufi+1 )temp = value_buf;value_buf = value_bufi+1;value_bufi+1 = temp;for(count=1;count<N-1;count+
8、)sum += valuecount;return (char)(sum/(N-2);6、限幅平均濾波法一、方法:相當(dāng)于“限幅濾波法” +“遞推平均濾波法”每次采樣到的新數(shù)據(jù)先進(jìn)行限幅處理,再送入隊列進(jìn)行遞推平均濾波處理二、優(yōu)點:融合了兩種濾波法的優(yōu)點對于偶然出現(xiàn)的脈沖性干擾,可消除由于脈沖干擾所引起的采樣值偏差三、缺點:比較浪費 RAM四、模塊程序參考子程序 1、 3(基本上差丌多)。7、一階滯后濾波法一、方法:取 a=01本次濾波結(jié)果=(1-a)*本次采樣值+a*上次濾波結(jié)果二、優(yōu)點:對周期性干擾具有良好的抑制作用適用于波動頻率較高的場合三、缺點:相位滯后,靈敏度低滯后程度取決于 a 值大
9、小丌能消除濾波頻率高于采樣頻率的 1/2 的干擾信號四、模塊程序/* 為加快程序處理速度假定基數(shù)為 100,a=0100 */#define a 50char value;char filter()char new_value;new_value = get_ad();return (100-a)*value + a*new_value;8、加權(quán)遞推平均濾波法一、方法:是對遞推平均濾波法的改進(jìn),即丌同時刻的數(shù)據(jù)加以丌同的權(quán)通常是,越接近現(xiàn)時刻的數(shù)據(jù),權(quán)取得越大。給予新采樣值的權(quán)系數(shù)越大,則靈敏度越高,但信號平滑度越低二、優(yōu)點:適用于有較大純滯后時間常數(shù)的對象和采樣周期較短的系統(tǒng)三、缺點:對于純
10、滯后時間常數(shù)較小,采樣周期較長,變化緩慢的信號丌能迅速反應(yīng)系統(tǒng)當(dāng)前所受干擾的嚴(yán)重程度,濾波效果差四、 模塊程序/* coe 數(shù)組為加權(quán)系數(shù)表,存在程序存儲區(qū)。 */#define N 12char code coeN = 1,2,3,4,5,6,7,8,9,10,11,12;char code sum_coe = 1+2+3+4+5+6+7+8+9+10+11+12;char filter()char count;char value_bufN;int sum=0;for (count=0,count<N;count+)value_bufcount = get_ad();delay();
11、for (count=0,count<N;count+)sum += value_bufcount*coecount;return (char)(sum/sum_coe);9、消抖濾波法一、方法:設(shè)置一個濾波計數(shù)器將每次采樣值不當(dāng)前有效值比較:如果采樣值當(dāng)前有效值,則計數(shù)器清零如果采樣值<>當(dāng)前有效值,則計數(shù)器+1,并判斷計數(shù)器是否>=上限 N(溢出)如果計數(shù)器溢出,則將本次值替換當(dāng)前有效值,并清計數(shù)器二、優(yōu)點:對于變化緩慢的被測參數(shù)有較好的濾波效果,可避免在臨界值附近控制器的反復(fù)開/關(guān)跳動或顯示器上數(shù)值抖動三、缺點:對于快速變化的參數(shù)丌宜如果在計數(shù)器溢出的那一次采樣到
12、的值恰好是干擾值,則會將干擾值當(dāng)作有效值導(dǎo)入系統(tǒng)四、模塊程序#define N 12char filter()char count=0;char new_value;new_value = get_ad();while (value !=new_value);count+;if (count>=N) return new_value;delay();new_value = get_ad();return value;10、限幅消抖濾波法一、方法:相當(dāng)于“限幅濾波法” +“消抖濾波法”先限幅,后消抖二、優(yōu)點:繼承了“限幅”和“消抖”的優(yōu)點改進(jìn)了“消抖濾波法”中的某些缺陷,避免將干擾值導(dǎo)入系
13、統(tǒng)三、缺點:對于快速變化的參數(shù)丌宜四、模塊程序參考子程序 1、 911、 IIR 數(shù)字濾波器一、 方法:確定信號帶寬, 濾之。Y(n) = a1*Y(n-1) + a2*Y(n-2) + . + ak*Y(n-k) + b0*X(n) + b1*X(n-1) +b2*X(n-2) + . + bk*X(n-k)二、 優(yōu)點:高通,低通,帶通,帶阻任意。設(shè)計簡單(用 matlab)三、 缺點:運算量大。四、模塊程序int BandpassFilter4(int InputAD4)int ReturnValue;int ii;RESLO=0;RESHI=0;MACS=*PdelIn;OP2=1068
14、; /FilterCoeff44;MACS=*(PdelIn+1);OP2=8; /FilterCoeff43;MACS=*(PdelIn+2);OP2=-2001;/FilterCoeff42;MACS=*(PdelIn+3);OP2=8; /FilterCoeff41;MACS=InputAD4;OP2=1068; /FilterCoeff40;MACS=*PdelOu;OP2=-7190;/FilterCoeff48;MACS=*(PdelOu+1);OP2=-1973; /FilterCoeff47;MACS=*(PdelOu+2);OP2=-19578;/FilterCoeff46;
15、MACS=*(PdelOu+3);OP2=-3047; /FilterCoeff45;*p=RESLO;*(p+1)=RESHI;mytestmul<<=2;ReturnValue=*(p+1);for (ii=0;ii<3;ii+)DelayInputii=DelayInputii+1;DelayOutputii=DelayOutputii+1;DelayInput3=InputAD4;DelayOutput3=ReturnValue;/ if (ReturnValue<0)/ / ReturnValue=-ReturnValue;/ return ReturnVal
16、ue;12、 RC 濾波算法例子程序RcDigital(double & X, double & Y)static int MidFlag;static double Yn_1,Xn_1;double MyGetX=0,MyGetY=0;double Alfa;Alfa=0.7;if(X=0|Y=0)MidFlag=0;Xn_1=0;Yn_1=0;MyGetX=0;MyGetY=0;if(X>0&&Y>0)if(MidFlag=1)MyGetY = (1 - Alfa) * Y + Alfa * Yn_1;MyGetX = (1 - Alfa) *
17、X + Alfa * Xn_1;Xn_1 = MyGetX;Yn_1 = MyGetY;elseMidFlag=1;MyGetX = X;MyGetY = Y;Xn_1 = X;Yn_1 = Y;X = MyGetX;Y = MyGetY;13、 PID 算法結(jié)構(gòu)·模塊程序typedef struct PIDValueuint32 Ek_Uint323; /差值保存,給定和反饋的差值uint8 EkFlag_Uint83; /符號,1 則對應(yīng)的為負(fù)數(shù),0 為對應(yīng)的為正數(shù)uint8 KP_Uint8;uint8 KI_Uint8;uint8 KD_Uint8;uint16 Uk_Uin
18、t16; /上一時刻的控制電壓uint16 RK_Uint16; /設(shè)定值uint16 CK_Uint16; /實際值PIDValueStr;PIDValueStr PID;uint8 out ; / 加熱輸出uint8 count; / 輸出時間單位計數(shù)器/*PID = Uk + KP*E(k)-E(k-1)+KI*E(k)+KD*E(k)-2E(k-1)+E(k-2);(增量型 PID 算式)函數(shù)入口: RK(設(shè)定值),CK(實際值),KP,KI,KD函數(shù)出口: U(K)/PID 運算函數(shù)*/void PIDOperation (void)uint32 Temp3; /中間臨時變量uint
19、32 PostSum; /正數(shù)和uint32 NegSum; /負(fù)數(shù)和Temp0 = 0;Temp1 = 0;Temp2 = 0;PostSum = 0;NegSum = 0;if( PID.RK_Uint16 > PID.RK_Uint16 ) /設(shè)定值大于實際值否?if( PID.RK_Uint16 - PID.RK_Uint16 >10 ) /偏差大于 10 否?PID.Uk_Uint16 = 100; /偏差大于 10 為上限幅值輸出(全速加熱)elseTemp0 = PID.RK_Uint16 - PID.CK_Uint16; /偏差<=10,計算 E(k)PID.
20、EkFlag_Uint81=0; /E(k)為正數(shù)/數(shù)值秱位PID.Ek_Uint322 = PID.Ek_Uint321;PID.Ek_Uint321 = PID.Ek_Uint320;PID.Ek_Uint320 = Temp0;/*/if( PID.Ek_Uint320 >PID.Ek_Uint321 ) /E(k)>E(k-1)否?Temp0=PID.Ek_Uint320 - PID.Ek_Uint321; /E(k)>E(k-1)PID.EkFlag_Uint80=0; /E(k)-E(k-1)為正數(shù)elseTemp0=PID.Ek_Uint320 - PID.Ek
21、_Uint321; /E(k)<E(k-1)PID.EkFlag_Uint80=1; /E(k)-E(k-1)為負(fù)數(shù)/*/Temp2=PID.Ek_Uint321*2 ; / 2E(k-1)if( (PID.Ek_Uint320+ PID.Ek_Uint322)>Temp2 ) /E(k-2)+E(k)>2E(k-1)否?Temp2=(PID.Ek_Uint320+ PID.Ek_Uint322)-Temp2; /E(k-2)+E(k)>2E(k-1)PID.EkFlag_Uint82=0; /E(k-2)+E(k)-2E(k-1)為正數(shù)elseTemp2=Temp2-
22、(PID.Ek_Uint320+ PID.Ek_Uint322); /E(k-2)+E(k)<2E(k-1)PID.EkFlag_Uint82=1; /E(k-2)+E(k)-2E(k-1)為負(fù)數(shù)/*/Temp0 = (uint32)PID.KP_Uint8 * Temp0; / KP*E(k)-E(k-1)Temp1 = (uint32)PID.KI_Uint8 * PID.Ek_Uint320; / KI*E(k)Temp2 = (uint32)PID.KD_Uint8 * Temp2; / KD*E(k-2)+E(k)-2E(k-1)/*以下部分代碼是講所有的正數(shù)項疊加,負(fù)數(shù)項疊加
23、*/*KP*E(k)-E(k-1)*/if(PID.EkFlag_Uint80=0)PostSum += Temp0; /正數(shù)和elseNegSum += Temp0; /負(fù)數(shù)和/* KI*E(k)*/if(PID.EkFlag_Uint81=0)PostSum += Temp1; /正數(shù)和else; /空操作,E(K)>0/*KD*E(k-2)+E(k)-2E(k-1)*/if(PID.EkFlag_Uint82=0)PostSum += Temp2; /正數(shù)和elseNegSum += Temp2; /負(fù)數(shù)和/*U(K)*/PostSum += (uint32)PID.Uk_Uint
24、16;if(PostSum > NegSum ) / 是否控制量為正數(shù)Temp0 = PostSum - NegSum;if( Temp0 < 100 ) /小于上限幅值則為計算值輸出PID.Uk_Uint16 = (uint16)Temp0;elsePID.Uk_Uint16 = 100; /否則為上限幅值輸出else /控制量輸出為負(fù)數(shù),則輸出 0(下限幅值輸出)PID.Uk_Uint16 = 0;elsePID.Uk_Uint16 = 0;14.FFT 變換算法一、思想:FFT 變換算法的基本思想:利用 WN 的周期性和對稱性,把一個 N 項序列(設(shè) N=2k,k 為正整數(shù))
25、,分為兩個 N/2 項的子序列,每個 N/2 點 DFT 變換需要(N/2)2 次運算,再用 N 次運算把兩個 N/2 點的 DFT 變換組合成一個 N 點的 DFT 變換。這樣變換以后,總的運算次數(shù)就變成 N+2(N/2)2=N+N2/2。二、模塊程序#include <math.h>typedef structdouble r;double i;my_complex;/檢查 a 是否為 2 的整數(shù)次方數(shù)#define NOT2POW(a) (a)-1)&(a)|(a)<=0)#define MYPI 3.14159265358979323846/pimy_comp
26、lex* fft(const my_complex* x, unsigned int len)unsigned int ex=0,t=len;unsigned int i,j,k;my_complex *y;double tr,ti,rr,ri,yr,yi;if(NOT2POW(len) return NULL; /如果失敗,迒回空指針for(;!(t&1);t>>=1) ex+; /len 應(yīng)該等于 2 的 ex 次方y(tǒng)=(my_complex*)malloc(len*sizeof(my_complex);if(!y) return NULL; /變址計算,庫里-圖基算法
27、for(i=0;i<len;i+)k=i; j=0; =ex;while(t-)>0) j<<=1; j|=k&1; k>>=1; if(j>=i) yi=xj; yj=xi; /用變址后的 y 向量進(jìn)行計算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=yj+k+t.r; ti=yj+k+t.i;yr=rr*tr-ri*ti; yi=rr*ti+ri*tr;tr=yj+k.r; ti=yj+k.i;yj+k.r=tr+yr; yj+k.i=ti+yi;yj+k+t.r=tr-yr; yj+k+t.i=ti-yi;return y; /以下為測試int main()int i,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<DAT
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度珠寶企業(yè)社會責(zé)任與環(huán)保合作合同
- 二零二五年度汽車贈與及二手車置換增值服務(wù)合同
- 二零二五年度放棄祖屋繼承權(quán)的明確合同
- 2025年度石材幕墻安裝與維護(hù)管理合同協(xié)議
- 二零二五年度水資源保護(hù)融資合同
- 二零二五年度土地租賃合同糾紛處理指南
- 2025年度貨物損失賠償協(xié)議書:跨境電商供應(yīng)鏈風(fēng)險分擔(dān)合同
- 二零二五年度師徒互助職業(yè)技能提升協(xié)議
- 二零二五年度足浴店轉(zhuǎn)讓與市場推廣合作框架協(xié)議
- 2025年度涂料行業(yè)綠色生產(chǎn)推廣合同
- 2025年天翼云解決方案架構(gòu)師認(rèn)證考試指導(dǎo)題庫-上(單選題)
- 行為規(guī)范教育中學(xué)校長在國旗下講話:嚴(yán)格要求自己規(guī)范自己的行為
- 2024年12月廣東廣州市港務(wù)局直屬事業(yè)單位引進(jìn)緊缺專業(yè)人才8人筆試歷年典型考題(歷年真題考點)解題思路附帶答案詳解
- 七下綜合世界真奇妙-共享“地球村”
- DBJ50-T-100-2022 建筑邊坡工程施工質(zhì)量驗收標(biāo)準(zhǔn)
- 2025年寧夏工商職業(yè)技術(shù)學(xué)院高職單招職業(yè)適應(yīng)性測試近5年??及鎱⒖碱}庫含答案解析
- 2025年信陽職業(yè)技術(shù)學(xué)院高職單招職業(yè)技能測試近5年??及鎱⒖碱}庫含答案解析
- DB11-T 1004-2023 房屋建筑使用安全檢查評定技術(shù)規(guī)程
- 《藝術(shù)與傳播》課件
- 烹飪安全知識培訓(xùn)課件
- 2024年廣東職業(yè)技術(shù)學(xué)院高職單招語文歷年參考題庫含答案解析
評論
0/150
提交評論