1.原理
把连续取N个采样值看成一个队列
队列的长度固定为N
每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据.(先进先出原则)
把队列中的N个数据进行算术平均运算,就可获得新的滤波结果
N值的选取:流量,N=12;压力:N=4;液面,N=4~12;温度,N=1~4
2.程序代码
;NAME: adc_data_avg
;INPUT:
;FUNCTION: /8
;DESCRIBE:
;CALL SUBPROGRAM: NONE
;USING RESOURCE:
;STACK NEED: 1
;OUTPUT: wk03wk02
;*********************************************************************************
adc_data_avg:
b0mov y,#adc_data_buf$m
b0mov z,#adc_data_buf$l
b0mov r,#ADC_COUNTER_CONST
clr wk04
clr wk03
clr wk02
adc_data_avg20:
mov a,@yz ;读取一个数据的高字节
b0mov wk01,a
;inc_yz
incms z
;nop
mov a,@yz ;读取一个数据的低字节
;inc_yz
incms z
;nop
add wk02,a ;累加到累加和中
b0mov a,wk01
adc wk03,a
mov a,#00h
adc wk04,a
djnz r,adc_data_avg20 ;累加完全部数据
b0mov r,#DIV_CONTER
b0bclr fc
adc_data_avg30:
rrcm wk04
rrcm wk03
rrcm wk02
djnz r,adc_data_avg30
;=====================================================================
adc_data_avg40: ;数据变化判断
B0MOV_ wk01,adc_data_back_h
B0MOV_ wk00,adc_data_back_l
call sub_hex2b ;(FC)(wk01wk00)=(wk03wk02)-(wk01wk00) 1OS 0:NEG
b0mov a,pflag
b0mov r,a
;数据变化大,则跳
HEX2B_CJAE wk01,wk00,#00,std_step,adc_data_avg42
adc_data_avg41: ;数据稳定
djnz data_std_counter,adc_data_avg48
clr data_inc_counter
clr data_dec_counter
mov a,#01
b0mov data_std_counter,a
jmp adc_data_avg47
adc_data_avg42:
b0mov a,r
b0mov pflag,a
jnc adc_data_avg44 ;<
adc_data_avg43: ;>数据增大
incs data_inc_counter
;nop
cjae a,#DATA_TRACK_CONTER,adc_data_avg45
b0mov data_inc_counter,a
clr data_dec_counter
jmp adc_data_avg47
adc_data_avg44: ;<,数据减小
incs data_dec_counter
;nop
cjbe a,#DATA_TRACK_CONTER,adc_data_avg46
adc_data_avg45: ;数据变化OK
mov a,#DATA_TRACK_CONTER
b0mov data_dec_counter,a
b0mov data_inc_counter,a
b0mov data_std_counter,a
jmp adc_data_avg48
adc_data_avg46:
b0mov data_dec_counter,a
clr data_inc_counter
adc_data_avg47:
B0MOV_ wk03,adc_data_back_h
B0MOV_ wk02,adc_data_back_l
jmp adc_data_avg50
adc_data_avg48:
B0MOV_ adc_data_back_h,wk03
B0MOV_ adc_data_back_l,wk02
adc_data_avg50: ;数据累加,求算术平均
b0mov a,wk02
add data_avg_l,a
b0mov a,wk03
adc data_avg_m,a
mov a,#00
adc data_avg_h,a
djnz data_avg_count,adc_data_avg90
b0mov r,#02
adc_data_avg51:
b0bclr FC
rrcm data_avg_h
rrcm data_avg_m
rrcm data_avg_l
djnz r,adc_data_avg51
B0MOV_ wk03,data_avg_m
B0MOV_ wk02,data_avg_l
b0bset f_data_ok
call adc_data_init
adc_data_avg90:
ret
adc_data_init:
clr data_avg_h
clr data_avg_m
clr data_avg_l
B0MOV_ data_avg_count,#04
ret |