close

有鑑於此, AVR 的文章解釋的 LOW-PASS FILTER 演算法 (algorithm), 對沒有基礎的同學來說, 簡直就是霧裡看花.

所以又看看另外一個解釋, 同樣的處理方法, 不過使用 HC08. 這個解釋的比較清楚一點, 除了寫出演算法, 還大概解釋了演算法背後的原理.

原文原作都是網上公開的, 原來 MOTOROLA HC11 的某份 APPLICATION NOTE 也有詳細解釋, 不過忘記在哪裡找, 好像是 198x 年出品的.

這個原文原作都可以找到
http://www.edn.com/contents/images/6518682.pdf
http://www.edn.com/contents/images/02di2list.zip



整理過的原文的 ASM
**************************************************************************
*               DIGITAL SINGLE POLE LOW-PASS FILTER                      *
**************************************************************************
* Fosc=12.8MHz, Prescaler=64;  ##T=50*Tms  CT=50                         *
* Input:  AD3  (pin2) Range: $00-$FF                                     *
* Sample rate=10ms                                                       *
* Filter parameters:b1=0.875;a0=0.125; F=1/a0=8; d=7.5                   *
**************************************************************************
$nolist
$include 'Fr908QT2.asm'
$list

PERIOD         EQU $01F4    ;Sample rate =10ms; (50*10=500=$01f4 ),
S              EQU 3        ;Number of right shifts to divide by F=8
HAlFF          EQU 4        ;Half of devisor F=8 (for rounding during division)

*VARIABLES
            ORG RAM
INPUT       RMB   1       ;X{n}
OUTPUT      RMB   1       ;Y[n]
INCREMENT   RMB   2       ;X[n] - Y[n-1]
SampleCNT   RMB   1       ;Sample counter for testing only

*INITIALIZATION
         ORG ROM
init     RSP                     ;$FF-->SP
         CLRA
         CLR    INPUT            ;Clear registers
         CLR    OUTPUT
         CLR    INCREMENT
         CLR    INCREMENT+1
         CLR    SampleCNT
         LDA    $FFC0            ;adjusting frequency
         STA    $0038            
         MOV    #$01,CONFIG1     ;cop disabled
         MOV    #$41,CONFIG2     ;RST-active in pin,IRQ-active in pin
         CLRH                    ;clear H:X
         CLRX
         CLR    prtA             ;clear prtA
         MOV    #pA0.,DDRA       ;set pA0 output,pA1-pA5 inputs
         MOV    #0,TSC0          ;clear TSC0
         LDHX   #PERIOD          ;PERIOD -->TmodH & TmodL
         STHX   TmodH
         MOV    #%00010110,TSC   ;clear TIMER,start TIMER,prescaler:64
********************************************************************************

MAIN     BRCLR  TOF,TSC,*        ;wait for the end of PERIOD
         BCLR   TOF,TSC          ;TOF reset

ReadADC  MOV    #3,ADSCR         ;start ADC3
         BRCLR  COCO,ADSCR,*     ;wait for ADC3 end
         MOV    ADR,INPUT        ;ADR->INPUT
         INC    SampleCNT

Filtering
         JSR    Filter
         BRA    MAIN

********************* DIGITAL LOW_PASS FILTER ************************************

Filter  
         LDA    INPUT           ;Calculate (X[n] - Y[n-1])
         SUB    OUTPUT
         STA    INCREMENT+1
        
         clc
         LDA    INCREMENT+1     ;Calculate (X[n]-Y[n-1])+halfF
         ADD    #HALFF          ;(for rounding the result of division)
         STA    INCREMENT+1
         LDA    INCREMENT
         ADC    #0
         STA    INCREMENT
        
         LDA    #S              ;division on F=8, by S=3 right shifts,
mf1      ASR    INCREMENT
         ROR    INCREMENT+1
         DBNZA  mf1

         LDA    OUTPUT          ;Calculate Y[n]=Y[n-1] + (X[n]-Y[n-1])/8
         ADD    INCREMENT+1
         STA    OUTPUT
         RTS
************************************************************************************
 ORG        $FFFE      ; Position to reset vector
 FDB         init      ; Set start address
$nolist


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 xiaolabaDIY 的頭像
    xiaolabaDIY

    xiaolabaDIY 的部落格

    xiaolabaDIY 發表在 痞客邦 留言(0) 人氣()