ADXL345 sensörünü aşağıdaki kodla okuyorum sensör hiç hareket etmesede değerler sürekli değişiyor. Tecrübesi olan var mı?
DEVICE = 16F628A
CONFIG FOSC_INTOSCCLK, WDTE_OFF, PWRTE_ON, MCLRE_ON, BOREN_OFF, LVP_OFF, CPD_ON, CP_ON
;**** End of Fuse Configurator Settings ****
;-------------------------------------------------------------------------------
DECLARE XTAL = 4
CMCON = 7
DECLARE ALL_DIGITAL = True
TRISA=%00000000
TRISB = %00000011
DECLARE LCD_TYPE 0
DECLARE LCD_DTPORT PORTB
DECLARE LCD_DTPIN PORTB.4
DECLARE LCD_ENPIN PORTB.3
DECLARE LCD_RSPIN PORTB.2 '
DECLARE LCD_INTERFACE 4
DECLARE LCD_LINES 2
DECLARE I2C_SLOW_BUS ON 'SLow el bus I2C
DECLARE HBUS_BITRATE 100
SYMBOL SDA = PORTB.1 'I2C data pin. Pullup connection is required.
SYMBOL SCL = PORTB.0 'I2C clock pin. Pullup connection is required.
SYMBOL W_DAT = $A6 'Used to perform a Write operation.
SYMBOL R_DAT = $A7 'Used to perform a Read operation.
SYMBOL D_FRM = $31 'Data Format.(Full Resultion,Range,Invert)
SYMBOL BW_RT = $2C 'Low Power,Rate.
SYMBOL P_CTL = $2D 'Send continuous Measurement mode.
SYMBOL F_CTL = $38 'Send Fifo Bypass mode
SYMBOL X_LSB = $32 'Read Register, Output of X LSB 8-bit value.
SYMBOL X_MSB = $33 'Read Register, Output of X MSB 8-bit value.
SYMBOL Y_LSB = $34 'Read Register, Output of Z LSB 8-bit value.
SYMBOL Y_MSB = $35 'Read Register, Output of Z MSB 8-bit value.
SYMBOL Z_LSB = $36 'Read Register, Output of Y LSB 8-bit value.
SYMBOL Z_MSB = $37 'Read Register, Output of Y MSB 8-bit value.
DIM READX AS WORD
DIM READY AS WORD
DIM READZ AS WORD
DELAYMS 50
I2COUT SDA,SCL,W_DAT,P_CTL,[$08]
DELAYMS 2
I2COUT SDA,SCL,W_DAT,F_CTL,[$00]
DELAYMS 2
I2COUT SDA,SCL,W_DAT,BW_RT,[$0C]
DELAYMS 2
I2COUT SDA,SCL,W_DAT,D_FRM,[$0B] ' Send continuous output command
DELAYMS 2
READI2C:
I2CIN SDA,SCL,R_DAT,X_MSB,[READX.HIGHBYTE] 'Read the data starting at x_msb
DELAYMS 100
I2CIN SDA,SCL,R_DAT,X_LSB,[READX.LOWBYTE]
DELAYMS 100
I2CIN SDA,SCL,R_DAT,Y_MSB,[READY.HIGHBYTE]
DELAYMS 100
I2CIN SDA,SCL,R_DAT,Y_LSB,[READY.LOWBYTE]
DELAYMS 100
I2CIN SDA,SCL,R_DAT,Z_MSB,[READZ.HIGHBYTE]
DELAYMS 100
I2CIN SDA,SCL,R_DAT,Z_LSB,[READZ.LOWBYTE]
DELAYMS 40
PRINT AT 1,1, "X=",SDEC READX," "
PRINT AT 1,9, "Y=",SDEC READY," "
PRINT AT 2,1, "Z=",SDEC READZ," "
delayms 500
GOTO READI2C
END
Sensör çok hassas olduğundan biraz değişmesi normaldir.
8-10 değer normal mi?
mutlaka yazılım ile filtreleme yapmak lazım diye biliyorum ben
MPU serisinde Low Pass Filter özelliği vardı.
(http://s7.postimg.cc/lz3i4znk7/LPF_0.jpg) (http://postimg.cc/image/lz3i4znk7/)
Filtre tamamen pasifken sonuç.
(http://s10.postimg.cc/9oey6fqlh/LPF_6.jpg) (http://postimg.cc/image/9oey6fqlh/)
Filtre tamamen aktifken sonuç.
Siyah renkli grafik ortam sıcaklığını gösteriyor. Ortam sıcaklığı sabitken bir süre çipe dokunup bırakınca oluşan görüntüleri karşılaştırabilirsiniz. Onun dışında sensör sabit duruyor. Yine sabit durduğu durumlardaki grafikleri karşılaştırabilirsiniz.
Sonuç, yazılımsal filtreleme yapmanız gerekiyor.
sensöre bakmadım ama medyan filtrelemeyi araştırmanızı tavsiye ederim.
sensörün ölçmünün sürekli değişmesine biz literatürde gürültü diyoruz ve çok doğal bir olay. ucuz mems sensörlerde gürültü yksektir ve düşürmek pek kolay ve mümkün değildir. zaten öyle olsaydı yüzlerce/binlerce dolara sensör satılmazdı.
şimdi gürültü en temel olaraak zero mean gaussian desek en basit alçak geçiren filtre yani ortalama almak bu işi azaltır. fakat filtrenin dezavantajları var, mesela tepkiyi sağırlaştırır ki bu dinamik tepki bakımından istenilen birşey değil. iir lp filtre yapsanız faz kayar ki bu daha beter olabilir. yani filtre bu işin palyatif çözümü, sabunlar sadece. bu arada median bu işe yaramaz, median daha çok spike tipindeki gürültülerde işe yarar.
aslında bu işin çözümü kalman dır. kalman, gasussian noise altında otimum estimate yapmanızı sağlar. ne seviyedesiniz, niye sordunuz bilemem ama bence kalman konusuna eğilmeniz doğru olacaktır.