avatar_efeworld

mpx 10 dp basınç sensörü

Başlatan efeworld, 20 Kasım 2016, 19:52:50

Dtmf

kusura bakmaın ete hocam bılmıyordum.uyarınız ıcın tesekkur ederım.
;====BMP 180 ============
Device =16F877A
Declare ALL_DIGITAL TRUE
XTAL = 20
TRISA=0:PORTA=0
TRISB=0:PORTB=0
TRISC=0:PORTC=0
TRISD=0:PORTD=0       
TRISE=0:PORTE=0
Declare LCD_TYPE alpha 
Declare LCD_LINES 2
Declare LCD_INTERFACE 4
Declare LCD_DTPIN PORTB.4
Declare LCD_RSPIN PORTB.0
Declare LCD_ENPIN PORTB.1
Symbol SDA =PORTC.7
Symbol SCL =PORTC.6

  Symbol BMP180 = $EE  'BMP180 I2C adres
  Symbol CalDatStAd =$AA
  Symbol InitConvReg =$F4
  Symbol PReadReg =$34
  Symbol TReadReg =$2E
  Symbol BASINCOKU=$F6
 
  Dim wAC1 As Word
  Dim wAC2 As Word
  Dim wAC3 As Word
  Dim wAC4 As Word
  Dim wAC5 As Word
  Dim wAC6 As Word

  Dim wB1 As Word
  Dim wB2 As Word
 
  Dim wMB As Word
  Dim wMC As Word
  Dim wMD As Word

;_______________________________
  Dim AC1 As DWord
  Dim AC2 As DWord
  Dim AC3 As DWord
  Dim AC4 As DWord
  Dim AC5 As DWord  ;ISI
  Dim AC6 As Word ;ISI

  Dim B1 As Byte
  Dim B2 As Byte
  Dim B6 As Byte
  Dim B3 As Word
  Dim B4 As Word
  Dim B7 As Word
  Dim PR As Word
 
  Dim MB As DWord
  Dim MC As DWord ;ISI
  Dim MD As DWord ;ISI

  Dim OSS As Byte
  Dim UP As  DWord
  Dim UT As Word    ;ISI
 

  Dim X1 As DWord     ;ISI
  Dim X2 As DWord     ;ISI
  Dim X3 As DWord     ;ISI
  Dim TOPLA As Word  ;ISI
  Dim T As Float;ISI
;==================================
Dim XX1 As DWord
Dim XX2 As DWord
Dim XX3 As DWord
Dim P As DWord
Dim PERA As Float

  Dim MSB As Word
   Dim LSB As Byte
    Dim XLSB As Word
OSS=3 
    Dim A1 As Byte
    Dim A2 As Byte
;==================================
Dim TEMP As Word
  DelayMS 100
  GoSub KALIBRE
  DelayMS 100
  Cls
;=============================
START:
;=============================SICAKLIK HESAPLAMA BOLUMU================
                 I2COUT SDA,SCL,BMP180,InitConvReg,[TReadReg] 
                 DelayMS 5
                 I2CIN SDA,SCL,BMP180,$F6,[UT]
                 GoSub Thesap
                 Print At 1,1,"C: ",Dec T
;================================BASINC HESAPLAMA BOLUMU=======================================                 
I2COUT SDA,SCL,BMP180,InitConvReg,[$34+OSS<<6] ;OSS DEGERI YAZMA
DelayUS 4500
I2CIN SDA,SCL,BMP180,$F6,[MSB]
I2CIN SDA,SCL,BMP180,$F7,[LSB]
I2CIN SDA,SCL,BMP180,$F8,[XLSB]
DelayMS 5
                TEMP.BYTE1=MSB:TEMP.BYTE0=LSB
                UP=TEMP>>(8-OSS)
                Print At 2,1,"HAM:",Dec UP
                DelayMS 10
GoSub BHESAP
Print At 2,10,"P:",Dec P
DelayMS 500
GoTo START
;=======================================KALIBRASYON==========================================
KALIBRE:
    Print At  1,1,"START"
    I2CIn SDA,SCL,$EE,$AA, [wAC1]
    DelayMS 5
    I2CIn SDA,SCL,$EE,$AC, [wAC2]
    DelayMS 5
    I2CIn SDA,SCL,$EE,$AE, [wAC3]
    DelayMS 5
    I2CIn SDA,SCL,$EE,$B0, [wAC4]
    DelayMS 5
    I2CIn SDA,SCL,$EE,$B2, [wAC5]
    DelayMS 5
    I2CIn SDA,SCL,$EE,$B4, [wAC6]
     DelayMS 5
    I2CIn SDA,SCL,$EE,$B6, [wB1]
    DelayMS 5
    I2CIn SDA,SCL,$EE,$B8, [wB2]
                    DelayMS 5
                   I2CIn SDA,SCL,$EE,$BA, [wMB]
                   DelayMS 5
                   I2CIn SDA,SCL,$EE,$BC, [wMC]
                   DelayMS 5
                   I2CIn SDA,SCL,$EE,$BE, [wMD]
                   DelayMS 5
    AC1 = (wAC1.HighByte<<8) + wAC1.LowByte 
    AC2 = (wAC2.HighByte<<8) + wAC2.LowByte
    AC3 = (wAC3.HighByte<<8) + wAC3.LowByte 
    AC4 = (wAC4.HighByte<<8) + wAC4.LowByte         
    AC5 = (wAC5.HighByte<<8) + wAC5.LowByte
    AC6 = (wAC6.HighByte<<8) + wAC6.LowByte
    B1 = (wB1.HighByte<<8) + wB1.LowByte
    B2 = (wB2.HighByte<<8) + wB2.LowByte
    MB = (wMB.HighByte<<8) + wMB.LowByte
    MC = (wMC.HighByte<<8) + wMC.LowByte
    MD = (wMD.HighByte<<8) + wMD.LowByte
Return
;======sıcaklık hesap=======================
Thesap:
X1 = (UT - AC6)               
   X1 = (X1 *AC5)/32768             
    X2 = (MC * 2048)
    X3 = X2/(X1 + MD)
    TOPLA = X1 + X3
    T = (TOPLA + 8)/160 
Return
;=====BASINC HESAPLAMA=============================
BHESAP:
B6 =(XX1+XX2)-4000                                     
    XX1 = (B6*B6)/4096
    XX1 = (B2 * XX1)/2048

    XX2 = (AC2 * B6)/2048
    XX3 = XX1 + XX2
   
    B3 = (AC1 * 4)+ XX3)<<OSS
    B3 = (B3+2)/4

    XX1 = (AC3 * B6)/8192

    XX2 = (B6 * B6)/4096
    XX2 = (B1 * XX2)/65536

    XX3 = XX1 + XX2
    XX3 = (XX3 + 2)/4

    B4 = (XX3 + 32768)
    B4 = (B4/32768)*AC4

    B7 = UP - B3
    B7 = B7*50000>>OSS
   
                      If B7<800000000 Then
                      P=B7*2/4
                      Else
                      P=(B7/B4)*2
                      EndIf

XX1=(P/256)
XX1=XX1*(P/256)
   XX1=(XX1*3038)/65536
   
   XX2=(-7357*P)/65536
   PR=XX1+XX2+3791
   P=P+PR/16
Return

Dtmf

#16
hocam bas dosyası

ete

#17
Bazı şeyleri atlamış gözüküyorsun.
Neler olduğunu açıklamadan önce, İSİS de BMP180 sensörünün model doyasını inceeledim.
Muhtemel Kalibrasyon değerleri olarak peek çok değerin - işaretli olarak kullanıldığını gördüm.
Senin hesap mantığında eksi işareti bulunmıyor. Yani unsigned matematik kullanıyorsun. Bu neyi değiştirir yada nereye etkili diyebilirsin. Hemen örnekleyeyim.
İsis model dosyasın MC değeri için MC=-8711 değeri verilmiş. Sıcaklık hesabında;
X2=Mc*2048 ifadesi sonucunda X2=-8711 * 2048 = -17.840.128 gibi bir değer hesaplanması gerekir. Bu sayıyı bir yere kopyalamak veya bir değişkene koymak mümkün değil maalesef. Bir sonraki hesabın devamında  Xe değerinin eksi yada artı olması sonucu büyük oranda değiştiriyor. Bunun basınç hesabınada etkisi var.
Gelelim Basınç hesabına,
XX1 ve XX2 diye iki farklı değişken le işe başlamışsın ama bunların aldıkları değeri göremedim.
Halbuki sıcaklık hesabında XX1 in karşılığı X1 ve XX2 nin karşılığı ise X3 olacak idi. Bunların yerine neden XX1 ve XX2 yazdın anlamadım. Bunların değerleri sıfır olacağı için basınç da sıfır çıkar sanırım.
Dediğim gibi uygun bir yol bulunmaz ise bu sensörün hesaplarının Basic matematiği ile yapılması gerçekten zor.
Uygun yol işaretlerin kullanılması anlamına geliyor ki buda sayıların 32 bit olarak kullanılmasını ve 31. ci bit sıfır ise sayı pozitif  değilse negatif şeklinde bir varsayım ile uygun formül yaratılmalı. Açıkçası benim gözüm yemiyor çok fazla zaman harcamak lazım uğraşacak zamanım yok bir sürü işim var ve hangisi ile uğraşacağımı şaşırdırm.

Ete




Dtmf


ete

Bu modül hesap sistemi basic için uygun değil daha ziyade C diline uygun. Sorun bu.
C dilinde hem negatif sayılarla hesap hemde direk 32 bit hesap kolaylığı var. Basicde 32 bit hesap yapmak mümkün ama negatif sayılarla çalışmak için biraz deveye hendek atlatmak gerekiyor.
Ete

ete

#20
Yeniden bu konu ile ilgilenmeye başladım. İlk verdiğin programa bakıp enbaşından düzelterek aşağı doğru gelmeye çalışacağım.
İlk dikkatimi çeken şey Kalibrasyon parametrelerinin elde edilme şekli oldu.
Değişken tanımlamasında , pek çok değişkenin Dword tanımlandığını görüyorum ki bu bence gerekli değil ve hatalara sebep oluyor. Mesela;
İlk kalibrasyon değeri AC1 için Wac1 şeklinde bir değişken okuyorsun entegreden.
Burada AC1 32 bit Wac1 ise 16 bitlik bir değişken.
Sonra
AC1=AC1 = (wAC1.HighByte<<8) + wAC1.LowByte
şeklinde bir yerleştirme yapılıyor ki bu yanlış bencee.
Zira I2C komutu 16 bit değer okuyabilirki direk okunan zaten 16 bit değişken.  Bana kalırsa olması gereken şu
Okuma satırına direk Ac1 yazman yeterli
I2CIn SDA,SCL,$EE,$AA, [AC1] şeklinde
Sonra
AC1 = (wAC1.HighByte<<8) + wAC1.LowByte

satırını sil. Data sheet bu şekilde açıklamalar vermiş çünki hangi yolla okunacağını bilmiyorlar.
Çok sıkıntı çıkartırsa okuma satırı;

I2CIn SDA,SCL,$EE,$AA, [AC1.Byte1,AC1.Byte0]
şeklinde yazılabilir. Ama ilk hali ilede sorun olacağını sanmam.
kesinlikle çalışması gerekir.
Sonuçta diğer parametrelerin okunma şeklini de  benzer şekilde düzelt ve gereksiz satırların tamamını sil bence.
Şimdilik bu kadar
Devam ediyorum.
Ete

ete

Programın gerisinide düzelttim. Ancak işaretsiz hesaplama yaptırdım senin yaptığın gibi.
Bunu yapmak için epeyce kod ilavesi gerekiyor ve birde okunmuş parametre değerlerine ihtiyaç var.
Genelde hangi parametreler eksi değerli çıkıyor acaba ona bakmak gerek.

;====BMP 180 ============
Device =16F877A
Declare ALL_DIGITAL TRUE
XTAL = 20
TRISA=0:PORTA=0
TRISB=0:PORTB=0
TRISC=0:PORTC=0
TRISD=0:PORTD=0       
TRISE=0:PORTE=0
Declare LCD_TYPE alpha 
Declare LCD_LINES 2
Declare LCD_INTERFACE 4
Declare LCD_DTPIN PORTB.4
Declare LCD_RSPIN PORTB.0
Declare LCD_ENPIN PORTB.1
Symbol SDA =PORTC.7
Symbol SCL =PORTC.6

  Symbol BMP180 = $EE  'BMP180 I2C adres
  Symbol CalDatStAd =$AA
  Symbol InitConvReg =$F4
  Symbol PReadReg =$34
  Symbol TReadReg =$2E
  Symbol BASINCOKU=$F6
 
  Dim wAC1 As Word
  Dim wAC2 As Word
  Dim wAC3 As Word
  Dim wAC4 As Word
  Dim wAC5 As Word
  Dim wAC6 As Word

  Dim wB1 As Word
  Dim wB2 As Word
 
  Dim wMB As Word
  Dim wMC As Word
  Dim wMD As Word

;_______________________________
  Dim AC1 As DWord
  Dim AC2 As DWord
  Dim AC3 As DWord
  Dim AC4 As DWord
  Dim AC5 As DWord  ;ISI
  Dim AC6 As Word ;ISI

  Dim B1 As Byte
  Dim B2 As Byte
  Dim B6 As Byte
  Dim B3 As Word
  Dim B4 As Word
  Dim B7 As Word
  Dim PR As Word
 
  Dim MB As DWord
  Dim MC As DWord ;ISI
  Dim MD As DWord ;ISI

  Dim OSS As Byte
  Dim UP As  DWord
  Dim UT As Word    ;ISI
 

  Dim X1 As DWord     ;ISI
  Dim X2 As DWord     ;ISI
  Dim X3 As DWord     ;ISI
  Dim TOPLA As Word  ;ISI
  Dim T As Float;ISI
;==================================
Dim XX1 As DWord
Dim XX2 As DWord
Dim XX3 As DWord
Dim P As DWord
Dim PERA As Float

  Dim MSB As Word
   Dim LSB As Byte
    Dim XLSB As Word
OSS=3 
    Dim A1 As Byte
    Dim A2 As Byte
;==================================
Dim TEMP As Word
  DelayMS 100
  GoSub KALIBRE
  DelayMS 100
  Cls
;=============================
START:
;=============================SICAKLIK HESAPLAMA BOLUMU================
                 I2COUT SDA,SCL,BMP180,InitConvReg,[TReadReg] 
                 DelayMS 5
                 I2CIN SDA,SCL,BMP180,$F6,[UT]
                 GoSub Thesap
                 Print At 1,1,"C: ",Dec T
;================================BASINC HESAPLAMA BOLUMU=======================================                 
I2COUT SDA,SCL,BMP180,InitConvReg,[$34+OSS<<6] ;OSS DEGERI YAZMA
DelayUS 4500
I2CIN SDA,SCL,BMP180,$F6,[MSB]
I2CIN SDA,SCL,BMP180,$F7,[LSB]
I2CIN SDA,SCL,BMP180,$F8,[XLSB]
DelayMS 5
                TEMP.BYTE1=MSB:TEMP.BYTE0=LSB
                UP=TEMP>>(8-OSS)
                Print At 2,1,"HAM:",Dec UP
                DelayMS 10
GoSub BHESAP
Print At 2,10,"P:",Dec P
DelayMS 500
GoTo START
;=======================================KALIBRASYON==========================================
KALIBRE:
    Print At  1,1,"START"
    I2CIn SDA,SCL,$EE,$AA, [AC1]
    DelayMS 5
    I2CIn SDA,SCL,$EE,$AC, [AC2]
    DelayMS 5
    I2CIn SDA,SCL,$EE,$AE, [AC3]
    DelayMS 5
    I2CIn SDA,SCL,$EE,$B0, [AC4]
    DelayMS 5
    I2CIn SDA,SCL,$EE,$B2, [AC5]
    DelayMS 5
    I2CIn SDA,SCL,$EE,$B4, [AC6]
     DelayMS 5
    I2CIn SDA,SCL,$EE,$B6, [B1]
    DelayMS 5
    I2CIn SDA,SCL,$EE,$B8, [B2]
    DelayMS 5
   I2CIn SDA,SCL,$EE,$BA, [MB]
   DelayMS 5
   I2CIn SDA,SCL,$EE,$BC, [MC]
   DelayMS 5
   I2CIn SDA,SCL,$EE,$BE, [MD]
   DelayMS 5
   Return
;======sıcaklık hesap=======================
Thesap:
X1 = (UT - AC6)               
   X1 = (X1 *AC5)/32768             
    X2 = (MC * 2048)
    X3 = X2/(X1 + MD)
    TOPLA = X1 + X3
    T = (TOPLA + 8)/16
Return
;=====BASINC HESAPLAMA=============================
BHESAP:
B6 =(TOPLA)-4000                                     
    XX1 = (B6*B6)/4096
    XX1 = (B2 * XX1)/2048

    XX2 = (AC2 * B6)/2048
    XX3 = XX1 + XX2
   
    B3 = ((AC1 * 4)+ XX3)<<OSS   
    B3 = (B3+2)/4

    XX1 = (AC3 * B6)/8192

    XX2 = (B6 * B6)/4096
    XX2 = (B1 * XX2)/65536

    XX3 = XX1 + XX2
    XX3 = (XX3 + 2)/4

    B4 = (XX3 + 32768)
    B4 = B4*AC4/32768

    B7 = UP - B3
    B7 = B7*(50000>>OSS)
   
                      If B7<800000000 Then
                      P=B7*2/B4
                      Else
                      P=(B7/B4)*2
                      EndIf

XX1=(P/256)*(P/256)
XX1=(XX1*3038)/65536
   
   XX2=(-7357*P)/65536
   PR=XX1+XX2+3791
   P=P+PR/16
Return


İşaretleride devreye sokmak için şayet derleyici signed değişken tanımlamasına müsaade ediyor ise parametreleri signed tanımlamak etmiyor ise her bir parametre için en yüksek bitlerine bakmak gerekiyor.
Örnek vereyim -72 diye bir dğeişkenimiz olsun ve bu word tipinde olsun. Bunun karşılığı Hex olarak $FFB8 dir .
Dolayısıyla bizim derleyici onu 72 olarak görür ve değeri ise $48 dir. Bu durumda diyelimki bu bir parametre ve ben onu $FFB8 olarak okudum. Bu bana sayının eksi olduğunu gösterecek. Daha iyi anlamak için bunu sensör hesap mantığı içinde açıklayayım. İsis te baktım sensörün parametrelerini vermişler ve AC2=-72 olarak verilmiş. AC2 aşağıdaki formülde kullanııyor ;
X2=AC2*B6/2048    (B6= 230 olduğunu varsayalım)
Normal işaretsiz olarak bu hesabı yaparsak X2=72 * 230/2048  =8 çıkacak sonuç
Şimdi işaretli olarak aynı işi yapalım sonu yine 8 çıkacak ama işareti - olacak yani -8
Bu neyi değiştirecek bir sonraki hesap da X3=X1+X2 şeklinde bir eşitlik verilmiş.
X1=(B2*(B6*B6/4096))/2048 şeklinde hesaplanıyor. (B2=4) iken X1=0 çıkcak çünki 1 den epeyce küçükbir değer.
Bu durumda X3=0+(-8)=-8 çıkması gerekirken biz onu +8 bulmuş olacağız.
Aslında söylemek istediğimi açıklayamadım. Diyelimki X1=24 bulundu. X3=X1+2=24+8=32 hesaplamak yerine X3=24-8=16 hesaplamamız gerekecek idi.

O halde yapmam gereken şey
IF AC2.bit15=1 then
   X3=X1-X2
else
   X3=X1+X2
endif
şeklinde halletmem gerekecek. Bütün bu hesapları bu mantıkla yaptığını düşünebiliyormusun. Sayfalarca kod yazmak gerekiyor. Ben olsam yazma ve daha doğru bir başka sensör alır onunla yapardım. Direk değer veren sensörler mevcut. Hesap yapmadan direk sonucu veriyorlar.

Ete

IF SAYI.bit15=1 then

fofo

Proton 32 bit negatif ve pozitif sayılarla işlem yapabiliyor.

Dim X2 As SDword
Dim Mc As SDword

Mc=-8711
X2=mc*2048

Print At 1,1,"Sonuc=",SDec X2



Alıntı YapSDword type variables may hold a 2's complemented signed value from -2147483648 to
+2147483647, also making this the largest of the variable family types. This comes at a
price however, as SDword expressions and comparisons will use more code space than
a regular Dword type. Use this type of variable sparingly, and only when necessary.

Dtmf

Ete hocam onca isin gucun arasinda ugrasmissiniz emeginize saglik hocam

Dtmf

TRY 37.72 | Atmosphetic Hava Basıncı Sensörü BMP280 Çip Ve Yükseklik Modülü STM8L051F3 Çip WT-BMP280
https://s.click.aliexpress.com/e/dWrG0KU
Hocam aliexpreste boyle bit modul buldum sizin soylediginiz direk sonuc veren sensor ler tanimina uyarmi

ete

Buda diğerinden pek farklı değil.

Ete

Dtmf

ete hocam vaktınız varsa verdıgım lınkte bı uygulama var bakabılırmısınız

http://www.knutselaar.eu/WP/bmp180-luchtdruk-hoogte-en-temperatuur-sensor/

ete

Bana göre aynı hatalar bu programda da mevcut. Acaba derleyip denesen çalıştırıp görsen olmazmı?
WAC1 değeri WORD olarak tanımlanmış.
AC1 = (wAC1.HighByte<<8) + wAC1.LowByte 
şeklindeki satıra hiç gerek yok ki. WAC1 değeri zaten word olarak okunuyor. Dİrek AC1=WAC1 yazılsa aynı işi yapacak yada direk oraya WAC1 yerine AC1 yazılsa okuma satırına diğerlerine hiç gerek kalmayacak.
Yani programı Basic bilmeyen birisi yazmış nasıl yazmış anlamadım ama bir sürü lüzumsuz satır mevcut.

Ete


Dtmf

Ete hocam gunaydin.bu sensor isimi gorurmu  sizin bildiginiz bi sensor modul varsa paylasirmisiniz
TRY 21.97  10%OFF | LPS331AP Hassas Pnömatik Mukavemet Atmosferik Basınç Modülü Değiştirin MS5611
https://s.click.aliexpress.com/e/b15PS4ZS

ete

#29
Bu sensör nispeten daha iyi gibi ancak bir çok olumsuz yönü var.
Birincisi kılıf çok problemli. Alttan bacakları var ve sıcak hava tabancası ile lehimlemek lazım ki çoğu zaman amatör işlerde bu tip kılıflar sorun çıkartıyor. hazır kart alınabilir ancak. Data sheete baktım çok karmaşık. Çözmek için 7-10 gün uğraşmak gerek.
Bence bunuda alma.
Sana gerçekte yükseklik sensörü mü yoksa hava basıncını ölçecek sensörmü gerekli acaba? tam olarak ne için bir sensör aradığını söylersen belki aklıma bir şey gelir. Geçmişte hava basıncını ölçen projeler yapmıştım. Ama çok zaman geçti ve ne sensörü kullandığımı unuttum.  Kullanman gereken sensör sana direk okunacak değeri vermeli işin içine hesap girince her şey allak bullak oluyor. Bu sensörde de referans bilgileri var. Bunlar alınıp hesaplamada kullanılıyor. Bu tür sensörler çok profesyonel amaçlar için üretiliyorlar. Daha basit olan sensörleri kullanman gerekir bence.

MPX4115 (motorola) sensörü atmosferik basınç ölçme (barometre) için uygun bir sensör. Çıkışı 0,2V - 4,8V aralığında ve 15-115 Kpa yada 150 mbar - 1150 mbar  aralığını ölçebilenbir sensör. Kullanımı kolay hesabı kolay. Fiyatı biraz yüksek ama yapacak bir şey yok.

Ete

Powered by EzPortal