16f887 ADC OKUMA

Başlatan erdogan2734, 24 Kasım 2015, 13:27:57

erdogan2734

Sevgili arkadaşlar ETE hocam Merhaba;

16f887 işlemcisini yeni kullanmayan başladım, 16f877a dan sonra bence baş yapıt. Pin to pin olması da 16f877a kullandığım tüm projelerimde işlemciyi kolayca değiştirmemi sağlıyor. Yalnız şu anda bir problemim var iki üç gündür uğraşıyorum netice elde edemeyince size yazmaya karar verdim, belki kaçırdığım bazı noktalar vardır.

Li-ion pille bir devre besliyorum 4.2 volt ile 2.5 volt pil kesici devresi kesene kadar sorunsuz 16f887 yi çalıştırıyorum.
Yapmak istediğim şey pili yani beslemeyi ölçüp 3 voltun altına düştüğünde bir led yakmak, şarj uyarısı vermek.
Yaptığım denemelerde pek başarılı olamadım, simülasyon da çalışıyor fakat reel de çalışmıyor. Reel de 1024 lük değerin sadece 512 sinin altında yada üstünde olduğunu okuyabiliyorum. Onun dışında hiç bir şey okuyamıyorum.
Devrenin direk beslemesini okumaya çalıştığım için yani karşılaştırıcı bir referans gerilimi olmadığı için böyle bir durum olduğunu düşünüyorum. Yazdığım program parçacığını aşağıya ekliyorum. İncelerseniz sevinirim.

İyi çalışmalar.

@ __config _CONFIG1, _MCLRE_ON & _LVP_OFF & _PWRTE_ON &_INTRC_OSC_NOCLKOUT & _WDT_OFF
@ __config _CONFIG2, _WRT_OFF & _BOR21V & _BOR40V
DEFINE OSC 4
Define ADC_BITS     10 ' Set number of bits in result
Define ADC_SAMPLEUS 50 ' Set sampling time in uS
ADCON0 = %11011011    ' AN6 okumak için seçiliyor)
ADCON1 = %10000000     ' sağa dayalı sonuç
ANSEL  =%01000000     ' AN6 seçildi
ANSELH =%00000000     '
CM1CON0=0 'C1 Komparatör iptal                                 '*
CM2CON0=0 'C2 Komparatör iptal                                 '*
WPUB=0  'PORTB pullup lar kapalı   
TRISA=%00000000
TRISB=%11101111
TRISC=%00010111
TRISD=%00000000
TRISE=%010
PORTA=0
PORTB=0
PORTC=0
PORTD=0
PORTE=0
PIL var word
pil=0
menu:

X=X+1
IF X=14000 then'00 THEN
X=0                          'AYDINLATMA KONTROL
AT=0
o=o+1
ENDIF
'*****************************************************

        if o=3 then
        o=0:T=0                   'SARJKONTROL
        gosub pilolc
        endif
        '*****************************************************
if t=1 then
a=a+1
if a=2000 then                'SARJKONTROL
toggle LP
a=0
endif
endif

gosub PILOLC


goto menu

PILOLC:
                    ''**********************SARJ*******************************
                     pause 200
                     adcin 6, pil
                     pause 200
                     IF pil<610 THEN t=1
                     RETURN
                    '**********************SARJ*******************************
Erdoğan
İmkansızın zaman aldığı bir dünya'da bana zorluktan bahsetme!

ete

Buraya kopya koyarken çalıştığınız kopya yerine kırpılmış kopya koyuyorsunuz ve benim kafam karışıyor.
Bak şimdi programında değpişken tanımlama kısmında sadece ;
PIL VAR WORD var. Ama programa bakınca;
X , AT , O, A , LP, T gibi değişkenler görüyorum. Nasıl çalışıyor bu program?????? Mümkün değil.
Bunlara dikkat edin lütfen.

Define ile yaptığın ADC tanımlamasını aşağıdaki şekilde değiştir.

DEFINE ADC_BITS 10     ' ADCIN resolution  (Bits)
DEFINE ADC_CLOCK 1     ' ADC clock source  (Fosc/8)
DEFINE ADC_SAMPLEUS 5 ' ADC sampling time (uSec)


ADCON0 = %11011011  satırını sil. Bu işi hem yukardaki define satırları yapıyor hemde kanal seçme işini Basic otomatik yapıyor zaten.

ADC ölçme komutunun önüne arkasına neden 200 ms gecikme koydun bilemiyorum. Bana göre çok gereksiz.

Bunun dışında bir sorun göremedim.

Yalnız dikkat etmen gereken bir şey var. ADC ölçümünde ref voltajı çok önemlidir. İşlemciyi 3,7V ile besliyorsun. Pil bu voltaja sahip iken REF voltajı 3,7V dur ve ADC pinine 3,7V gelince ölçülen değer 1023 olarak hesaplanır.
Pil 2,5V ta düşünce Ref alınan voltaj yine 2,5V olur ve bu durumda ADC pinine gelen voltajda 2,5V olacaktır. Bu durumda okunan ADC değeri yine 1023 olur. Çünki ref ne ise ona orantılanır okunacak değer.

Pil ölçme durumlarında mutlaka farklı sistem uygulamak gerekir. Mesela 3,7V luk beslemeden bir özel voltaj regülatörü kullanarak 1-1,5V dolayında değişmeyen sabit bir ref gerilimi elde et. Bunu +REF pinine gir ve ADCON1 registerinde buna ait değişikliği yap. Bu durumda pil voltajın 2,5 değerine düşerse ref voltajı yine değişmeyecektir. Tabiiki Pil voltajını ADC girişine gerilim bölerek tam şarjda ref voltajı kadar bir gerilim elde edecek şekilde ayarlamalısın.

Yada işlemci değiştirip içinde FVR (Fixed Voltage Reference) modülü olan bir işlemci kullan. Bu modüle sahip işlemciler ayarlanabilir bir sabit ref gerilimi üretirler ve ADC ölçümlerinde bu gerilimi ref al diyebiliyorsun. Böylece pil ölçümlerin her zaman doğru olur.

Evet toparlarsak sorunun büyük ihtimal ile ref voltajının pil voltajı olarak kullanılmasından kaynaklanıyor.

Ete


onurinci

uygun voltaj eşiğinde seçilmiş 3 pinli bir SUPERVISORS, VOLTAGE MONITORS çip kullanarak herhangi bir porta bağlayabilirsiniz,işlemcininde yükü kalkar.

erdogan2734

#3
Evet Hocam Programı foruma atarken değişken tanımlamalarını atmayınca dedim kesin ete hocadan fırça yiyeceğiz, ki öyle oldu.
Olsun sizi uzun süredir tanıyan ve takip eden biri olarak bu konuya dikkat etmem gerekirdi. Sonuca gelirsek.
Dediğiniz gibi denedim. Ama sonuç olarak voltaj düştükçe Vref düşeceğinden batarya ölçümünü bu şekilde yapamadım.

Birde datasheet'te 0.6 voltluk Vref den bahsetmiş bunu kullanma şansımız varmı hocam?
O kısmı resim olarak ekledim.


İyi çalışmalar.
Erdoğan
İmkansızın zaman aldığı bir dünya'da bana zorluktan bahsetme!

ete

Data sheete baktım ama bu seçimin ne anlama geldiğini anlamadım doğrusu. Zira asıl voltaj referansı ADCON1 registerinden yapılıyor. Harici yada dahili olarak. Burada verilen aslında kanal seçimine ait bir değer. Bu nedenle işine yarayacağını sanmıyorum. Kesinlikle harici bir ref kaynağı kullanman gerekiyor tabiiki illaki bu işlemcide ısrarlı isen.

Ete

erdogan2734

#5
Konu baya eskidi ama bulduğum çözümü anlatma isterim.
Referans voltaj için iki adet direnç ile gerilim bölümü yapıp, değeri okuyordum.
Dirençlerden birinin yerine diyot kullandım. Diyot üzerinde 0.7-0.6 volt aralığında voltaj okudum.
Diyotun önünede 1k direnç taktım. Bu şekilde pilin voltaj  değeri her düştüğünde ölçüm yapıp kaydettim ve o değere göre matematiksel işlem yaptım.
Örneğil pil 3.7 volt iken buradaki değer 2.2 volt oluyor.
3.5 volt iken 2.22 volt oluyor.
Bu şekilde voltaj okuyup kontrol sağladım.
Tabi bu elimizde ki kısıtlı imkanlar ile oluşan bir durum.
Yeni projemizde sabit voltaj regülatörü kullanmayı düşünüyoruz.
İyi akşamlar.
Erdoğan
İmkansızın zaman aldığı bir dünya'da bana zorluktan bahsetme!

Powered by EzPortal