avatar_elektro77

3.7-4.2 Volt pil şarj seviyesi ölçümlerinde Standart bir ADC formülü üretme

Başlatan elektro77, 13 Aralık 2023, 14:25:59

elektro77

18650 pili veya 3.7-4.2 volt aralıklı pil çeşitlerini birçok projemde kullanıyorum.
Son projemde ise, cep telefonlarındaki gibi bir batarya işareti karakteri üreterek lcd ekranda doluluğu göstermeye çalıştım.
Fakat karakterin kareleri aşağı yukarı sürekli oynuyor.
Bunun sebebinin 3.7 ile 4.2 arasınının adc ölçüm çözünürlüğünün çok düşük olduğundan kaynaklandığını biliyorum.
Aslında çok uzattım ve sorum şu;
Ben 3.7 volt ile 4.2 volt arasındaki bu 0.5 voltluk kısmının adc ölçümünü 10bit te 1023 değerine yaymak ve çözünürlüğü artırmış olarak ölçmek istiyorum.
Bunun standart formülü PBP de ne olmalı.
Kullandığım kodlar aşağıda:
LCDOUT $FE,$40,14,31,31,31,31,31,31,0        '%100 BATARYA 0
LCDOUT $FE,$48,14,17,31,31,31,31,31,0        '%70 BATARYA  1
LCDOUT $FE,$50,14,17,17,31,31,31,31,0        '%50 BATARYA  2
LCDOUT $FE,$58,14,17,17,17,31,31,31,0        '%30 BATARYA  3
LCDOUT $FE,$60,14,17,17,17,17,31,31,0        '%10 BATARYA  4
LCDOUT $FE,$68,14,17,17,17,17,17,31,0        '%0  BATARYA  5
'------------------------------------------------------------

BASLA:

GOSUB ADC_OKU


goto basla
'----------------------------------------------------------
ADC_OKU:
ADCIN 0,HAM:PAUSE 10               

IF HAM>420 AND HAM<1023  THEN '4.2V-4.15V arasında ise(1k+1k gerilim bölücüden geçiyor. Yarı olacak) 
lcdout $FE,$8F,0
ENDIF
'IF HAM>415 AND HAM<420  THEN  '4.15V ve 4.00V arasında ise
'lcdout $FE,$8F,1
'ENDIF 
IF HAM>410 AND HAM<420  THEN  '4.00V ve 3.80V arasında ise
lcdout $FE,$8F,2
ENDIF
'IF HAM>387 AND HAM<408  THEN  '3.80V ve 3.70V arasında ise
'lcdout $FE,$8F,3
'ENDIF
IF HAM<410  THEN              '3.70V den düşükse
lcdout $FE,$8F,4
ENDIF

RETURN

end

 
 
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

ete

3,7V pil dolu  kabul edilir. 4.2V şarj esansında ulaşılan en yüksek voltaj değeridir ve pil bu değerde deşarj konumunda fazla kalmaz. Bu nedenle pilin boş kabul edilebileceği 3,0V ile 4,2V aralığını kullanman bance daha doğru olur.

Sorduğun soruyu cevaplayabilmek için ADC ölçümünde kullandığın REF voltajını da bilmek gerekir.
Ancak hemen peşinen söyleyeyim 0,5V gerilim ölçümü 10 bit çözünürlüğe yayılamaz. Sebebi basit.
Bunu yapabilmen için ref voltajın 0,5V olmalı ve ADC girişine gelen en yüksek voltajında 0,5V olmalıdır.

Bana kalırsa asıl sorunun çok sık ADC okuman ve okumalardaki ufak farkları göz ardı etmemen.
Programa bakıyorum da 6 kademeli bir doluluk göstergen mevcut.
O halde 3V ile 4,2V aralığını 6 kademe(0-5) verecek şekilde formüle etmek bence en doğrusu olur.

5V ref voltajı kullanılır ise 3V da 3*1023/5=613
4,2V karşılığında ise 4,2x1023/5=859 okuyacaksın.
859-613=246  o halde 246 senin maksimum değerin olacak ve (5/246)*256*100=~521 senin sabit çarpanın olacaktır.
Okunan Adc değerinden 613 çıkartacaksın ve formülünde SAYI=((HAM-613)*/521)/100 şeklinde olacaktır.
Şimdi hemen deneme yapalım. Diyelimki okuduğun ham değeri 859 buna karşılık gelen sayı,
SAYI=(859-613)*/625)/100=5 çıkacaktır. Bu rakamı direk özel karekter çağırmak için kullanabilirsin.
lcdout $FE,$8F,SAYI
bu şekilde bir sürü if satırından kurtulmuş olursun.
Bu arada okunan ADC değerinin 613 den küçük olabilme ihtimalide var tabiiki. Bu nedenle
ADCIN komutu satırından hemen sonrasına ;
IF HAM<613 then HAM=613 komut satırını eklemen gerekecektir.

Bu sistemde her hangi bir gerilim bölücü kullanman gerekmiyor. İllaki kullanacağım dersen ölçüm değerlerine göre formül yeniden hesaplanması gerekir.

Ete


elektro77

Hocam siz her zaman var olun...İmdadıma yetiştiniz yine! Çok teşekkürler.............
Yanlız bir sorun var;
Batarya 4.2 volt ta iken gösterge boş gösteriyor, batarya boşaldıkça gösterge yükseliyor.
Karakter çağırma adreslerini mi değiştireyim yoksa formülde uygulabilecek basit bir yol var mı?


Edit: En fazla kaç karakter tanımlayabiliyoruz. Adresleri nelerdir Hocam?
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

ete

bir şekilde 4,2V da ADC karşılığı ne ölçülüyor tespit et buraya yaz sonrasına bakalım.
Aslında buraya hem programı hemde şemanı koyman lazım ki neler olup bitiyor görebileyim.
Şimdi kendim bir deneme yapayım dedim ve normal 5V ref ile 4,2V karşılığı gerçekten 859 çıkıyor.
Bunu dediğim şekilde hesaplatınca SAYI değeri 5 çıkıyor ki senin 5 nolu karekterin ne ise onun ekrana gelmesi gerekirdi.

Ete

elektro77

Çalıştırdım Hocam. Karekter adreslerini ters çevirince düzeldi.
Lcd ye en fazla 8 karakter tanımlanabildiğini ise 320volt taki bir dersinizden öğrendim.
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

Dtmf

Iyi aksmlar bisey merak ediyorum ornegin pic18f45k22 ile 3.7v lik bir pil voltaj olcecegiz,ve bu olcumu pic icindeki dahili vref modulu aktif ederek yapacagiz sorum su pic in vref modul aktif edilince AN3 bacagina herhangi bir baglanti yapacakmiyiz bu pin bos mu kalacak.sunu biliyorum 3.7 degilde mesela 7.4 v olcecek isek gerilim bolucu ile 5v gecmeyecek sekilde analog bir pinden pic'e giris yapiyoruz

ete

Dahili Ref voltajını kullanınca AN3 bacağı elbette boşta kalacak. Yada o bacağı başka amaçla kullanabileceksin.
Dahili ref voltajı hiç bir zaman 5V olmayacağı için ,seçenekli olarak 1.024V, 2.048V , 4,096V dan birisini seçmen gerekiyor. Seçim işlemi VREFCON0 registerinden yapılıyor.
Hangi ref voltajını seçersen ADC girişine o voltajdan fazla voltaj gelmemesi için gerilim bölücünü o voltaja göre ayarlamalısın.
Böylece seçtiğin ref voltajı kadar bir voltaj ADC girişine gelirse ölçülecek ADC değeri 1023 olacaktır. Bunuda unutma.

Ete

mehmet

Alıntı yapılan: elektro77 - 13 Aralık 2023, 19:32:13Çalıştırdım Hocam. Karekter adreslerini ters çevirince düzeldi.
Lcd ye en fazla 8 karakter tanımlanabildiğini ise 320volt taki bir dersinizden öğrendim.
Youtube 'de upir kanalında, 8 karakterden
fazlasına ihtiyacımız olduğunda nasıl
çözeceğimizi anlatan videolar bulunmakta.

Örnek:
https://youtu.be/Mq0WBPKGRew?si=IcIb_BTYRDeYrDLI
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
http://www.mehmetbilgi.net.tr

Dtmf

Yardiminiz icin sagolun ete
 hocam yarim bu uygulamayi deneyip sonucunu yazacagim

elektro77

Ete Hocam bu hesaplamalar beni öldürüyor.
Yukarıdaki verdiğiniz kodlarda bir de pil voltajını yazılımımdaki bir menu ekranında desimal olarak göstermek istiyorum. Ama hesaplamayı tutturamıyorum.
örn;
Ham = 859 ise bunu  menü ekranında, 4.19V şeklinde, desimal ve ondalıklı bir voltaj değeri olarak göstermek istiyorum.
Aşağıdaki formül virgülden sonra sadece  1 hane ondalık veriyor, 2 hane ondalık alamıyorum. Nerede eksik yapıyorum.
ADCIN 0,HAM
HAM=HAM+1
Volt=(ham*/1250)/100
Mvolt=volt//10
Volt=Volt/10
LCDOUT $FE,$C0,DEC VOLT,",",DEC Mvolt,"V"
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

ete

Tersine mühendislik uygulamak herzaman faydalıdır.
elde etmek istediğin 4,19 yada 419 değeri. Peki bunu hangi parametreden elde edeceksin?
859 değerinden o halde 419/859=0,487776484  bu sayıyı 256 le çarpıyoruz. 124,87078 buluyoruz.
Belliki küsüratı tam sayıya tamamlamamız gerekecek. o halde bu sayıyı 125 olarak kullanırsak istediğimiz olacak gibi.
(859 x 125)/256 bize ne sonuç verecek bakalım.
tam tamına 419 değerini verecektir.Kullandığın Volt ve MVolt formülleri eşliğinde kullanırsan ekranda doğru değeri göreceksin. Demekki doğru formül (Ham*/125) bize doğru sonucu verecektir.

Olaya birde başka bir açıdan bakalım.
Mevcut sabit çarpanın 1250 ve formül ise Volt=(ham*/1250)/100 şeklinde peki doğrumu bu?
((859 x 1250)/256)/100 = 41,94 (hesap makinesi sonucu bu) pic hesabında sonuç 41 çıkar tamsayı hesabı nedeni ile.
O halde formülün yanlış demektir bu. formüldeki /100 yanlış bunu /10 ile değiştir bakalım ne oluyor.

Bu değişiklik ile sonucun 419 çıkacaktır. O halde doğru formül (Ham*/1250)/10 şeklinde olmalı.
Ama bir tavsiyede bulunayım. Sabit çarpan olan 1250 de sonra yer alan sıfırı pek kullanmak istemeyiz. Çünki o sıfırı oraya koyup sonucu doğrultmak için sonradan birde 10 a bölüyoruz. Onun yerine 125 ile çarpıp hiç bir şeye bölme demek isterim. Yani son durumda formül (Ham*/125) halini almış olacak formül.

ete

elektro77

Yazdıklarınıza göre bir defa daha denedim ve 41,9 olarak göründü.
4.19 u ne yapsam göremiyorum.
Acaba pbp "//" işlemini, yani mod almayı mı algılamıyor. Herhangi bir sürümde böyle bir hata aldığınız oldu mu Hocam.
MENUU:
LCDOUT $FE,$80,"BATTERY LEVEL    "
ADCIN 0,HAM
HAM=HAM+1
Volt=(ham*/125)
Mvolt=volt//10
Volt=Volt/10
LCDOUT $FE,$C0,#VOLT,",",#Mvolt," V"

IF EXXIT=1 THEN BASLA
GOTO MENUU
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

silver_wolf

Alıntı yapılan: elektro77 - 23 Aralık 2023, 18:31:31Yazdıklarınıza göre bir defa daha denedim ve 41,9 olarak göründü.
4.19 u ne yapsam göremiyorum.
Acaba pbp "//" işlemini, yani mod almayı mı algılamıyor. Herhangi bir sürümde böyle bir hata aldığınız oldu mu Hocam.
MENUU:
LCDOUT $FE,$80,"BATTERY LEVEL    "
ADCIN 0,HAM
HAM=HAM+1
Volt=(ham*/125)
Mvolt=volt//10
Volt=Volt/10
LCDOUT $FE,$C0,#VOLT,",",#Mvolt," V"

IF EXXIT=1 THEN BASLA
GOTO MENUU

Selam @elektro77;
Aşağıdaki kodla 4,20 volt okudum. pbpx 3.1.0.1 versiyonuyla // komutunu derledim. Çalışıyor.
Sadece dec 2 kodunu ekledim.
LCDOUT $FE,$C0,#VOLT,",",dec 2, #Mvolt," V"

'****************************************************************
' Set LCD Data port
DEFINE LCD_DREG PORTB
' Set starting Data bit (0 or 4) if 4-bit bus
DEFINE LCD_DBIT 0
' Set LCD Register Select port
DEFINE LCD_RSREG PORTB
' Set LCD Register Select bit
DEFINE LCD_RSBIT 4
' Set LCD Enable port
DEFINE LCD_EREG PORTB
' Set LCD Enable bit
DEFINE LCD_EBIT 5
' Set LCD bus size (4 or 8 bits)
 DEFINE LCD_BITS 4

HAM var word
Volt var word
MVolt var word
MENUU:
LCDOUT $FE,$80,"BATTERY LEVEL    "
ADCIN 0,HAM ;porta.0
HAM=HAM+1
Volt=(ham*/125)
Mvolt=volt//10
Volt=Volt/10
LCDOUT $FE,$C0,#VOLT,",",dec 2, #Mvolt," V"
 
;IF EXXIT=1 THEN BASLA
GOTO MENUU

ete

MOD alma konusunda da bilgi eksikliğin var.
VOLT=419 iken,
Mvolt=volt//10 şeklinde mod alırsan 419 sayısının 10 a bölünüp kalanın MVOLT' eşitlenmesini sağlarsın. Yani,
419/10=41  41*10=410 ve 419-410=9 şeklinde kalan bulunmuş olur.
Halbuki senin kalan değerin 19 olmalı.
O halde Mod100 (419//100) işlemini yaptırman lazım. Böylece,
419/100=4 ve 419-4*100=419-400=19 olarak bulunacaktır.
Unutma virgülden sonra tek hane ondalık için MOD-10, Virgülden sonra 2 hane için MOD-100 işlemi yaptırman gerekir.

Ete

elektro77

Yine olmadı Hocam.
41,19 göründü

Pardon
mod 100 yapınca voltu da, volt/100 yapmak gerekliymiş. Şimdi oldu. Teşekkür ederim Hocam.
       Ham=ham+1                   
       Volt=(ham */125)
       Mvolt=(volt//100)
       Volt=Volt/100
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

Powered by EzPortal