8 Kanal Amper okuma..

Başlatan onurinci, 09 Mayıs 2026, 20:34:48

onurinci

Hocam selam.
8 adet kanalı anı anda Amper cinsinden okumam gerekti ilk olarak 8 BIT yapabildim 10 BIT olsa daha güzel olur.

kutularda eskiden kalma bir Adet 16F877A buldum ve bir şeyler karaladım sonuçta çalıştı.

portatif güneş pillerinden gelen veriyi topluca göstermek niyetim.

1) Amper cinsinden nasıl hesaplanır ?
güneş pilleri 3 Amperlik benim bir sabit akım kaynağım var 1 amper ile sınırlı.

ekrana nokta nasıl konuyor unutmuşum . örnek 1.25A amper cinsinden eğer olabiliyor ise 1.250A gibi daha bilgi sahibi olabilirim.

2) ekranda atıyorum 255 değeri görüyorum .bu değer aşağılara örnek 10 sayısına inince menü öteleniyor. menüdeki ch yazan kanal bilgileri mıh çakmış gibi durabilirmi ?

3) ekranda rakamlar hızlı değişince bazen bataryayı söksem bile rakam kalabiliyor. ekranı sil komutu verince düzeliyor ama ekran öyle bir titriyorki okunmaz hale geliyor.

saygılar..

DEFINE OSC 20

	#CONFIG
	  __CONFIG _HS_OSC & _WDT_OFF &_PWRTE_ON & _CP_OFF
	#ENDCONFIG
	 
	TRISA= %11111111 : PORTA= 0 : CMCON= 7
	TRISB= 0 : PORTB= 0 : OPTION_REG.7= 1
	TRISC= 0 : PORTC= 0
	TRISD= 0 : PORTD= 0
	TRISE= %00000111 : PORTE= 0
	ADCON0=%10000000 : ADCON1=%10000000
	 
	DEFINE ADC_BITS 10 	    '  
	DEFINE ADC_CLOCK 2 	    ' 
	DEFINE ADC_SAMPLEUS 20  '  
	 
	DEFINE LCD_DREG PORTD
	DEFINE LCD_DBIT 0
	DEFINE LCD_RSREG PORTD
	DEFINE LCD_RSBIT 5
	DEFINE LCD_EREG PORTD
	DEFINE LCD_EBIT 4
	DEFINE LCD_BITS 4
	DEFINE LCD_LINES 4
	DEFINE LCD_COMMANDUS 2000
	DEFINE LCD_DATAUS 50
	 
	A VAR WORD
	B VAR WORD
	C VAR WORD
	D VAR WORD
	E VAR WORD
	F VAR WORD
	G VAR WORD
	H VAR WORD
	 
	AdVal_1 VAR WORD
	AdVal_2 VAR WORD
	AdVal_3 VAR WORD
	AdVal_4 VAR WORD
	AdVal_5 VAR WORD
	AdVal_6 VAR WORD
	AdVal_7 VAR WORD
	AdVal_8 VAR WORD
	 
	Pause 350
	 
	START: ; - - - - - - - - - - - - - - -
	 
	    
	ADCIN 0, AdVal_1              ; A0 CH ADC Veri Oku
	ADCIN 1, AdVal_2              ; A1 CH ADC Veri Oku
	ADCIN 2, AdVal_3              ; A2 CH ADC Veri Oku
	ADCIN 3, AdVal_4              ; A3 CH ADC Veri Oku
	ADCIN 4, AdVal_5              ; A4 CH ADC Veri Oku
	ADCIN 5, AdVal_6              ; A5 CH ADC Veri Oku
	ADCIN 6, AdVal_7              ; A6 CH ADC Veri Oku 
	ADCIN 7, AdVal_8              ; A7 CH ADC Veri Oku 
	 
	                                    ; Bilgiyi AdVal Değişkenine at
	 
	A= (AdVal_1 */7508)/100                ; Voltaj Cinsinden Yazılır
	B= (AdVal_2 */7508)/100                 ; Voltaj Cinsinden Yazılır
	C= (AdVal_3 */7508)/100                 ; Voltaj Cinsinden Yazılır
	D= (AdVal_4 */7508)/100                  ; Voltaj Cinsinden Yazılır
	E= (AdVal_5 */7508)/100              ; Voltaj Cinsinden Yazılır
	F= (AdVal_6 */7508)/100              ; Voltaj Cinsinden Yazılır
	G= (AdVal_7 */7508)/100              ; Voltaj Cinsinden Yazılır
	H= (AdVal_8 */7508)/100              ; Voltaj Cinsinden Yazılır
	 
	 
	'   LCDOUT $FE, 1 ekranı çok titrettiyor , kullanma
	    LCDOUT $FE,$80,"Ch1 :",DEC1 a/100,",",DEC2 A//100,"  Ch2 :",DEC1 B/100,",",DEC2 B//100 
	    LCDOUT $FE,$C0,"Ch3 :",DEC1 C/100,",",DEC2 C//100,"  Ch4 :",DEC1 D/100,",",DEC2 D//100
	    LCDOUT $FE,$94,"Ch5 :",DEC1 E/100,",",DEC2 E//100,"  Ch5 :",DEC1 F/100,",",DEC2 F//100
	    LCDOUT $FE,$D4,"Ch7 :",DEC1 G/100,",",DEC2 G//100,"  Ch8 :",DEC1 H/100,",",DEC2 H//100
	    PAUSE 100
	    GOTO START
	 END
 

mehmet

Hanelerinizi dört hane olarak hesaplayın. Ekrana yazdırırken formatı düzenlersiniz. #.##A(veya #.###A) olarak belirlersiniz.
Ekranda bu ilgili haneleri değiştitseniz ekranı tamamen silmenize gerek kalmaz.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
http://www.mehmetbilgi.net.tr
CC BY

ete

#2
Onur,

Sorularına sırası ile yanıt vermeye çalışayım. Ancak bazı kusurlar nedeni ile programı en baştan ele alarak yürümekte yarar görüyorum.
Öncelikle sigorta ayarlarından başlayalım. Osilatör tanımlamasını XT_OSC olarak yapmışsın ama bu tanımlama 1-8 Mhz için geçerli olup 20Mhz OSC için doğru tanımlama HS_OSC olacak.
#CONFIG
  __CONFIG _HS_OSC & _WDT_OFF &_PWRTE_ON & _CP_OFF
#ENDCONFIG

Daha sonra ADCON0 ve ADCON1 değerlerini tespit ediyoruz. Referans noktamız elbette Data Sheet. Orada 20Mhz osc değeri için Tad değeri Fosc/32 olması gerektiği belirtiliyor. Buna karşılık gelen ADCS2:ADCS1:ADCS0 değerleri %010 şeklinde verilmiş. ADCS2 biti ADCON1 registerinde yer alıyor diğer ikisi ise ADCON0 registerinde bu nedenle ADCON0=%10000000 değerini ve ADCON1=%10000000
bu tanımlamalar 10 bit ADC okuması yapabilmemiz için seçilmiş oldu.

Şimdi 10 bit adc okuma yapılabilmesi için programın başına birkaç define satırıda eklememiz gerekiyor.

DEFINE ADC_BITS 10     ' ADCIN resolution  (Bits)
DEFINE ADC_CLOCK 2     ' ADC clock source  (Fosc/32)
DEFINE ADC_SAMPLEUS 20 ' ADC sampling time (uSec)

Bu da tamamlandıktan sonra ADC okumada kullanılan değişken tanımlamamızı Byte'dan WORD e çevirmek de gerekiyor.

ADVAL_1   VAR  WORD
ADVAL_2   VAR  WORD
ADVAL_3   VAR  WORD
ADVAL_4   VAR  WORD
ADVAL_5   VAR  WORD
ADVAL_6   VAR  WORD
ADVAL_7   VAR  WORD
ADVAL_8   VAR  WORD

Şimdi artık işin okuma ve hasp kısmına geçebiliriz.
Güneş panellerin maksimum 3 amper verebildiğine göre okunacak akımında maksimum 3A olarak hesaplanmasında yarar var. Farklı bir akım değeri için hesaplamaları kullanarak değiliklik yapabilirsin.
Bu noktada okuduğumuz maksimum akımı 3 değilde küsuratlarıda düşünerek 300 olarak hesaplamakta yarar var. Sonuçta  okunan maksşmum akımı ekrana 3,00 Amper şeklinde vereceğiz.

Bildiğin üzere ADC den akounabilecek makismum değer 1023 değeri olacaktır. Bu değer ADC girişine verilen maksimum 5V ta karşılık gelen değerdir. Yani akım okuma devren çekilen 3A akıma karşılık ADC girişine 5V vermelidir. Bunu Şönt diren+Opamp ikilisi ile ayarlamak çok değil bu konuya girmeyeceğim.

Şimdi diyelimki ADC 0 girişine 5V giriyor ve sende buna karşılık 1023 değerini okuyorsun. Bunun 300 olarak hesaplanması için aşağıdaki yolu izleyeceğiz. Amacımız 32 bitlik hesap parametresi olarak (*/ kullanarak) bir sabit çarpan elde edebilmek.
300/1023=0,293255132
0,293255132 x 256 = 75,07331378 '(*/ parametresi bize 256 ya bölünmüş sonucu vereceği için 256 ile çarpıyoruz)
75,07331378 * 100 = 7507,331378  'Sonucun çözünürlüğünü artırabilmek için bu değeri 75 olarak değil de 7507 olarak kullanabilmek için 100 ile çarpıyoruz.
Ancak 7 den sonraki küsürat değerlerinide işleme sokabilmek adına 7 rakamını 8 olarak kullanacağız. Bu durumda sabit çarpan değerimiz 7508 olarak hesaplanmış oldu.
Şimdi bunu kullanabilmek amacı ile hesap formülümüzü oluşturalım.

A=(ADVAL_1 */7508)/100
 

işte bu formül bize akım değerinin 100 ile çarpılmış halini verecektir.
Bu bir PBP da 32 bit matematik işlemi olup aynı sonucu normal matematik ile aşağıdaki şekilde hesaplayıp görebiliriz.
A=((1023 x 7508)/256)/100 =300  yada  A=((ADVAL_1 x 7508)/256)/100

Bu formülü diğer ADVAL_x değişkenleri içinde uygulamak gerekir. Onu sen yaparsın artık.
Şimdi akım gösterim işine bakalım.
Bunu daha net görebilmek adına ADC-0 kanalındna okuduğumuz değerin 427 olduğunu varsayalım.
A=((427 x 7508)/256)/100=125 şimdi bu değeri ekranda 1,25 A olarak nasıl göstereceğiz ona bakalım.
Bu değeri 100 e bölersek 1 rakamını elde edeceğiz Bu bizim Amper cinsinden tam sayı değerimiz olacaktır.
125 rakamını 100 bölüp kalanını alır (MOD işlemi) isek hesaplanan değer 25 olacaktır. Gerisi artık çok kolay aşağıdaki şekilde,
LCDOUT $fe,$80,"Akım-1=",dec1 (A/100),",",dec2 (A//100),"Amp"
Bu satır bize 125 değerinin ekranda 1,25 Amp şeklinde görülmesini sağlayacaktır.

Hepsi bu kadar umarım anlaşılır açıklamalarım. Anlaşılmayan hususlar için yeniden soru sorabilirsin.

Ete

EDIT: Yüklediğin kodları kaldırıp oraya doğru programı yükledim. Oraya da bakabilirsin.

onurinci

Hocam bu satırı LCD satırınla değiştirdiğimde Sytax Error mesajı verip derleme duruyor.

LCDOUT $fe,$80,"Akım-1=",dec 1 (A/100),",",dec2 (A//100),"Amp"

acaba sizde derleyebilirmisiniz ?

ete

Dec 1 yerine DEC1 (1 rakamı komuta bitişik olacak arada boşluk olmayacak.)

Ete

onurinci

HOCAM LCD Ekran boyutunu aşıyor galiba


LCDOUT $fe,$80,"CH-1=",dec 1 ,(A/100),",",dec2 (A//100),"A" ,"CH-3=",dec 1 ,(B/100),",",dec2 (B//100),"A"

LCDOUT $fe,$C0,"CH-3=",dec 1 ,(C/100),",",dec2 (C//100),"A" ,"CH-4=",dec 1 ,(D/100),",",dec2 (D//100),"A"

LCDOUT $fe,$94,"CH-5=",dec 1 ,(E/100),",",dec2 (E//100),"A" ,"CH-6=",dec 1 ,(F/100),",",dec2 (F//100),"A"

LCDOUT $fe,$D4,"CH-7=",dec 1 ,(G/100),",",dec2 (G//100),"A" ,"CH-8=",dec 1 ,(H/100),",",dec2 (H//100),"A"







ete

    LCDOUT $FE,$80,"Ch1 :",DEC1 a/100,",",DEC2 A//100,"  Ch2 :",DEC1 B/100,",",DEC2 B//100 
		    LCDOUT $FE,$C0,"Ch3 :",DEC1 C/100,",",DEC2 C//100,"  Ch4 :",DEC1 D/100,",",DEC2 D//100
		    LCDOUT $FE,$94,"Ch5 :",DEC1 E/100,",",DEC2 E//100,"  Ch5 :",DEC1 F/100,",",DEC2 F//100
		    LCDOUT $FE,$D4,"Ch7 :",DEC1 G/100,",",DEC2 G//100,"  Ch8 :",DEC1 H/100,",",DEC2 H//100
		    PAUSE 100
Şeklinde 4x20 ekrana tam sığıyor.

Ete

onurinci

Hocam harikasınız ... bir mini sorum daha olacak piyasadan 5 amperlik ACS712 sensor aldım fakat daha hiç bir şey ölçmeden direkt 2.5 volt çıkarıyor, artık OpAmp ile offseti almaya çalışacağım. siz daha evvel bu sensör ile çalışma yaptınızmı ?

mehmet

Çift yönlü ölçüm yapar. Akım geçmezken vcc/2 verir. Vcc 5V olduğunu varsayalım; (mesela)artı yönde 0.0V - 2.49V, eksi yönde 2.5V - 5.0V gerilim ölçeriz. Kataloğunda akım - gerilim çevrim oranı bulunur. Buna göre hesap yaparsınız.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
http://www.mehmetbilgi.net.tr
CC BY

ete

BU sensör ile bir çok kez çalıştım. Mehmet açıklamış zaten. Boşta sıfır akım çekiliyor iken 2,5V verir. Sensörü bağladığınız yer bağlı olarak (akım yönü seçimi) ya 2,5-5V arası voltaj verir yada 0-2,5V arası voltaj verir. Voltaj değeri çekilen akıma eş değer olarak değişir ama aralık daima 0-2,5V veya 2,5-5V aralığındadır Bu durumda sensör akımının karşılığı 2,5V olacaktır. Hesaplama işinde absolute değer kullanırsanız yönden etkilenmezsiniz. AKIM=ABS(512-Okunan) şeklinde.
Yada programa bir iki satır eklemek gerekebilir şöyle;
Okunan 512 den büyük ise Okunan=(Okunan-512)  , okunan 511 den küçük ise Okunan=512-Okunan) şeklinde.
Hesap işi de zor değil. 5A lik sensör için  (500/511)*256=250,4 bunu 2505 şeklinde kullanıp sonucu 10 a bölmek gerekir. Formül  Akım=(ABS(Okunan-511)*/2505)/10
Örnek vereyim okunan 800 olsun. Gerçek Okunan 800-512=288 ve ((288 x 2505)/256 )/10=2,82 A şeklinde hesaplanabilir. Çıkan sonuç aslında 282 dir önceki örnekte uyguladığımız şekilde 100 e bölüp akım tam sayı kısmını ve Mod100 yapıp ondalık kısmını hesaplayabiliyoruz.

İyi bir sensördür. Ancak PCB üzerinde sensöre geliş ve sensörden çıkış hatlarının yeterince kalın olmasına dikkat etmek gerekir. Aksi halde bakır kanalların direncinide ölçüme eklemiş olursunuz.

Ete

onurinci

akşam ACS712-5 ile nasıl çalışırım diye sordum.bana bir program verdi. ama bana pek verimli gelmedi,

10BIT çözünürlüğü mecburen ikiye bölüp heba oluypr 512 bit .çünki ben tek yönlü kullanıyorum. çözünürlük heba olduğu için adımlar arası kabalaşıyor, şöntü içinde 3 Amperlik MAX471'in varlığından haberdar oldum, bu gün temin edebilirsem denemek istiyorum,

AI örneği..
DEFINE OSC 20
#CONFIG
#LIST_16F877A
 __CONFIG _HS_OSC & _WDT_OFF &_PWRTE_ON & _CP_OFF
#ENDCONFIG

' --- Port ve ADC Ayarları ---
TRISA= %11111111 : PORTA= 0 : CMCON= 7
TRISB= 0 : PORTB= 0 : OPTION_REG.7= 1
TRISC= 0 : PORTC= 0
TRISD= 0 : PORTD= 0
TRISE= %00000111 : PORTE= 0

ADCON1=%10000000 ' 10-bit sağa dayalı

DEFINE ADC_BITS 10     
DEFINE ADC_CLOCK 3     
DEFINE ADC_SAMPLEUS 50 

' --- LCD Ayarları ---
DEFINE LCD_DREG PORTD
DEFINE LCD_DBIT 0
DEFINE LCD_RSREG PORTD
DEFINE LCD_RSBIT 5
DEFINE LCD_EREG PORTD
DEFINE LCD_EBIT 4
DEFINE LCD_BITS 4
DEFINE LCD_LINES 4

' --- Değişkenler (MUTLAKA TANIMLI OLMALI) ---
ADVAL     VAR WORD  
FARK      VAR WORD  
AMPER     VAR WORD  
CH        VAR BYTE  ' Bu eksik olduğu için hata veriyordu

Pause 500
LCDOUT $FE, 1

START:
    FOR CH = 0 TO 7
        ADCIN CH, ADVAL
        
        ' ACS712-05B için 2.5V (0 Amper) 512 birimdir.
        IF ADVAL > 512 THEN
            FARK = ADVAL - 512
            
            ' Çözünürlüğü yapay olarak artırmak için farkı 100 ile çarpıyoruz.
            ' 16-bit sınırını aşmamak için (189 * 100 = 18900) uygundur.
            ' 5 Amper için katsayımız (500 / 189) * 100 = 264 civarıdır.
            AMPER = (FARK * 264) / 100
        ELSE
            AMPER = 0
        ENDIF

        ' --- LCD Yazdırma (Koordinatlı) ---
        SELECT CASE CH
            CASE 0: LCDOUT $FE,$80,"C1=",DEC1 (AMPER/100),".",DEC2 AMPER,"A"
            CASE 1: LCDOUT $FE,$8B,"C2=",DEC1 (AMPER/100),".",DEC2 AMPER,"A"
            CASE 2: LCDOUT $FE,$C0,"C3=",DEC1 (AMPER/100),".",DEC2 AMPER,"A"
            CASE 3: LCDOUT $FE,$CB,"C4=",DEC1 (AMPER/100),".",DEC2 AMPER,"A"
            CASE 4: LCDOUT $FE,$94,"C5=",DEC1 (AMPER/100),".",DEC2 AMPER,"A"
            CASE 5: LCDOUT $FE,$9F,"C6=",DEC1 (AMPER/100),".",DEC2 AMPER,"A"
            CASE 6: LCDOUT $FE,$D4,"C7=",DEC1 (AMPER/100),".",DEC2 AMPER,"A"
            CASE 7: LCDOUT $FE,$DF,"C8=",DEC1 (AMPER/100),".",DEC2 AMPER,"A"
        END SELECT
    NEXT CH

    PAUSE 150 
GOTO START
END

onurinci

hocam selam , sizin verdiğiniz program ile güneş panel monitörümü tamamladım, harika çalışıyor.

en son bıraktığım proogramı AI'ye yazdırdım. ACS712-5 5 Amperlik sensöre göre .5 Amperden sonra 0'dan tekrar ölçmeye başlıyor.bir hesaplama hatası olduğu bariz. belki ben yeterli done'leri düzgün veremedim.AI'nin yaptığı hatayı öğrenmek isterdim. boş bir vaktinizde bakarsanız sevinirim..

ete

Programın işe yaradığına sevindim. Tebrik ederim.
AI nin programında formül hatalı. (189) sayısını nerden buldu anlamadım.
Basit örnek yapmak gerekir ise full akım çekildiğinde okunacak değer 1023 olacaktır.
Formüle uygular isek ,
Amper=((1023-512) *264)/100 = 1349 şeklinde bir sayı çıkıyor ki, normalde bunun 500 çıkması gerekir idi.

Ete

mehmet

#13
ACS712 5A sensör; 185mV/A,
5 x 185 = ±925mV,
(1023 x 925mV) / 5000mV ≈ 189 adc değeri.

Örneğin:
-5A - 0A için okunacak değerler: 323 - 511,
0A - +5A için okunacak değerler: 512 - 701 adc değeri okuyabiliriz.

2500 - (189 x (5000 / 1023)) ≈ 1576mV
2500 + (189 x (5000 / 1023)) ≈ 3423 mv

5000mA / 189 ≈ 26,455 x 100 ≈ 26455 (264 değil)

Buna göre yeniden düzenleyiniz.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
http://www.mehmetbilgi.net.tr
CC BY

ete

Şimdi rakamlar daha iyi anlaşılıyor. Anlaşılan bende unutmuşum sensör özelliklerini.
Her neyse sensörün akım kapasitesine bağlı olarak Amper başına verebildiği voltaj değişiyor. Amaç da zaten akım kapasitesi ne olursa olsun 2V sınırı içerisinde bir çıkış voltajı üretmek olsa gerek.
5 Amperlik sensör amper başına 185 mv üretiyor imiş. Bu durumda 5A için çıkış voltajı maksimum ;
5 x 185 =925 mv olacaktır.
Akım yönüne bağlı olarak 0-189 veya 511+189=700 değeri ADC kanaından okunacaktır.
Fark daima 189 olacağından buna ait oluşturacağımız formül şöyle olmalı;
(500/189)*256 = 678 (gerçekte 677 küsür çıkan bu değeri 678 olarak kullanıdık)
AKIM=(ABS(Okunan-511)*/678) bu bzim nihai formülümü olacak ve hemen sağlamasını yaparsak;
AKIM=189*/678= 189 * 678/256 =500 değerini bulmuş oluruz.
Gerisi ekran komutları olacak.

Bu arada farklı akım kapasiteleri için formülleride oluşturayım ,
20A için data sheet Volt başına 100 mv çıkış göstermiş. Bu durumda maksimum akım karşılığında sensörden okunan voltaj 20 x 100=2000mv = 2V olacak ve bunun ADC karşılığı ise ,
(2 x1023)/ 5=409 olacaktır. Bu durmda formülümüz;
(2000 /409)*256 =1252
Fark=ABS(Okunan-511)
AKIM=FARK */ 1252

30 A için birim amper başına 66mv ve toplam 30 x 66=1980 mv olacaktır. Bunu ADC karşılığı ise ;
(1,98 x 1023)/5=405 . Formülümüz;
(3000/405)*256 =1897
Fark = ABS(Okunan-511)
AKIM=FARK */ 1897

Ete

Powered by EzPortal
▲