ADCON2 Değişkeni TAD ve FOSC nedir ?

Başlatan M.A.A, 02 Şubat 2016, 14:22:36

M.A.A

Merhaba Arkadaşlar
ADCON2 Değişkeni TAD ve FOSC nedir, ne işe yarar.

ete

ADCON2 her işlemcide olmayan bir ADC registeridir. 18F serilerinde yer alır.
TAD bir ADC çevirm işleminin peryoduna verilen isimdir. Pek çok işlemcide bu süre sabittir. Data sheetlerinde min TAD süresi verilir ve bu süre sigorta ayarlarında (Basic de)
DEFINE ADC_SAMPLEUS 20 ' ADC sampling time (uSec)
şeklinde programa tanıtılır. Burada yer alan 20us lik süre 19,72us lik TAD süresine karşılık verilen bir süredir.
Bu süre ADCON2 registeri olan işlemcilerde seçenekli olarak değiştirilebilir.
Mesela 18FK22 de 2-20 Tad aralığında bu register yardımı ile seçilebiliyor.

Fosc ise işemcinin çalıştığı frekansdır. Harici bir kristal ile çalışıyor ise kristal frekansı , dahili osc ile çalışıyor ise seçilen (yada sabit tek değerli) dahili OSC frekansına verilen addır.

Ete

M.A.A

Teşekkür ederim Hocam

111 = 20 TAD
110 = 16 TAD
101 = 12 TAD
100 = 8 TAD
011 = 6 TAD
010 = 4 TAD
001 = 2 TAD
000 = 0 TAD(1)

Burada küçük TAD leri seçmenin bi dezavantajı var mı ?

111 = FRC (clock derived from A/D RC oscillator)(1)
110 = FOSC/64
101 = FOSC/16
100 = FOSC/4
011 = FRC (clock derived from A/D RC oscillator)(1)
010 = FOSC/32
001 = FOSC/8
000 = FOSC/2

Bu seçenekler ADC ölçüm hızını mı doğrudan etkiliyor.

ete

Şöyle bir mantık yürütebiliriz. İçeride bir kondansatör var ve onu önce şarj edip dolduruyoruz.
Sonra devremiz (ADC ye ne bağlı ise) bu kondansatör deşarj oluyor ve bu deşarj süresi esnasında bir sayac sayıyor.
KOndansatörün kısa sürede (az ) şarj edilmesi çabuk boşalmasına sebep olacak ve bizim ADC çözünürlüğümüz düşecektir.
Büyük değer kondansatörü uzun şarj edecek ve boşalmada artacak ve sonuçta ADC çözünürlüğü artacaktır.
Doğru ve hassas sonuçlar için olabildiğince yüksek değerler seçmek bence avantajlı gözüküyor.

ADC ana osilatörden bölünerek sinyal alır. Bölme oranı tamamen sistemin çalışma frekansına bağlıdır ve data sheet de hangi frekanslar için hangi bölme oranları kullanılması gerekiyor açıklanmıştır. Bu nedenle seçimi ona göre yapmak gerekir.

Genellikle bir tablo verilir ve o tabloda değişik kristal frekansları ile sistemin hangi bölme oranı ile çalışacağı gösterilir. Uygun olmayanlar taralı olarak gösterilir ve tablonun altında genellikle shaded area is not conveninet gibi bir açıklama vardır.
Bu tabloyu bulup oradan seçim yapmak ve ADCON2 yi ona göre ayarlamak daha doğru olur.

Ete

M.A.A

Hocam benim kafam iyice karıştı.

Ben şimdi 8 MHZ kullandığım için ADCS<2:0>  001 (FOSC/8) yapmam lazım.
Bu durumda ACQT<2:0>  001  (2 TAD) yaparsam ADC ölçüm sürem 2 us mi olur ?

Basic de de bu şekilde ayarlayabilir miyim

Declare Adin_Tad = 8_FOSC
Declare Adin_Stime =2

Benim iki ölçüm arası süreyi olabilecek en küçük süreye ayarlamam lazım.

ete

Hangi işlemciyi kullanıyorsun belli olmadığı için bir şey diyemiyorum. Ancak, data sheetlerde Analog to Digital bölümünde o iişlemcinin min TAD zamanı, hangi frekanslarda hangi ADC ,CLK seçileceği belirtilmiştir.
Yine 18F45K22 yi esas alarak örnek vereyim. Sen kendine göre ayarlarsın artık.
Table 17-1: de ADC CLK Period değerleri verilmiş. Burada üstte kolonlarda çalışma frekansları altlarında hafiften taranmış haneler birde taranmamışlar var. Taranmışlar o frekans için uygun olmayan değerleri gösteriyor. Şimdi 4 Mhz altına bakalım. 1us ile 2 us uygun gözüküyor. Onların sol başta yer alan hizalarına bakarsan 1us için ,Fosc/4 ve 2 us için de Fosc/8 değerleri verilmiş.
Tabloda senin frekansın olan 8Mhz olmadığı için 16Mhz sütununa bakman gerekiyor. Burada 1us ve 2us değerleri var ve sol başlarında Fosc/16, Fosc/32 değerleri gözüküyor. Bu durumda büyük olanı seçmek daha emniyetli olacaktır. Demekki senin seçeceğin değer Fosc/32 olacaktır. Fosc/32 ibaresinin hemen yanındaki yerde ise ADCS<2:0> bitlerinin alması gereken değer gösterilmiştir. O halde ADCON2 registeri 2-0 bitlerine bu değerleri vermen gerekecek.
Ete

M.A.A

#6
Ben 18F4620 kullanıyorum, sizin verdiğiniz örnekteki tablo ile 18F4620 nin tablosunu karşılaştırdım. Tablo görüntüsünü de ekledim.
Dahili 8MHZ kullandığım için 8 Tosc ve ADCS<2:0> 001 kullanmam gerekiyor.
Bu kısımdan sonda TAD süresini ilişkilendiremiyorum.


Bir diziye eşit aralıklar ile ölçüm atmak için aşağıdaki ölçüm doğru mu hocam ?


For x = 0 To 255 Step 1
    ADCON0=%00001101  'AN3
    DelayUS 25
    ADCON0.1=1  'A/D başlat
    While ADCON0.1=1:Wend
    SAYI.Byte0= ADRESL
    SAYI.Byte1= ADRESH
    D_R[x] = SAYI

    ADCON0=%00000101  'AN1
    DelayUS 25
    ADCON0.1=1  'A/D başlat
    While ADCON0.1=1:Wend
    SAYI.Byte0= ADRESL
    SAYI.Byte1= ADRESH
    D_S[x] = SAYI

   
    ADCON0=%00000001  'AN0
    DelayUS 25
    ADCON0.1=1  'A/D başlat
    While ADCON0.1=1:Wend
    SAYI.Byte0= ADRESL
    SAYI.Byte1= ADRESH
    D_T[x] = SAYI
     
Next


ete

Hazır ADC komutu var iken neden bu dolaylı yollara başvuruyorsunuz pek anlamıyorum.
ADCIN 3,SAYI
komutunu verdinizmi Bu komut size anında ölçüm değerini verir zaten. Ama sizin yapmaya çalıştığınız gibide yapılabilir elbette. Data sheet ADC ölçüm prosedürü için şöyle diyor;

1.ADC çevrim  CLK seçimini yap  (ADCON2 registeri 2-0 bitleri)
2. Referans Voltaj seçimini yap   (ADCON1 registeri 5-4 bitleri)
3. Analog Kanalı Seç                  (ADCON0 registeri 5-2 bitleri)
4. Çözünürlik Seçimini yap         (ADCON2 registeri 7 nolu bit)
5. ADC Modülünü aktif hale getir(ADCON0 registeri 0 nolu bit)
6. Şarj süresi kadar bekleyin      (18F4620 için 2,4us olduğu data sheette yazıyor (min acquisition time)
7. GO/DONE bitini set edin         (ADCON0 registeri 1 nolu bit)
8. GO/DONE biti Low oluncaya kadar bekleyin.
9. Sonucu AdresL ve AdresH registerlerinden okuyun.

Şimdi bu yazılan maddelere bakarsak;
  ADCON2=%10010001 değerini vererek hem CLK seçimini (8 mhz için uygun değer Fosc/8), hem çözünürlüğü, hem acqisition zamanı seçimini (4TAD) yapmış olacağız. Bunlar sabit değerler olduğu için programda bu değerleri değiştirmeyeceğiz. Bu nedenle programın başına eklenmeli bu komut.

ADCON1=%00001011 değerini vererek, Besleme gerilimlerini Ref voltajı olarak seçtik ve AN0-AN1-AN2-AN3 pinlerini analog giriş olarak ayarlamış olduk.
Buda sabit olduğundan programın başına eklenmeli.

Bu aşamadan sonra ADCON0 registerine program içinde değer vererek istediklerimizi yapmaya çalışacağız.
For x = 0 To 255 
    ADCON0=%00001101  'AN3seçtik ve ADC modülü aktif ettik
    DelayUS 4   'min acquisition zamanı kadar bekledik
    ADCON0.1=1  'A/D başlat
    While ADCON0.1=1:Wend
    SAYI.Byte0= ADRESL
    SAYI.Byte1= ADRESH
    D_R[x] = SAYI

    ADCON0=%00000101  'AN1
    DelayUS 4
    ADCON0.1=1  'A/D başlat
    While ADCON0.1=1:Wend
    SAYI.Byte0= ADRESL
    SAYI.Byte1= ADRESH
    D_S[x] = SAYI

   
    ADCON0=%00000001  'AN0
    DelayUS 4
    ADCON0.1=1  'A/D başlat
    While ADCON0.1=1:Wend
    SAYI.Byte0= ADRESL
    SAYI.Byte1= ADRESH
    D_T[x] = SAYI
     
Next

3 adet 255 elemanlı dizi değişkenine bu işlemci müsaade ediyor ise kodlarda bir hata yok bu şekilde.

Ete



M.A.A

Çok teşekkür ederim hocam.

Daha önce ADin komutunu denemiştim, bu yöntemden daha uzun sürede ölçüm yapıyordu.
Mesela biraz önce ADCON1 ve ADCON2 yi değiştirmeden 255 ölçümü sizin verdiğiniz uzun şekilde ve ADin komutu ile denedim.
Uzun şekilde = 255x3 ölçüm süresi yaklaşık 25ms
ADin ile = 255x3 ölçüm süresi yaklaşık 66ms

ADCON1 ve ADCON2 yi kaldırıp

Declare Adin_Res = 10
Declare Adin_Tad = 8_FOSC
Declare Adin_Stime =4
yazdığımda  ADin ile = 255x3 ölçüm süresi yaklaşık 33ms ye düştü.

ete

Madem en kısa süreli olanı lazım 25 ms de ölçüm yapan en iyisi gözüküyor.
Declare komutlarından sonra neden süre kısalıyor onuda anlamadım doğrusu aynı değerleri veriyoruz ama declare şle olunca süre kısalıyor enteresan.

Ete

M.A.A

Hocam daha entarasan bir şey söyleyeyim.

Declare Adin_Res = 10
Declare Adin_Tad = 8_FOSC
Declare Adin_Stime =4       

yazıp uzun yoldan adc ölçersem 255x3 lük ölçüm süresi yaklaşık 16ms ye ye düştü.
Bu durumda iken ADCON1 ve ADCON2 değerlerini de ekrana bastırdım.
ADCON1= 7 , ADCON2=0 olarak görünüyor.

tekrar Declare komutlarını silip programa
ADCON1= 7
ADCON2=0
ekleyip çalıştırdım. Gene 16 ms sürdü.

Declare Adin_Res = 10
Declare Adin_Tad = 4_FOSC
Declare Adin_Stime =20

yapıp tekrar  ADCON1 ve ADCON2  ekrana bastırdım.
ADCON1= 7 , ADCON2=0 olarak görünüyor.

ete

Bir önceki mesajında aynı parametreler ile 33 ms de ölçtüğünü söylemiştin.
Ya parametreleri yanlış yazıyorsun yada ölçümleri yanlış yapıyorsun.

Ete

M.A.A

#12
Alıntı yapılan: M.A.A - 12 Mart 2016, 10:08:15

ADCON1 ve ADCON2 yi kaldırıp

Declare Adin_Res = 10
Declare Adin_Tad = 8_FOSC
Declare Adin_Stime =4
yazdığımda  ADin ile = 255x3 ölçüm süresi yaklaşık 33ms ye düştü.



Bu şekilde ADin ile 33ms ye

Aynı declareler dururken ADin kullanmadan uzun yöntem ile ölçüm yapar isem 16ms ye düşüyor.

Declara kullanıp Adin kullanarak   
Declara kullanmayıp Adin kullanarak
Declara kullanıp Adin kullanmayarak
Declara kullanmayıp Adin kullanmayarak   
4 farklı ölçüm yaptım.
Declara da yaptığım değişiklikler ADCON1 ve ADCON2 yi değiştirmedi

M.A.A

Hocam 4 farklı durum içinde ayrı dosya oluşturdum, 4 durumu da hem gerçekte hem similasyonda denedim. Sonuçlar hep farklı. Sonuçları her dosyanın başına yazdım.

Maxim

emin değilim ama bence hata var
TAD ile sample time karışmış gibi

mesela picmulticalc programında 8mhz ve giriş 10k ile çıkan sonuç böyle (en ideali bu yani)
DEFINE ADC_BITS 10     ' ADCIN resolution  (Bits)
DEFINE ADC_CLOCK 5     ' ADC clock source  (Fosc/16)
DEFINE ADC_SAMPLEUS 11 ' ADC sampling time (uSec)

Powered by EzPortal