📄 auto.lst
字号:
188 for (j=0;j<N-1;j++)
189 {
190 for (i=0;i<N-j;i++)
191 {
192 if ( value_buf[i]>value_buf[i+1] )
193 {
194 temp = value_buf[i];
195 value_buf[i] = value_buf[i+1];
196 value_buf[i+1] = temp;
197 }
198 }
199 }
200 for(count=1;count<N-1;count++)
201 sum += value[count];
202 return (char)(sum/(N-2));
203 } */
204
205 /*6、限幅平均滤波法
206 A、方法:
207 相当于“限幅滤波法”+“递推平均滤波法”
208 每次采样到的新数据先进行限幅处理,
209 再送入队列进行递推平均滤波处理
210 B、优点:
211 融合了两种滤波法的优点
212 对于偶然出现的脉冲性干扰,可消除由于脉冲干扰所引起的采样值偏差
213 C、缺点:比较浪费RAM
214 7、一阶滞后滤波法
215 A、方法:
216 取a=0~1
217 本次滤波结果=(1-a)*本次采样值+a*上次滤波结果
218 B、优点:
219 对周期性干扰具有良好的抑制作用
220 适用于波动频率较高的场合
221 C、缺点:
222 相位滞后,灵敏度低
223 滞后程度取决于a值大小
224 不能消除滤波频率高于采样频率的1/2的干扰信号
225 7、一阶滞后滤波法
226 /* 为加快程序处理速度假定基数为100,a=0~100 */
227 /*#define a 50
228 char value;
229 char filter()
230 {
231 char new_value;
232 new_value = get_ad();
233 return (100-a)*value + a*new_value;
234 } */
235 /*
236 8、加权递推平均滤波法
237 A、方法:
238 是对递推平均滤波法的改进,即不同时刻的数据加以不同的权
239 通常是,越接近现时刻的数据,权取得越大。
240 给予新采样值的权系数越大,则灵敏度越高,但信号平滑度越低
241 B、优点:
C51 COMPILER V7.06 AUTO 07/20/2008 16:34:55 PAGE 5
242 适用于有较大纯滞后时间常数的对象
243 和采样周期较短的系统
244 C、缺点:
245 对于纯滞后时间常数较小,采样周期较长,变化缓慢的信号
246 不能迅速反应系统当前所受干扰的严重程度,滤波效果差
247 8、加权递推平均滤波法
248 /* coe数组为加权系数表,存在程序存储区。*/
249 /*#define N 12
250 char code coe[N] = {1,2,3,4,5,6,7,8,9,10,11,12};
251 char code sum_coe = 1+2+3+4+5+6+7+8+9+10+11+12;
252
253 char filter()
254 {
255 char count;
256 char value_buf[N];
257 int sum=0;
258 for (count=0,count<N;count++)
259 {
260 value_buf[count] = get_ad();
261 delay();
262 }
263 for (count=0,count<N;count++)
264 sum += value_buf[count]*coe[count];
265 return (char)(sum/sum_coe);
266 } */
267 /*9、消抖滤波法
268 A、方法:
269 设置一个滤波计数器
270 将每次采样值与当前有效值比较:
271 如果采样值=当前有效值,则计数器清零
272 如果采样值<>当前有效值,则计数器+1,并判断计数器是否>=上限N(溢出)
273 如果计数器溢出,则将本次值替换当前有效值,并清计数器
274 B、优点:
275 对于变化缓慢的被测参数有较好的滤波效果,
276 可避免在临界值附近控制器的反复开/关跳动或显示器上数值抖动
277 C、缺点:
278 对于快速变化的参数不宜
279 如果在计数器溢出的那一次采样到的值恰好是干扰值,则会将干扰值当作有效值导入系统
280 9、消抖滤波法
281 #define N 12
282 char filter()
283 {
284 char count=0;
285 char new_value;
286 new_value = get_ad();
287 while (value !=new_value);
288 {
289 count++;
290 if (count>=N) return new_value;
291 delay();
292 new_value = get_ad();
293 }
294 return value;
295 }
296 */
297 /*10、限幅消抖滤波法
298 A、方法:
299 相当于“限幅滤波法”+“消抖滤波法”
300 先限幅,后消抖
301 B、优点:
302 继承了“限幅”和“消抖”的优点
303 改进了“消抖滤波法”中的某些缺陷,避免将干扰值导入系统
C51 COMPILER V7.06 AUTO 07/20/2008 16:34:55 PAGE 6
304 C、缺点:对于快速变化的参数不宜
305
306 假定从8位AD中读取数据(如果是更高位的AD可定义数据类型为int),子程序为get_ad();
307
308 */
309
310 float process_t() /*测量温度求解函数,已知R,VREF*/
311 {
312 1 data float vac,vab,Rt,R,T;
313 1 vac=filter(0);
314 1 vab=filter(3); /*A/D转换获得VAB和VAC*/
315 1 R=(vab+vac)*0.0326999;
316 1 /*计算出热电阻当前值*/
317 1 //rt=lubo(rt1); /*滑动加权滤波*/
318 1 //rt= rt1;
319 1 T=(R-100)*2.54;
320 1 //首先按照400度量程线性估计当前温度
321 1 do
322 1 //采用试差法循环计算,刚才估计的t做初始值
323 1 {
324 2 if(R<100) //摄氏零度以下处理
325 2 {
326 3 Rt=100+T*(0.396847-0.00005847*T-0.000000000422351*(T-100)*T*T);
327 3
328 3 }
329 2 else //摄氏零度以上处理
330 2 {
331 3 Rt=100+T*(0.396847-0.00005847*T);
332 3 }
333 2 T=T+(R-Rt)*2.54;
334 2 }
335 1 while(((R-Rt)>0.0004)||(Rt-R)>0.0004); //计算余差最终小于0.005欧
336 1 return(T*100) ; //试差结束,返回浮点数温度值
337 1 }
338
339 float AD590(void )
340 {float vac,T ;
341 1 vac=filter(1);
342 1 T=vac-2732;
343 1 return(T*10);
344 1
345 1 }
346
347
C51 COMPILER V7.06 AUTO 07/20/2008 16:34:55 PAGE 7
NAME CLASS MSPACE TYPE OFFSET SIZE
==== ===== ====== ==== ====== ====
AD590. . . . . . . . . . . . . . . . . PUBLIC CODE PROC 0000H -----
vac. . . . . . . . . . . . . . . . . AUTO DATA FLOAT 0000H 4
T. . . . . . . . . . . . . . . . . . AUTO DATA FLOAT 0004H 4
_AD_Conver . . . . . . . . . . . . . . EXTERN CODE PROC ----- -----
value_buf. . . . . . . . . . . . . . . PUBLIC DATA ARRAY 0000H 8
process_t. . . . . . . . . . . . . . . PUBLIC CODE PROC 0000H -----
vac. . . . . . . . . . . . . . . . . AUTO DATA FLOAT 0000H 4
vab. . . . . . . . . . . . . . . . . AUTO DATA FLOAT 0004H 4
Rt . . . . . . . . . . . . . . . . . AUTO DATA FLOAT 0008H 4
R. . . . . . . . . . . . . . . . . . AUTO DATA FLOAT 000CH 4
T. . . . . . . . . . . . . . . . . . AUTO DATA FLOAT 0010H 4
i. . . . . . . . . . . . . . . . . . . PUBLIC DATA U_CHAR 0008H 1
_filter. . . . . . . . . . . . . . . . PUBLIC CODE PROC 0000H -----
port . . . . . . . . . . . . . . . . * REG * DATA U_CHAR 0003H 1
sum. . . . . . . . . . . . . . . . . AUTO DATA FLOAT 0000H 4
count. . . . . . . . . . . . . . . . AUTO DATA U_CHAR 0004H 1
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 669 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 9 33
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -