Hall Effect Yardımı ile Akım Ölçmek

Başlatan solidus, 16 Eylül 2013, 21:17:38

solidus

http://www.panucatt.com/Current_Sensor_for_Arduino_p/cs-100a.htm

http://files.panucatt.com/datasheets/cs50_100_200a_datasheet.pdf

Birinci linkte genel özellikleri, ikinci linkte datasheet i gösterilen sensorü kullanarak bir sistemin çektiği alımı ölçmeyi planlıyorum. Sensör 100 Ampere kadar ölçüm yaparak, her amper başına 20 mV üretmektedir. (Akım sıfırken besleme voltajının yarısı kadar voltaj üretiyor.) Kendi projemde maksimum 60 Ampere kadar ölçüm yapmayı umuyorum. Ancak kafamı karıştıran bir sorun var. Üreticinin yayınladığı datasheet te yer alan kod parçacığı ile;
Vout connected to ADC1, Vcc=5v
Current = ((analogRead(1)*(5.00/1024))- 2.5)/ .02
şeklinde. Üreticinin kodları ile 16f877 adc sine bir türlü okuma yaptıramadım.. Nedeni ne olabilir merak ediyorum.. Yardımcı olabilecek arkadaşlarla bu konuyu çözmek istiyorum.. saygılarımla..

Not: Kendi kodlarımı protonda yazacağım. Konuyu o yüzden buraya açtım.
Kimine göre kralım kimine göre yalanım… Herkes rahatına baksın, ben adamına göre adamım..

drmp

1A   =    20 mV  cihaz hassasiyeti

100A  =  2000mV   =  2V  maksimum ölçüm değeri

2/100=   0,2 gerekli olan çevirme katsayısı

5/1024  = 0,0048V/bit     1 bite tekabül eden volt

amper =  (adc * 5/1024) /0,02      fakat -2.5 değeri  sonucu  değiştiriyor , sonuc (--)  çıkmakta  bu yüzden
1. kullandığın değişken  negati değer alabilmeli     
2. devreden akım geçerken adc girişinde  Volt olarak alakalı (yaklaşık) bir değer görmen gerekir 
3. - 2,5 değerini ortadan kaldırım deneme yanılma yoluyla rahatça okuman okuma yapabilirsin

kolay gelsin







solidus

#2
Alıntı Yap
amper =  (adc * 5/1024) /0,02      fakat -2.5 değeri  sonucu  değiştiriyor , sonuc (--)  çıkmakta  bu yüzden

ADC hesaplamasında herhangi bir hata yok.. Ancak sensör 0 amperde yani hiç akım çekilmezken 2,5 volt üretiyor, dolayısıyla 2,5-5,0 aralığında amper başına 20 mV üretiyor.. formüldeki "-2,5" bu yüzden konulmuş. Formül içerisinde değil de hesaplanan değerden 2,5 çıkarsam işe yarar mı ?
Kimine göre kralım kimine göre yalanım… Herkes rahatına baksın, ben adamına göre adamım..

drmp

sensor 0A 'de2.5 volt veriyor ise  şöyle yapalım   adc ham değerinden  2.5 Volta tekabül eden değeri çıkarsan da olur 
8 bit için 128   10 bit için 512  değerlerini akım yönüne göre ekleme yada çıkarma işlemi yeterlidir

kolay gelsin....

ete

Verilen formül Proton 'a iki şekilde adapte edilebilir.
Birincisi mantık hesabı;

AKIM=(ABS((HAMADC+1)-512)*/625)/10

Burada 625 sayısını nasıl bulduk açıklayayım. Amper başına 20mv veren bir sistemde 100A de vereceği çıkış 2 volt olacaktır. Pozitif yönde bu akımı devreden çekersem sensör 2,5V+2V=4,5V çıkış verecektir. Bunun ADC karşılığı 921 dir. Diğer taraftan sensör boşta iken 2,5V vereceğine göre bunun ADC karşılığı ise 511 dir. O halde 921 den 511 çıkartırsam bana net 100A karşılığı okunan ADC değerini verir.
Bu ise 410 dur. Bu durumda sabit çarpanımız 100/410 dur. Yani  0,244 rakamıdır. Bunu Basic matematiğinde kullanabilmek için virgülden kurtarıyorum. 0,244 * 256=62,46 olan değeri 625 olarak kullanıyorum ve sonucu en sonda 10'a bölerek eşitliği bozmamış oluyorum.
Çekilen akım her iki yönde olacağı için pozitif yönde ADC değeri 511 ile 921 arasında bir değer alacaktır. Negatif yönde ise 0-511 arasında bir değer alacaktır. Hesabı yönden bağımsız yapabilmek için ABS operatörünü kullandık.
Bu arada bilmeyenler için söyleyeyim Basic matematiğinde   */   operatörü işlemi 32 bit yapıp ortadaki 16 bitlik kısmı bize sonuç olarak verir. Bu ise hesaplanan değeri 256 ya bölmek anlamına geliyor. Bu nedenle sabit çarpan hesabında küsuratlı sayıyı önce 256 ile çarptık. Böylece eşitlik yine bozulmamış oldu.

İkincisinde ise verilen formülü aynen Basic matematiğine uyarladık.

AKIM=ABS(((HAM+1)*/125)-250)/2

Burada kullanılan sabit çarpan 125  sayısı şöyle hesaplandı;
5/1024=0,0048828125   bu sayıyı virgülden kurtarmak için 0,0048828125 * 256 =1,25 buluyoruz. Bu sayıyı ise 125 olarak kullanıp formül içindeki diğer elemanlarıda 100 ile çarpıyoruz. Bu nedenle 2,5 sayısı 250 , 0,02 sayısı ise 2 olarak kullanıldı.
Her iki formülde doğru sonucu verecektir.

Proton da Float değişken kullanmak mümkün olduğundan gerekirse formüller float değişkene göre adepte edilebilir.

Ete


Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

Maxim

bu koduda bir deneyin

Dim Akim As Float

Akim=ADIn 0
Akim=(Akim * 5.0) /1023
Akim=(50 * Akim) - 125

solidus

Float_Display_Type = Fast diye birşey de varmış. Daha önce hiç görmemiştim. Sevgili ETE.. Cevabınızı ders notu niteliğinde arşivledim. Çok teşekkür ederim. Arkadaşlar, yardımlarınız doğrultusunda tek yönde akım ölçecek kod şu şekilde oluştu inceleyip fikirlerinizi iletirseniz sevinirim.:
Float_Display_Type = Fast' Hızlı ve daha doğru değer alabilmek için (Kayar Nokta Gösterge Kütüphanesi)
Dim HAM  As Word    'ADC'den elde edilen ham değer
Dim AKIM As Float
Dim VOLT As Float
Dim HVD  As Word   'Hesaplanan Voltaj Değeri

BASLA:
HAM =ADIn 0
DelayMS 10

HVD =(HAM+1)*/125 'Hesaplanan voltaj Değerini gözlemek için konuldu. 
VOLT= HVD/100        'Orijinal yazılımda olmayacak.

AKIM=Abs(((HAM+1)*/125)-250)/2
If HAM <= 511 Then AKIM = 0

Print At 1,1,"VOLT =",Dec VOLT
Print At 2,1,"AMPER=",Dec AKIM
Print At 3,1,"HAM  =",Dec HAM,"  "
Print At 4,1,"HVD  =",Dec HVD,"  "
GoTo BASLA
End
Kimine göre kralım kimine göre yalanım… Herkes rahatına baksın, ben adamına göre adamım..

OG

#7
Akım 0 iken 2,5V vermesinin sebebi şu,
DC akım ölçerken akan akımın yönüne göre ya 2,5V'un üstünde, ya da 2,5V'un altında deger alırsın. Yani senin sıfır noktan 2,5V. Yani akımın hangi yönde aktığı bilgisine de sahip oluyorsun.

Ölç, ölçülen değer;
2,5V'un üstünde ise Akım x yönündeölçtüğünden 2,5V u çıkar, eldeki değere göre 1A/0,02V oranına uyarlayıp akımı hesapla
2,5V'un altında ise Akım y yönünde, 2,5V dan ölçtüğünü çıkar, eldeki değere göre 1A/0,02V oranına uyarlayıp akımı hesapla

10 bit için 2,5V => 1023/2
8 bit için 2,5V => 255/2

Bukadar.
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

ete

Tavsiye olarak akımın sıfır olma durumunu bir aralık şeklinde belirleyin. Bu tür sensörlerde gerek devre beslemesi ve gerekse sensör karekteristiği nedeni ile akım çekilmediği durumlarda her zaman net 2,5V alınamıyor. Genellikle ADC karşılığı olarak 506-517 aralığında değerler okunabiliyor.
Bu nedenle sıfır olma halini bu aralığa oturtmanız daha uygun olacaktır.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

Maxim

artı-eksi 100amper için kod
yanlız ete ustanın formül daha az yer kaplıyor.

Device 16F877A
Xtal 4

Config CP_OFF,DEBUG_OFF,CPD_OFF,LVP_OFF,BODEN_ON,PWRTE_ON,WDT_OFF,XT_OSC

TRISA=%000001
TRISB=%00000000
TRISC=%00000000
CMCON =7
ADCON0=%10000101
ADCON1=%10000010

Declare LCD_DTPin PORTB.4
Declare LCD_RSPin PORTB.2 
Declare LCD_ENPin PORTB.3 
Declare LCD_Interface 4
Declare LCD_Lines 2

Declare Adin_Res 10
Declare Adin_Tad FRC
Declare Adin_Stime 50

Dim Akim As Float

LOOP:

Akim=ADIn 0
Akim=(Akim * 5.0) /1023

If Akim<0.5 Then Akim=0.5
If Akim>4.5 Then Akim=4.5

Akim=(50 * Akim) - 125

Print At 1,1,"AMPER:",Dec1 Akim,"  "
GoTo LOOP

solidus

Yardımlarınız için çok teşekkür ederim arkadaşlar. ETE arkadaşımızın kodları ile ufak tefek değişiklikler yaparak sorunu çözdüm. Sensör tek yönlü okuma yapacağı için "0" değerini belirledikten sonra geriye hiç bir sorun kalmadı..
Kimine göre kralım kimine göre yalanım… Herkes rahatına baksın, ben adamına göre adamım..

isikyasar

Konuya açıklık getiren hocalarıma tekrar tekrar teşekkürlerimi sunuyorum.