Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

adc kullanımı hakkında ???

Başlatan roll, 22 Şubat 2008, 02:31:15

roll

arkadaşlar 877 ile  8 kanal adc  yapıyorum.Lakin picim  adc dışında da başka işler yaptığından burda kaybettiğim zamanın minimum olmasını istiyorum.

  bunun için iki yolum var
birincisi   adc komutunu ana döngünün içine  direk koymadan koşul içinde koymak. timer kullanıp örneğin 5sn de bir adc işlemi yapmak

ikincisi ise bazı kitaplardan anladığım kadarıyla adc işlemi bittiğinde  kesme oluşuyor.adc komutunu verip  ana döngü başka işlerle uğraşırken sadece adc bitti  kesmesi geldiginde sonucu okumak böylece arada beklememek.

sorun ilk yolun  yapılması hakkında bilgim  var. Ama ikinci yöntemin nasıl uygulanabileceğini bulamadım??

Logan

16F8XX datasheet, sayfa 131'e bakınız.

2. Configure A/D interrupt (if desired):
• Clear ADIF bit
• Set ADIE bit
• Set PEIE bit
• Set GIE bit

Yukarıdak gibi yaparsanız sanırım probleminiz çözülecektir, kolay gelsin.
İmza.

roll

2. Configure A/D interrupt (if desired):
• Clear ADIF bit
• Set ADIE bit
• Set PEIE bit
• Set GIE bit

bu ayarlarla sorun çözüldü. Teşekkür Logan. Uygulamayı da koyalım örnek olsun.
http://rapidshare.com/files/94233944/kesmeadc.rar.html
Programda   rb4-7 değişim kesmeleri de aktif edildi.Ufak ayarlarla kullanıma sokulabilir. proton plus da yazdım.Ama zaten lcd ayarı dışında basicle arada  fark yok.

canbulut

meraba arkadaslar
birisi adcyi 10ohm ile 10k arasında değişen direnc değerine göre max=5v min=0 volt lcdede görecek şkilde anlatabiecek birisi olursa çok makbule gececek.
arastırın çok örnek var diyebilirsiniz arastırdım bir çok örnek var ancak bir türlü anlayamadım...

canbulut

mesela 2500 mv'un veya 2.5 voltun adcdeki degeri nedir bu hesaplamadan bahsederseniz arkadaslar. çok mutlu olıcam. :cry:

Logan

Hemen bahsedelim. Şimdi 16F87x serisi picler içerisinde 10 bitlik Analog-Dijital çevrim modülü barındırırlar. Ne demektir 10 bitlik çevrim kısaca açıklayacak olursak referans voltajını maximum olarak baz alan ve  0 v ile referans arası gerilim değerini 1023'e bölen bir işlemdir. Herhangi bir ayarlama yapmadan sadece ve sadece default olarak çevrim yapmaya kalkarsak, mikroişlemcimiz besleme voltajını referans alacaktır yani +5V'u. Bu gerilim değerini 1023'e böldüğümüz zaman ortaya şöyle bir sonuç çıkar; 5/1023=0,00488 V=4,88 mV. İşlemcimiz besleme voltaj referansı ile 10 bitlik çevrim yaptığı taktirde her bit başına tam olarak 4,88 milivolt düşecektir. ADC bacağına uygulanan voltaj değerin 4.88 mv artması ile birlikte içerideki ADC registerleri de 1 bit artacaktır. Eğer 8 bitlik çevrim yapmak isteseydik referans voltajımızı 255'e bölmemiz gerekecekti ve sonuç olarak bit başına 5/255=0,0196 V=19,6 mV düşecekti. Senin olarak gösterdiğin 2.5 V'luk değeri 10 bitlik çevrim ile dijitale çevirecek olursak 2500/4,88=512, 8 bitlik çevrim ile çevirecek olursakta 2500/19,6=128 değerini elde etmiş oluruz. Umarım açıklayıcı olmuştur.
İmza.

canbulut

çokı güzl o o kadar güzel anlatmışsınki gerçekten kutlarım:) saksım dolmaya başladı.:Dbirde örnek gelirse yine şöyle muhteşem açıklamalı süper olucak :roll:

roll

nasıl bir örnek anlamadım?? piclerde bulunan adc kurulmasıyla ilgili örneği  konuda verdik.

canbulut

senin örneğin proton olabilirmi usta. protonu bilmiyorum ama pbp'yu görmüşlüğüm olduğundan söylüyorum.ayrıca istediğim örnek açıklayıcı olmasını istiyorum.mesel bulduğum bir örnekte 0-50derecede okunan deger farkını 0 derecede 146yı nerden  buldu fark dediği 110 nedir.10 ile çarpmış 22ye  bölmüş.bunun gibi açıklamalar.anlatabiliyormuyum roll kardeşim...kolay gelsin.
   -------- ete'nin ders notlarından açıklama bölümü---------
'50 derecede okunan ADC değeri 256 ve 0 derecede okunan 146 olduğundan
'0-50 derece arası okunan değer farkı 110 dur (256-146) . O halde her bir derece
'için okunması gereken değer 110/50=2,2 olacaktır. Pic e uyarlamak için
'okunan değeri 10 ile çarpıp 22 ye bölersek direkt sıcaklığı bulmuş olacağız.
---------------------------------------------------------------------

canbulut

senin örneğin proton olabilirmi usta. protonu bilmiyorum ama pbp'yu görmüşlüğüm olduğundan söylüyorum.ayrıca istediğim örnek açıklayıcı olmasını istiyorum.mesel bulduğum bir örnekte 0-50derecede okunan deger farkını 0 derecede 146yı nerden  buldu fark dediği 110 nedir.10 ile çarpmış 22ye  bölmüş.bunun gibi açıklamalar.anlatabiliyormuyum roll kardeşim...kolay gelsin.
   -------- ete'nin ders notlarından açıklama bölümü---------
'50 derecede okunan ADC değeri 256 ve 0 derecede okunan 146 olduğundan
'0-50 derece arası okunan değer farkı 110 dur (256-146) . O halde her bir derece
'için okunması gereken değer 110/50=2,2 olacaktır. Pic e uyarlamak için
'okunan değeri 10 ile çarpıp 22 ye bölersek direkt sıcaklığı bulmuş olacağız.
-------------------------------------------------------------------



TRISA=%00000001
TRISB=0
TRISC=0
TRISD=0
'-------------------------------------------------------------------------------
@ DEVICE pic16F877
@ DEVICE pic16F877, WDT_on
@ DEVICE pic16F877, PWRT_ON
@ DEVICE pic16F877, PROTECT_OFF
@ DEVICE pic16F877, XT_OSC
'-------------------------------------------------------------------------------
DEFINE LCD_DREG      PORTB   'LCD data bacakları hangi porta bağlı?
DEFINE LCD_DBIT      4      'LCD data bacakları hangi bitten başlıyor?
DEFINE LCD_EREG      PORTB   'LCD Enable Bacağı Hangi Porta bağlı?
DEFINE LCD_EBIT      3      'LCD Enable Bacağı Hangi bite bağlı ?
define LCD RWREG    PORTB   'LCD R/W Bacağı Hangi Porta bağlı?
define LCD_RWBIT    2       'LCD R/W Bacağı Hangi bite bağlı ?
DEFINE LCD_RSREG   PORTB   'LCD RS Bacağı Hangi Porta bağlı ?
DEFINE LCD_RSBIT   1      'LCD RS bacağı Hangi Bite bağlı  ?
DEFINE LCD_BITS      4      'LCD 4 bit mi yoksa 8 bit olarak bağlı?
DEFINE LCD_LINES   2      'LCD Kaç sıra yazabiliyor

DEFINE   ADC_BITS   10       'A/D çevirim sonucu kaç bit olacak
DEFINE   ADC_CLOCK   3       'Clock kaynağı (3=rc)
DEFINE   ADC_SAMPLEUS   100   'Örnekleme zamanı mikro saniye cinsinden.
'-------------------------------------------------------------------------------
ADCON1=%10001110 '7. bit 1 yapıldı 10 bit sonuç almak için.
'-------------------------------------------------------------------------------
ISI   VAR word
HAM   VAR WORD
ONDA  VAR BYTE
'-------------------------------------------------------------------------------
Low PORTB.2      ' LCD R/W line low (W), şemada direkt GND ye bağlanabilir.
LCDOut $FE,1   ' LCD de CLS yapar
pause 200       ' LCD nin açılması için gerekli süredir.
'-------------------------------------------------------------------------------

BASLA:
     ADCIN 0,HAM  '0 nolu kanaldan Analog değeri oku ve RAW değişkenine aktar.
     
BAK:  IF ADCON0.2=1 THEN BAK 'Çevirme işlemi tamamlanınca Adcon0.2=0 olacak.
     
     lcdout $FE,1,"HAM =",# HAM
'50 derecede okunan ADC değeri 256 ve 0 derecede okunan 146 olduğundan
'0-50 derece arası okunan değer farkı 110 dur (256-146) . O halde her bir derece
'için okunması gereken değer 110/50=2,2 olacaktır. Pic e uyarlamak için
'okunan değeri 10 ile çarpıp 22 ye bölersek direkt sıcaklığı bulmuş olacağız.

     ISI=((HAM-146)*100)/22
     onda=ISI//10
     ISI=ISI/10
     LCDOUT $FE,$C0,"     ISI=",#ISI,",",#onda,"`C"
     pause 500
     goto basla

roll

evet örnek proton ama dediğim gibi pbp da olsa aynı kod olacaktı sadece lcd tanımlama satırları degişiyor.
dostum adc işlemiyle senin anlattığın farklı.adc lineer bir işlem.
şu demek yani   Vref=5V olan bir sistemde 1 voltu  8 bit örnekleyerek nasıl gösteririz.
Oranlayarak 1V/5V=X/2^8  buradan 0-255 arası bir  sonuç elde edersin adc bitmiş olur.

senin soruna gelince orada durum farklı adcden önce sensör kullanılmıştır.Yada belli bir formüle göre sinyal yüksek bir aralıktan 0-5V aralığına çekilmiştir. Sensörler ölçtükleri herneyse onu  voltaja çevirirler. bu çevirmeyi yaparken de bir  transfer fonksiyonları vardır. buna göre bu fonksiyonda ölçtüğün voltajı yerine koyup ısı, sıcaklık artık sensör  neyi ölçüyorsa onu bulmuş olursun.voltaj degerini nerden bilecem dersen onuda adc sayesinde buluyoruz.örneğin 8bit örnekleme Vref=5 için picimizde 200 gibi bir deger okunuyor olsun  bunun kaç volt olduğunu bulalım X V dersek

XV/5V=200/255==> X=3,92V

yani ad de genel formül şu

giriş voltajı/Vref=dijital deger/2^n

n= örnekleme bit sayısı

canbulut

ustam ben zaten otomasyon teknikeriyim.yapma bunu bana. analttığın güzel şeylerin yanında yanlış bilgilerde var sensörler hiç bir şeyi voltaja ceviremezler falan.sensör açık kontaktır yada kapalı yada her ikisi.hee transdüserler dersen hem gerilim hem akım olarak çıkış verebilirler.şu anda gecenin 12:30u.ben sadece picle adcyi nasıl kullanabilirim onu soruyorum nasıl potansiyometre  gibi değişken bir direncin adc  ile pice  bilinçli olarak işlettirip lcdde göstermek istiyorum.senin anlattığını sonuna kadar okuyamadım bile o kadar karmaşık lütfen roll.yinede yardımcı olmaya çalışman güzel ama bilmediğin konuda bilmeyen birine yanlış bişeyler öğretmen çok zaman kaybı yaratır

başka başlık açmamk için burayı kullandım benmi yanlış yerdeyim yoksa senmi anlayamadım.lütfen biri bana yardım etsin artık adc ile ilgili problem kalmasın artık.teşekkürler....

kolay gelsin...

roll

Alıntı yapılan: "canbulut"analttığın güzel şeylerin yanında yanlış bilgilerde var  

neymiş yanlışlar bilmek isteriz!!
bakalım kim yanlış
Alıntı yapılan: "canbulut"sensörler hiç bir şeyi voltaja ceviremezler falan

külliyen yanlış.Gayet güzel çevirirler.
lm35
bu gavurlar bu sıcaklığı voltaja çeviren alete niye sensor demişler bir düşün bakalım
Ama yok illada herşeyi voltaja çevirecek diye bir cümle zaten kullanmadım.Civalı termometre de bir en ala sensördür mesela .

peki siz nedemişiniz bu konuda !!
Alıntı yapılan: "canbulut"sensör açık kontaktır yada kapalı yada her ikisi
çok açıklayıcı olmuş!!
civalı termometrede açık kapalı kontak  o zaman??

Sensör genel bir isimdir.Transduser gibi enerji dönüşümü şart değildir.
Alıntı yapılan: "canbulut"ben sadece picle adcyi nasıl kullanabilirim onu soruyorum nasıl potansiyometre gibi değişken bir direncin adc ile pice bilinçli olarak işlettirip lcdde göstermek istiyorum.
picle adc uygulaması kodu orda dedik sende yok o proton pbp bilmemne dedin.Yaw canbulut şaka mı bu?? ister  C de yaz ister ASM de istersen JAVA da aynı registerları kurmayacan mı?? Ne değişecek
ama senin asıl karıştırdığın nokta başka bak  
Alıntı yapılan: "canbulut"mesel bulduğum bir örnekte 0-50derecede okunan deger farkını 0 derecede 146yı nerden buldu fark dediği 110 nedir.10 ile çarpmış 22ye bölmüş
biz sana başında bu bahsettiğinin adc ile alakası yok dedik.Orada kullanılan sensörün transfer fonksiyonuna göre bir denklem vardır demedim mi??
o notların başında ete ne yazmış
Alıntı yapılan: "canbulut"Hemen şu hesaplamayı yapmalısınız. 8 bit hesaplama için , Sensör den okunabilecek en yüksek değer 255 olacaktır. Peki bu değer kaç derece sıcaklığa eşdeğerdir?. Yani Sensör ün gösterebileceği maksimum sıcaklık ne olacaktır.  Bunu sensör bilgilerinden (bilgi formu veya üretici bilgilerinden) alacaksınız. Diyelim ki 120 dereceye eş değerdir. O halde birim okuma başına düşen sıcaklık değeri 120/255 =0,470 derece olacaktır.
Bunu Pic de kullanabilmek için 0,470 x100 = 47 olarak bir değer elde edilecektir. Demek ki ben okuduğum değeri 47 ile çarpıp sonucu 100 e bölersem sıcaklığı bulabilirim.

hocam sonuç olarak biz yanlışımız varsa düzeltmeye çekinmeyiz.Hata yapıncada özür dileriz.Ama Birşeyi anlamadınsa anlamadındır sensörle tranduser farkına sığınıp bu anlattıkların yanlış demek olmaz değil mi??

canbulut