Bölüm-7 Analog İşlemler

Analog Dijital Dönüştürme Modülü

Mikrodenetleyicilerin en önemli özelliklerinden birisi, zamana göre sürekli olarak değişim gösteren ve analog diye ifade edilen dış ortam sinyallerini işleyebilme yeteneğidir. MCU’ların kullanıldığı pek çok durumda Analog/Dijital (A/D) dönüştürme işleminin gerçekleştirilmesi gerekir.

Orta ölçekli 8-bit PIC mikrodenetleyicilerinin pek çoğunda Analog/Dijital (A/D) dönüştürme özelliği bulunur. Bu sınıfta yer alan mikrodenetleyicilerde sayısı değişmekle birlikte birden fazla 10-bit çözünürlüğe sahip A/D kanalı yer alır. Şekil 7.1’de 8 kanallı 10-bit çözünürlüklü ADC modülüne sahip bir MCU’nun A/D blok diyagramı gösterilmiştir. Bu bölümde yer alan bilgiler genel olarak 10-bit A/D çözünürlüğüne sahip MCU’lar için verilecektir.

Şekil-7.1 10-bit A/D blok diyagramı

A/D dönüştürücü, MCU uyku modundayken de çalışabilme gibi önemli bir özelliğe sahiptir. A/D işleminin yapılabilmesi için ilgili analog kanal girişindeki voltaj seviyesinin pozitif ve negatif bir referans voltaj değerine göre ölçeklenmesi gerekir. Bunun için MCU’nun kaynak voltajları olan VDD ve Vss ya da AN3/VREF+ ve AN2/VREF- pinlerindeki voltaj seviyesi referans gerilimi olarak kullanılır. PIC12F675 mikrodenetleyicisinde yalnızca AN1 kanalında VREF adıyla tek bir ek referans girişi vardır.

Şekil 7.2’de ayarlanan alt ve üst voltaj referansı seviyesine göre 10-bitlik bir ADC sisteminin ölçeği gösterilmiştir. Görüldüğü üzere analog girişten ölçülen voltaj seviyesi 000h-3FFh aralığında 10-bitlik çözünürlük değerinde ölçeklenmektedir.

Şekil 7.2 Voltaj referansı aralığına göre analog sinyalin 10-bitlik ölçeği

A/D Modülü İçin Kullanılan Kaydediciler

Mikrodenetleyicilere bağlı olarak değişmekle birlikte, Microchip® PIC ailesi 10-bit A/D dönüştürme özellikli 8-bit MCU’larda genel olarak aşağıdaki SFR kaydedicileri A/D işlemleri için kullanılır:

  • ADRESH
  • ADRESL
  • ADCON0
  • ADCON1
  • ANSEL - ANSELH

Bu kaydediciler A/D modülüne sahip mikrodenetleyicilerin sınıf ve türüne bağlı olarak bazı değişiklikler göstermektedir.

ADCON0 modülü genel olarak A/D modülünün çalışmasını kontrol eder. ADCON1 kaydedicisi ise port pinlerinin davranışını ayarlamak için kullanılır. ANSEL kaydedicisi ise genellikle ADCON1 kaydedicisinin olmadığı MCU’larda ya da ADCON1’in başka işlevlere sahip olduğu durumlarda ayrıca kullanılmaktadır.

Kitapta kullanılan MCU’lardan PIC12F675 ADCON1 kaydedicisine sahip değildir ve genel olarak bu kaydedicinin yaptığı işlemler ANSEL kaydedicisiyle yapılmaktadır. Ancak PIC16F887 mikrodenetleyicisinde hem ADCON1 hem de ANSEL kaydedicisinin ikisi de yer almaktadır. Ayrıca PIC16F887’de çok sayıda analog giriş olduğundan ANSEL kaydedicisinin yanında ANSELH kaydedicisi de bulunmaktadır. PIC18F2550’de ise ADCON kaydedicisinden 0, 1 ve 2 olmak üzere üç adet bulunmaktadır.

ADRESH ve ADRESL kaydedicileri ise dijitale çevrilen bilginin tutulduğu üst ve alt hafıza alanlarıdır. 10 bitlik A/D modüllerinde bilginin 8 bitlik MSB kısmı ADRESH alanında, geriye kalan 2 bitlik LSB kısmı ise ADRESL alanında tutulur.

Görüldüğü üzere MCU modeline bağlı olarak değişen bir durum söz konusudur. Bu nedenle A/D modülüyle ilgili kaydediciler, MCU modelinden bağımsız olarak anlatılacaktır. Genel olarak temel mantık anlaşıldıktan sonra farklı model MCU’lara uyum sağlamanız kolaylaşacaktır. Projelerinizi rahatlıkla farklı tür ve modellere göre dönüştürebilir ve uyarlama yapabilirsiniz.

ADCON0: A/D KONTROL KAYDEDİCİSİ 0 (ADRES: 1Fh – PIC16F887)

bit 7-6 ADCS1:ADCS0: A/D dönüşümü için çalışma hızı tercih bitleri
00 = FOSC/2
01 = FOSC/8
10 = FOSC/32
11 = FRC (dâhili A/D RC osilatöründen elde edilen frekans)
bit 5-2 CHS3:CHS0: Analog kanal tercih bitleri
0000 = kanal 0, (AN0)
0001 = kanal 1, (AN1)
0010 = kanal 2, (AN2)
0011 = kanal 3, (AN3)
0100 = kanal 4, (AN4)
0101 = kanal 5, (AN5)
0110 = kanal 6, (AN6)
0111 = kanal 7, (AN7)
1000 = kanal 8, (AN8)
1001 = kanal 9, (AN9)
1010 = kanal 10, (AN10)
1011 = kanal 11, (AN11)
1100 = kanal 12, (AN12)
1101 = kanal 13, (AN13)
1110 = CVREF
1111 = Sabit referans (0,6V)
bit 1 GO/(DONE): A/D dönüştürme işlemi durum biti
ADON biti ‘1’ olduğunda,

1 = A/D dönüştürme işlemi yürütülmekte (bu bit kurulduğunda A/D dönüştürme işlemi başlar. Dönüştürme işlemi bittiğinde otomatik olarak temizlenir)

ÖNEMLİ: GO/ (DONE) biti ‘1’ yapılmadan önce, bir diğer ifadeyle A/D modülünün Analog Dijital dönüştürme işlemine başlamasından önce program içinde çok kısa süreli bir bekleme (birkaç µs dolaylarında) yapılmalıdır. Bu bekleme A/D modülünün çalışmaya hazır hale gelmesi için gerekmektedir. Bu nedenle A/D modülünü etkinleştiren aynı komut içinde, ADON bitiyle birlikte aynı anda kurulmamalıdır.

bit 0 ADON: A/D on biti
1 = A/D dönüştürücü modülü çalıştırıldı
0 = A/D dönüştürücü modülü kapatıldı, modülün güç tüketimi yok

Kısaltmaların Anlamları

R = Okunabilir bitU = Kullanılmayan bit, ‘0’ olarak okunur

W = Yazılabilir bit-n = POR reseti gerçekleştiğinde aldığı değer

ADCON1: A/D KONTROL KAYDEDİCİSİ 1 (ADRES: 9Fh – PIC16F887)

bit 7 ADFM: A/D sonuç formatını belirleme biti
1 = Sağa hizalı. Bu durumda 10 bitlik bilgi sağa hizalanır.
0 = Sola hizalı. Bu durumda 10 bitlik bilgi sola hizalanır.
Şekil 7.3’te ADFM bitinin bilgiyi hizalamada nasıl bir etkisinin olduğu gösterilmiştir. Sağa hizalı durumda bilginin 8 bitlik kısmı ADRESL kütüğünde kalırken, bilginin 2 bitlik kısmı ADRESH kütüğünün ilk iki bitinde yer almaktadır. Dolayısıyla sağa hizalı durumda ADRESH kütüğünün en büyük değerlikli (MSB) 6 biti ‘0’ olarak okunur. Benzer şekilde, bilginin sola hizalı olması durumunda da ADRESL kütüğünün en küçük değerlikli (LSB) 6 biti ‘0’ olarak okunur.

Şekil 7.3 ADFM bitinin bilgiyi hizalamada kullanımı

bit 6 Kullanılmıyor: '0' olarak okunur.
bit 5 VCFG1: Voltaj referans biti
1 = VREF- pini
0 = VSS pini
bit 4 VCFG0: Voltaj referans biti
1 = VREF+ pini
0 = VDD pini
bit 3-0 Kullanılmıyor: '0' olarak okunur.

ADRESH:ADRESL kaydedicileri A/D dönüşümünün 10 bitlik sonucunun kaydedildiği bir SFR kaydedicisidir. A/D dönüştürme işi bittiğinde sonuç bu kaydedicilere yüklenir. ADCON0 kaydedicisinin ADFM bitinin durumuna göre 10 bitlik sonucun ADRESH:ADRESL kaydedicilerindeki dizilimi değişir.

A/D dönüştürme işi bittiğinde GO/ (DONE) biti biti temizlenir ve AD kesme bayrağı ADIF biti lojik-1 olur (set edilir). A/D dönüştürme işleminin sağlıklı şekilde yapılabilmesi için sırasıyla aşağıdaki adımlar izlenmelidir:

  1. Öncelikle A/D modülü konfigüre edilir:
    • Analog pinleri / voltaj referans girişlerini / ve dijital I/O (ADCON1) hatlarını ayarla
    • A/D giriş kanallarını seç (ADCON0)
    • A/D dönüştürme saat frekansını seç (ADCON0)
    • A/D modülünü aç (ADCON0)
  2. İstenirse A/D kesmesi ayarlanır:
    • ADIF biti temizlenir
    • ADIE biti kurulur
    • GIE biti kurulur
  3. Gerekli kazanç süresi için beklenir.
  4. Dönüştürme işlemi başlar:
    • GO/ (DONE) bitini kur (ADCON0)
  5. A/D dönüştürme işleminin tamamlanması için bekle:
    • Ya GO/ (DONE) bitinin temizlenmesi ya da ADIF bitinin kurulduğu yoklanır
      Ya da
    • A/D kesmesi için beklenir
  6. ADRESH:ADRESL kaydedici çiftlerinden A/D sonucu okunur. Gerekirse ADIF biti temizlenir.
  7. Bir sonraki dönüştürme için, 1. ya da 2. adıma gidilir.

Bazı MCU modellerinde ANSEL kaydedicisi bulunmaktadır. PIC12F675 mikrodenetleyicisinin ANSEL kaydedicisi şu şekilde açıklanabilir:

ANSEL: ANALOG SEÇİM (SELECT) KAYDEDİCİSİ (ADRES: 9Fh – PIC12F675)

bit 7 Kullanılmıyor: '0' olarak okunur.
00 = FOSC/2
01 = FOSC/8
10 = FOSC/32
11 = FRC (dâhili A/D RC osilatöründen elde edilen frekans)
bit 6-4 ADCS2:ADCS0: A/D dönüşümü için çalışma hızı tercih bitleri
000 = FOSC/2
001 = FOSC/8
010 = FOSC/32
X11 = FRC (bu iş için ayrılmış bir dâhili osilatörden elde edilen saat hızı = 500kHz maks)
100 = FOSC/4
101 = FOSC/16
110 = FOSC/64
bit 3-0 ANS3:ANS0: Analog tercih bitleri
1 = Pin analog giriş olarak atanır
NOT: Bir pinin analog girişe ayarlanması durumunda otomatik olarak dijital devre girişleri, zayıf pull-up’lar ve değişim algılama kesmesi devre dışı bırakılır. 0 = Pin dijital giriş/çıkış olarak atanır

PIC16F887 mikrodenetleyicisinde de ANSEL kaydedicisi vardır ve yalnızca ilgili analog kanalı analog ya da dijital olarak ayarlamak için kullanılır. Her bite bir kanal karşılık gelir. Bu mikrodenetleyicide toplamda 13 analog kanal olduğundan ek olarak ANSELH kaydedicisi de bulunur. Aşağıda bu kaydedicilerin bit dağılımları gösterilmiştir. Kanalların ayarlanması ve davranışı PIC12F675 mikrodenetleyicisinin ANS3:ANS0 bitleri gibidir.

ANSEL: ANALOG SEÇİM KAYDEDİCİSİ (ADRES: 188h – PIC16F887)

ANSELH: ANALOG SEÇİM KAYDEDİCİSİ (ADRES: 189h – PIC16F887)

A/D İşlemi İçin Gerekli Çevrim Saati (PIC16F887 referans alınmıştır)

ADCON0 kaydedicisinin (PIC12F675 için ANSEL kaydedicisi) ADCS bitleri yardımıyla gerekli çevrim saati kaynağı yazılımsal olarak seçilebilir. Analog dönüştürme işleminin yapılabilmesi için belli bir saat sinyaline ihtiyaç vardır. PIC16F887 için bu saat değerleri aşağıdaki gibidir:

  • FOSC/2
  • FOSC/8
  • FOSC/32
  • FRC (AD modülünde bu iş için tahsis edilmiş dâhili RC osilatörü)

ÖNEMLİ NOT: FRC kullanılmadığında, sistem saat frekansındaki değişim ADC saat frekansının değişmesine neden olur ve ADC sonucu olumsuz yönde etkilenir.

Çevrim saati tercihleri mikrodenetleyiciye göre değişiklik göstermektedir. Burada dikkat edilmesi gereken husus FRC’nin dâhili osilatör özelliğine sahip MCU’ların osilatörüyle karıştırılmamasıdır. A/D modülüne sahip tüm MCU’larda, gerekli çevrim saatinin işlemci osilatöründen bağımsız olarak üretilebilmesi için dâhili bir RC osilatörü vardır. Bir bitlik A/D dönüştürme işlemi için geçen süre TAD olarak ifade edilir. 10-bitlik bir ADC sisteminde tam dönüştürme için minimum 11TAD’lik bir süre geçer. Şekil 7.4’te analog-dijital dönüştürme TAD çevrimi gösterilmiştir.

Sağlıklı dönüştürme işlemi için, uygun TAD şartları sağlanmalıdır. Mikrodenetleyicinin ortam sıcaklığı, çalışma voltajı gibi çeşitli fiziksel ve elektriksel koşullar bu şartları etkiler. Bunun için ilgili MCU’nun veri kılavuzlarında (datasheet) “Electrical Specifications – Elektriksel Nitelikler” başlığı incelenmelidir.

Şekil 7.4 Analog Dijital Dönüştürme işleminde TAD çevrimi

Doğru dönüştürme işlemi için minimum ihtiyaç duyulan bir TAD süresi vardır. Bu genellikle 1,6 us kadardır. Dolayısıyla ADC işlemi için ayarlanan çevrim saati bu süre dikkate alınarak ayarlanmalıdır. Tablo 7.2’de PIC16F887 için bazı çalışma frekanslarına bağlı olarak çevrim saati süresinin hesaplaması gösterilmiştir.

Tablo 7.1 Seçilen çalışma frekansına bağlı olarak TAD süresi hesabı
ADC Çevrim Saati (TAD) Cihaz Frekansı (FOSC)
ADC Saat Kaynağı ADCS bitleri <1:0> 20 MHz 8 MHz 4 MHz 1 MHz
FOSC/2 00 100 ns 250 ns 500 ns 2 us
FOSC/8 01 400 ns 1.0 us 2.0 us 8.0 us
FOSC/32 10 1.6 us 4.0 us 8.0 us 32.0 us
FRC 11 2-6 us 2-6 us 2-6 us 2-6 us

A/D Kazanç İçin Gerekenler

A/D dönüştürücülerin çalışma mantığında ilgili kanal girişindeki analog sinyale kondasatör ile şarj olunması ilkesi vardır. Kondansatörün şarj süresi A/D dönüştürücünün kararlı çalışmasını etkileyen önemli bir unsurdur. Şekil 7.5’te A/D dönüştürme işleminin işlem sırası gösterilmiştir.

Şekil 7.5 A/D Dönüştürme işleminin işlem sırası

Kazanç süresi (acquisition time) A/D modülünün tutma kondansatörünün harici voltaj kaynağına bağlanma süresini ifade eder. Ardından, GO bitinin kurulmasıyla birlikte bu sürenin 12 TAD değeri kadar dönüştürme süresi geçer. Bu iki sürenin toplamı “örnekleme zamanı” olur. A/D dönüşümünden arzu edilen kazancın elde edilmesi için, tutma kondansatörünün şarj olması gereken seviyeyi temin eden minimum bir kazanç süresi vardır.

Şekil 7.6’da ilgili analog girişin voltaj seviyesine şarj olan ve örnekleme işlemini yapan elektronik devre katının ilkesel şeması gösterilmiştir.

Şekil 7.6 Analog giriş modeli

Analog giriş modelinde yer alan kısaltmalar şu şekildedir:
CPIN = Giriş kondansatörü
VT = Eşik gerilimi
Isızıntı = Farklı bağlantılardan kaynaklı sızıntı akımı
RIC = Devre katlarının bağlantısından kaynaklı direnç
SS = Örnekleme (sampling) anahtarı
CHOLD = Örneklenen değeri tutma kondansatörü (DAC, dijital analog dönüştürücüden)

Uyku Modunda ADC İşlemi ve Analog Kesmenin Etkinleştirilmesi

ADC modülü uyku modunda çalışabilir. Bu işlem ADC çevrim saati kaynağı olarak FRC’nin seçimini gerektirir. FRC saat kaynağı olarak seçildiğinde, dönüştürme işlemi başlamadan önce ADC bir ilave komut süresi kadar bekler. Bu bekleme prosedürü, SLEEP komutunun işletilmesine fırsat tanır ve böylece dönüştürme sırasında sistem gürültüsü azaltılır. Eğer ADC kesmesi etkinleştirilirse, cihaz dönüştürme işlemi bitince uyku modundan uyanır. Eğer ADC kesmesi devre dışı bırakılırsa, ADC modülü, ADON biti kurulu kalmasına rağmen, dönüştürme işlemi bittikten sonra kapatılır.

ADC çevrim saati kaynağı FRC’den farklı seçildiğinde, bir uyku modu komutu (SLEEP), ADON biti kurulu bile olsa, mevcut dönüştürme prosesinin yarıda kesilmesine ve ADC modülünün kapatılmasına neden olur.

Analog kesme işlemi mikrodenetleyicinin uyku modunda çalıştığı durumlarda oldukça kullanışlı bir kesme prosesidir. A/D dönüştürme işleminin bitmesi genellikle iki yolla kontrol edilir. Bunlardan biri GO/ (DONE) bitinin temizlenmesini beklemek ya da ADIF (A/D dönüştürme kesme bayrağı) bayrağının kurulma durumunu izlemektir.

Analog kesme işleminin etkinleştirilmesi kitapta kullanılan A/D özellikli üç mikrodenetleyici için de (PIC12F675, PIC16F887, PIC18F2550) PIE1 kaydedicisinin 6.biti ADIE bitinin etkinleştirilmesiyle olur. Bunun için “PIE1.ADIE=1” yapılır.

Kesme bayrağının izlenmesi ise PIR1 kaydedicisinin 6.biti olan ADIF bayrağının kesme rutini içinde denetlenmesiyle olur. Bunun için “if(PIR1.ADIF)” komutuyla kesme işleminin olup olmadığı kontrol edilir. Kesme bayrağı otomatik olarak temizlenmez. Bu nedenle yazılım içinde temizlenmelidir.

A/D Dönüştürücü İle Işık İzleyen Oyuncak Yapımı

Servo motorların dış ortamdan gelen analog sinyallere bağlı olarak kumanda edilmesi robotik sistemlerde yaygın olarak kullanılan bir uygulamadır. Şekil 7.7’de 8 bacaklı PIC12F675 mikrodenetleyicisi kullanılarak gerçekleştirilmiş bir ışık izleme devresi gösterilmiştir. MCU’nun 4 analog kanalından AN0 ve AN1 kanalları giriş olarak tanımlanmıştır.

Işığa duyarlı devre elemanı LDR’nin, ışık şiddetine bağlı olarak değişen direnç değerine göre analog kanalların girişine uygulanan voltaj değeri değişmektedir. Her bir LDR’ye seri bağlı trimpotlar ile gerilim bölücü yapılmış ve şase ile LDR arası yalıtılarak direnç değişimine bağlı olarak değişen gerilim düşümü sağlanmıştır. Trimpotlar ile analog girişlerin tepki vereceği eşik değeri ayarlanmaktadır.

Şekil 7.7 A/D dönüştürücü ile çalışan servo motor devresi

Tablo 7.2 A/D dönüştürücü ile çalışan servo motor devresi mikroC kodu
	
// Servo tanımlamaları ve değişkenleri
#define MAKS_DEGER 200
#define CW_DONUS MAKS_DEGER  - 7
#define CCW_DONUS MAKS_DEGER - 24
#define ESIK_DEGERI 50
#define SERVO GPIO.GP4
#define LED GPIO.GP5
unsigned char maks_darbe=0;
unsigned char darbe_zirvesi=0;
unsigned char zirve_degeri = 0;
unsigned int i;
unsigned char ldr_sol;
unsigned char ldr_sag;
int ldr_fark;
void ayar(){
  TRISIO = 0X03;   //İlk iki port giriş yapıldı.
  GPIO = 0X00;
  /* Servo ayarlanıyor */
  maks_darbe=0;
  darbe_zirvesi=0;
  zirve_degeri = MAKS_DEGER; /* zirve_değeri = MAX_VALUE ise Servo durduruluyor */
  OPTION_REG = 0b10000000; // 1:2 ön ölçekleme değeri
  TMR0=206;  // Her 0.1 ms'de bir kesme, 2*(256-206)/1.000.000 = 0.1ms
  INTCON.TMR0IE = 1;  // TMR0 kesmesi etkinleştiriliyor
  INTCON.GIE = 1;    // Evrensel kesme etkin
  /* Port girişlerinin davranışı belirleniyor ve analog kanal ayarları yapılıyor */
  ANSEL = 0b00010011; /* A/D dönüştürme hızı FOSC/8. AN3 ve AN2 kanalı
  Dijital I/O diğerleri analog giriş yapıldı. */
}
void kontrol(){
 for(i=0;i<10;i++){
  LED = ~LED;
  Delay_ms(50);
 }
 LED=0;
}
static void interrupt(){
  if(TMR0IF_bit) {     // TIMER0 taşması gerçekleşmişse
    maks_darbe++;      // Maksimum darbe artırılıyor
    darbe_zirvesi++;   // Darbe zirvesi artırılıyor

    /* MAKS_DEGER=200 ise darbe değerleri sıfırlanıyor. */
    if (maks_darbe >= MAKS_DEGER) {
      maks_darbe=0;
      darbe_zirvesi=0;
      SERVO=0;              // GP4'ü durdur
    }
    /* zirve_degeri = MAKS_DEGER - n ise, n=7: 7 x 0.1ms = 0.7ms,
		n=24: 24 x 0.1ms = 2.4ms */
    /* 0.7ms -> CW Rotation, 2.4ms -> CCW Rotation*/
    if (darbe_zirvesi == zirve_degeri) {
      SERVO=1;              // GP4'ü sür
    }
    TMR0 = 206;             // 0.1ms kesme için ilk değer
    INTCON.TMR0IF = 0;      // TIMER0 kesme bayrağı temizleniyor
  }
}
void main(){
  ayar();
  kontrol();
  while(1) {
    /* ADC burada okunuyor */
    ADCON0=0B00000001;
	/* ADC portunun AN0 kanalı seçiliyor. A/D işlemi çalıştırılıyor */
    Delay_us(50); 
	/* ADC modülünün hazır hale gelmesi için kasıtlı bekleme yapılıyor */
    GO_DONE_bit=1;
    while(GO_DONE_bit) continue; /* ldr_sol dönüştürme işleminin bitmesi bekleniyor */
    ldr_sol=ADRESH;
	/* 8 bitlik MSB okunuyor, ADRESL'deki 2 bitlik LSB önemsenmiyor */
    ADCON0=0B00000101;
	/* ADC portunun AN1 kanalı seçiliyor. A/D işlemi çalıştırılıyor */
    Delay_us(50);
    GO_DONE_bit=1;
    while(GO_DONE_bit) continue;  /* ldr_sag dönüştürme işleminin bitmesi bekleniyor */
    ldr_sag=ADRESH;    /* 8 bitlik MSB okunuyor, ADRESL'deki 2 bitlik LSB önemsenmiyor */
    /* Fark hesaplanıyor */
    ldr_fark=ldr_sol - ldr_sag;
    if ((ldr_fark >= -ESIK_DEGERI) && (ldr_fark <= ESIK_DEGERI)) {
      zirve_degeri = MAKS_DEGER;     // Servo motor durduruluyor
    } else {
      if (ldr_fark > ESIK_DEGERI) {
        zirve_degeri = CCW_DONUS;  // Saat yönünün tersi dönüş
      } else {
        zirve_degeri = CW_DONUS;   // Saat yönü dönüş
      }
    }
  }
}

	

Şekil 7.8 Işık izleyen oyuncak

PIC12F675 10-bit çözünürlüğünde 4 kanal A/D işlemi yapabilir. Uygun TAD süresinin elde edilmesi için ANSEL kaydedicisi FOSC/8 değerine ayarlanmıştır. Böylece TAD değeri 2us olarak ayarlanmıştır.

ADC işleminin yapılması için kısaca bir özet yapmak gerekirse aşağıdaki adımlar izlenmelidir:

  • Port konfigürasyonu: A/D işlemi için kullanılacak portlar belirlenmelidir.
  • Kanal seçimi: A/D işlemi için hangi kanalların kullanılacağı belirlenmelidir.
  • ADC voltaj referansı: Pozitif ya da negatif bir voltaj referansı belirlenir. Böylece minimum ve maksimum voltaj aralığı tayin edilerek dönüştürme sonucu elde edilen değer bu aralıkta bir değere karşılık gelecek şekilde ADC modülünün çözünürlüğüne (8-bit ya da 10-bit, vb.) uygun olarak ayarlanır.
  • ADC çevrim saati kaynağı: ADC modülünün dâhili osilatörü ya da cihaz çalışma frekansının hangi katlarında çalışma yapılacağı belirlenir.
  • Kesme kontrolü: Dönüştürme işlemi bittikten sonra bir kesme işleminin yapılıp yapılmayacağı belirlenir.
  • Sonuç için bir format belirlenmesi: Dönüştürme sonucu elde edilen dijital değerin sağa ya da sola yaslı olacağı belirlenir.

NOT: PROTEUS-ISIS® gibi canlandırma programlarıyla devrenin tasarımı gerçekleştirilirken, LDR devre elemanının varsayılan direnç değerine dikkat edilmelidir. Piyasada farklı direnç değerinde LDR’ler olduğundan İlgili canlandırma programında da kullanıcıya değer seçme alternatifi sunulmaktadır. Sonuç olarak LDR’nin ortalama aydınlık koşullarındaki direnç değeri ADC dönüştürme sürecinde etkili olacaktır. Bu durum dikkate alınmalı ve LDR’ye seri bağlanacak direnç ya da trimpot ona göre seçilmelidir. Ayrıca kullandığınız LDR’ye göre yazılım içinde kalibrasyon yapmanız gerekebilir.

MikroC’de Analog-Dijital Dönüştürücü Kütüphanesinin Kullanımı

A/D işlemi ile ilgili buraya kadar anlatılan kısımda kütüphane kullanmadan, ilgili mikrodenetleyicinin kaydedicileri kullanılarak; dönüştürme işleminin nasıl yapıldığı, kaydedici ayarları, gerekli koşullar ve örnek bir uygulama gösterilmiştir. Bu ayarların sıkıntılı ve zahmetli geldiği durumlarda, mikrodenetleyicinin kaydedici ayarlarıyla uğraşmadan mikroC’nin ADC kütüphanesinden yararlanılabilir. MikroC’nin ADC kütüphanesinde üç temel fonksiyon bulunur. Bunlar:

  • ADC_Init();
    Bu fonksiyon PIC’in dâhili ADC modülünün RC saatiyle çalışmasını sağlar. Çevrim saati frekansı AD dönüşümü için gerekli zaman periyodunu belirler (en az 12TAD).
  • ADC_Get_Sample();
    Bu fonksiyon ile ilgili analog girişten işaretsiz 10-bit ya da 12-bit uzunluğunda tamsayı veri okunur. Bu rutin kullanılmadan önce ADC_Init() rutininin kullanılması gerekir. Bu rutinin kullanımı sırasında parantez içine okuma yapılacak analog kanal numarası yazılmalıdır.
  • ADC_Read(); Bu fonksiyon da ilgili analog girişten işaretsiz 10-bit ya da 12-bit uzunluğunda tamsayı veri okur. Ancak bunun kullanılmasıyla birlikte PIC’in dâhili RC saati de başlatılır. Gerekli çevrim saati süresi otomatik olarak ayarlanır. Bu rutinin kullanımı sırasında parantez içine okuma yapılacak analog kanal numarası yazılmalıdır.

Şekil 7.9’da PIC16F887 kullanılarak yapılmış bir A/D dönüştürme devresi gösterilmiştir. MCU’nun 2 numaralı analog girişi olan RA2 (AN2) pinine 10kΩ’luk bir potansiyometre bağlanmıştır. Potansiyometrenin orta noktası maksimum ve minimum değer aralığında değiştirildiğinde 10-bitlik çıkış hattında potansiyometrenin % değerine karşılık gelen dijital değerin çıktısı LED’ler yardımıyla gösterilir. Örnek bir hesap yapacak olursak;

Devrede dikkat edileceği üzere potansiyometrenin iki yan ucu voltaj referansı olarak kullanılmıştır. Dolayısıyla GND-VDD arası 5V yapmaktadır. 10-bitlik ADC dönüşüm 210-1 = 1023 adımlık bir hassasiyete sahip olduğundan sistemin tepki verebileceği minimum voltaj adımı = 5V/1023 = 4,88mV olur.

Ancak PROTEUS simülasyonunda potansiyometre %1’lik adımlarla değiştirilebilmektedir. Bu nedenle %50, yani orta noktada, 2,5V’luk bir gerilim ölçümü sağlanır. Bu gerilimin 10 bitlik dijital değer karşılığı,

Dijital değer = 2,5/0,00488 = 511

olarak hesaplanır. Elde edilen dijital değer sağa yaslı olduğunda ilk 8-bit ADRESL kaydedicisinde ve 2 MSB biti de ADRESH kaydedicisinde yer alır.

Şekil 7.9 ADC kütüphanesiyle 10-bitlik analog-dijital dönüştürme

Tablo 7.3 Bitlere göre ağırlık değerleri
Bitler9876543210
Dec5122561286432168421
5110111111111
Tablo 7.4 ADC kütüphanesiyle 10-bitlik analog-dijital dönüştürme mikroC kodu

unsigned int temp_res;
void main() {
  ANSEL  = 0x04;              // AN2 pini analog olarak ayarlanıyor
  ANSELH = 0;                 // Diğer AN pinleri dijitale ayarlanıyor
  C1ON_bit = 0;               // Karşılaştırıcılar kapatılıyor
  C2ON_bit = 0;
  
  TRISA  = 0xFF;              // PORTA giriş
  TRISC  = 0;                 // PORTC çıkış
  TRISB  = 0;                 // PORTB çıkış

  do {
    temp_res = ADC_Read(2);   // AD dönüştürmenin 10-bit sonucu alınıyor
    PORTB = temp_res;         // Düşük 8 bit PORTB’ye yollanıyor
    PORTC = temp_res >> 8;    // 2 MSB biti RC1, RC0 pinlerine yollanıyor
  } while(1);
}


Harici Voltaj Referanslı ADC Uygulaması

Bu uygulamada voltaj referans girişi olarak VDD ve VSS besleme girişleri alınmıştır. Voltaj aralığı farklı olan sinyallerin doğru şekilde dijitale çevrilmesi için 0-5V dönüşümünün yapılması gerekir. Bu işlem için genellikle OPAMP (İşlemsel Kuvvetlendirici) devreleri kullanılır.

PIC mikrodenetleyicileri voltaj referans girişi ayarlanabilir denetleyicilerdir. Böylece analog voltaj aralığı daha farklı kaynaklar için 0-5V dönüşümü yapmak zorunda kalmadan dijitale dönüştürme işlemi kolayca gerçekleştirilebilir.

Şekil 7.10’da PIC16F877A kullanılarak gerçekleştirilmiş bir uygulama devresi gösterilmiştir. Devrede voltaj referans girişi olarak AN3 ve AN2 analog girişleri kullanılmıştır. AN2 analog girişi şaselenmiş ve AN3 girişine 5V’luk DC kaynak bağlanmıştır. Böylece maksimum 5-0 = 5V aralığında ADC dönüşümü yapılmaktadır. Dönüştürülen değerin LCD ekrana yaklaşık değerde verilebilmesi için bir ölçek ayarlaması yapılmalıdır. ADC sistemi 10bit olduğundan ölçülen maksimum voltaj aralığı 210 – 1 = 1023 adıma oranlanır. Böylece her bir dijital adıma karşılık gelecek voltaj değeri tespit edilmiş olur.

En yüksek voltaj adımı = (Vref+ - Vref-)/(2ADC bit-1) = 5/(210-1) = 5/1023 = 0,00489V

AN3 ve AN2 analog girişlerini voltaj referansı olarak ayarlamak için PIC16F877A’nın ADCON1 kaydedicisi kullanılır. ADCON1 kaydedicisinin ilk dört biti lojik-1 yapıldığında AN3 pini Vref+, AN2 pini Vref- ve AN0 pini analog kanal olarak ayarlanır. Diğer analog kanallar dijital I/O olarak ayarlanmış olur.

Şekil 7.10 PIC16F877A ile harici voltaj referanslı ADC dönüşümü

Tablo 7.5 PIC16F877A ile harici voltaj referanslı ADC dönüşümü mikroC kodu

// Lcd ayarları
sbit LCD_RS at RD2_bit;
sbit LCD_EN at RD3_bit;
sbit LCD_D4 at RD4_bit;
sbit LCD_D5 at RD5_bit;
sbit LCD_D6 at RD6_bit;
sbit LCD_D7 at RD7_bit;
// Pin yönleri
sbit LCD_RS_Direction at TRISD2_bit;
sbit LCD_EN_Direction at TRISD3_bit;
sbit LCD_D4_Direction at TRISD4_bit;
sbit LCD_D5_Direction at TRISD5_bit;
sbit LCD_D6_Direction at TRISD6_bit;
sbit LCD_D7_Direction at TRISD7_bit;
unsigned int temp_res, desimal, res;
char des_deger[7];
char analog_deger[14];
char analog_yedek[14]="0. ";
char txt_sub[4] = "0.0";
unsigned char i=0;
float voltaj, doub;
char msg01[] = "Voltaj = ";
char msg02[] = "Dijital=";
char tek[] ="0";
void main() {
 Lcd_Init(); // LCD'yi hazırla
 Lcd_Cmd(_LCD_CLEAR); // Ekranı temizle
 Lcd_Cmd(_LCD_CURSOR_OFF); // Kursörü kapat
 LCD_OUT(1,1,msg01);
 LCD_OUT(2,1,msg02);
 OPTION_REG=0X07;
 ADCON0 = 0b11000000; // Kanal AN0 analog, diğerleri dijital, FRC clock
 ADCON1 = 0b00001111; // AN3 +Vref, AN2 -Vref, AN0 ve AN1 analog diğerleri dijital
 CMCON = 0X07; // Karşılaştırıcıları kapat;
 TRISA = 0x01; // A0 giriş
 TRISB = 0; // PORTB çıkış
 TRISC = 0; // PORTC çıkış
 TRISD = 0; // PORTD çıkış
 TRISE = 0; // PORTE çıkış
 PORTA = 0, PORTB = 0; PORTC = 0; PORTD = 0; PORTE = 0;
 do {
  temp_res = ADC_Read(0); // 10-bit'lik sonucu al, ADC dönüşüm yapılıyor
  PORTC = temp_res; // Düşük 8 bit'lik bilgiyi PORTC'ye gönder
  PORTE = temp_res >> 8; // 2 MSB bitini RE1 ve RE0'a gönder
  voltaj= (temp_res*0.00489);
  IntToStr(temp_res, des_deger);
  LCD_OUT(2,9,des_deger);
  FloatToStr(voltaj, analog_deger);
  analog_deger[4]=0;
  if(voltaj>=1){
   LCD_OUT(1,10,analog_deger); 
  }
  if(voltaj<1){
   analog_yedek[2]=analog_deger[0];
   analog_yedek[3]=analog_deger[2];
   if(temp_res<31){
    res = strcpy(analog_yedek,txt_sub);
   }
   LCD_OUT(1,10,analog_yedek);
  }
 LCD_OUT(1,14,"V");
} while(1);}

Yeni nesil yüksek performanslı 8-bit mikrodenetleyicilerinden 16(L)F18424—44 mikrodenetleyicisiyle birlikte, Microchip firması 12-bitlik ADC2 (Analog Digital Converter with Computation) teknolojisini sunmuştur. Bu hesaplamalı ADC modülünde ayarlanabilir tut ve örnekle kapasitör dizisi bulunur. Böylece örnekleme süresi olan TAD değeri de ayarlanabilmektedir. Bu özellik değişen hızlarda örnekleme yapılabilmesini sağlar.

Karşılaştırıcı (Comparator) Modülü

Karşılaştırıcılar iki analog girişi karşılaştırıp sonucunda aradaki fark nispetinde değişen genişlikte ve sabit genlikli dijital çıkış üreten devrelerdir. Çoğu mikrodenetleyicide bu işlemi gerçekleştiren “Comparator-Karşılaştırıcı” modülü bulunur. Karşılaştırıcı modülü OPAMP (İşlemsel Yükselteç-Operational Amplifier) elektronik devre bileşenlerinin yapmış olduğu karşılaştırma işlemine ilkesel olarak benzerlik gösterir. Analog karşılaştırma işleminin ilkesel davranışı Şekil 7.11’de gösterilmiştir. Şekilde yer alan siyah alanlar giriş ofset değeri ve tepki süresinden kaynaklı belirsizlikleri ifade etmektedir.

Karşılaştırıcının OPAMP’larda olduğu gibi evirmeyen (+) ve eviren (-) olmak üzere iki girişi vardır. Şekilde görüldüğü üzere Vin+ ve Vin- olarak isimlendirilen sinyaller bu girişlere uygulanmıştır. Vin+ girişi değişen genlikli analog işaretin verildiği giriş olarak gösterilmiştir. Vin- girişi ise kesikli çizgiyle gösterilmiştir. Çıkış polaritesinde evirme (tersleme) işlemi yapılmıyorsa, evirmeyen girişe uygulanan sinyal genliği eviren girişe uygulanan sinyal genliğinden yüksek olduğunda lojik-1 seviyesinde çıkış alınır. Aksi durumda çıkıştan lojik-0 alınır.

Şekil 7.11 Karşılaştırıcının çalışma ilkesi

Karşılaştırıcılar özellikle farklı noktalardan alınan algılayıcı bilgilerine bağlı olarak tepkisel çıkış üretmesi istenen ve bu çıkışa göre davranış gösteren otomatik kontrol sistemlerinde (sıcaklık kontrolü, su seviye kontrolü, vb.) tercih edilirler.

Bu başlık altında PIC16F887 mikrodenetleyicisinin karşılaştırıcı modülü açıklanacaktır. PIC16F887’nin karşılaştırıcı modülü bağımsız olarak kontrol edilebilen iki adet karşılaştırıcıya sahiptir. Kendi sınıfı içinde çok güçlü ve çok yönlü bir modüle sahip olması nedeniyle bu mikrodenetleyici tercih edilmiştir.

Mikrodenetleyicilerin karşılaştırıcı modülleri karmaşık bir dizi analog elektronik devre bloklarından oluşur. Bu sayede fazla kod yazmadan işletilebilen ve ana programdan bağımsız analog sinyal kontrolü uygulamaları yapılabilir. Karşılaştırıcı modülü aşağıdaki özelliklere sahiptir:

  • Bağımsız karşılaştırıcı kontrolü
  • Programlanabilir giriş seçimi
  • Karşılaştırıcı çıkışı dâhili ya da harici olarak sunulabilir
  • Programlanabilir çıkış polaritesi
  • Portta değişim olduğunda kesme üretimi
  • Uyku modundan uyanma
  • PWM kapatma
  • Timer1 kapısı (yalnızca C2 karşılaştırıcısının Timer1 modülüne bağlantısı vardır)
  • Timer1 saat girişine çıkış senkronizasyonu
  • SR tutma
  • Programlanabilir ve sabit voltaj referansı

Karşılaştırıcı Kontrolü

Her karşılaştırıcı ayrı bir kontrol ve konfigürasyon kaydedicisine sahiptir. Bu kaydedicilerin işlevi kısaca listelendiği gibidir:

  • CM1CON0: C1 karşılaştırıcısının kontrol kaydedicisidir.
  • CM2CON0: C2 karşılaştırıcısının kontrol kaydedicisidir.
  • CM2CON1: C2 kaydedicisinin Timer1 modülünün giriş kaynağı gibi davranmasını sağlayan ve onunla ilgili işlemleri kontrol eden kaydedicidir. Ayrıca her iki karşılaştırıcı çıkışının da eş zamanlı olarak birer ayna kopyasını almayı sağlama işlevi vardır.

CM1CON0 ve CM2CON0 kaydedicileri ortak olarak aşağıdaki kontrol ve durum bitlerine sahiptir:

  • Etkinleştirme: İlgili karşılaştırıcıyı etkinleştirmek için kullanılır.
  • Giriş seçimi: Karşılaştırıcıların eviren girişlerine MCU’nun hangi pininin bağlanacağı seçilebilir. Böylece tek bir karşılaştırıcı eviren girişine birden fazla veri kanalından çoktan seçme (MUX) devresiyle bağlama yapılabilir.
  • Referans seçimi: Referans girişi olarak kullanılan evirmeyen karşılaştırıcı girişine hangi pinin bağlanacağı belirlenir.
  • Çıkış seçimi: Çıkışın MCU’nun çıkış pininden mi yoksa dâhili olarak mı alınacağı belirlenir.
  • Çıkış polaritesi: Çıkış voltaj seviyesinin evrilip evrilmeyeceği belirlenir.

CM1CON0: C1 KARŞILAŞTIRICISI KONTROL KAYDEDİCİSİ (ADRES: 107h – PIC16F887)

bit 7 C1ON: C1 karşılaştırıcısı etkinleştirme biti
1 = C1 karşılaştırıcısı etkin
0 = C1 karşılaştırıcısı kapalı
bit 6 C1OUT: C1 karşılaştırıcısı çıkış biti

Eğer C1POL = 1 ise (evrilmiş polarite):
C1VIN+ > C1VIN- olduğunda C1OUT = 0
C1VIN+ < C1VIN- olduğunda C1OUT = 1

Eğer C1POL = 0 ise (evrilmemiş polarite):
C1VIN+ > C1VIN- olduğunda C1OUT = 1
C1VIN+ < C1VIN- olduğunda C1OUT = 0
bit 5 C1OE: C1 karşılaştırıcısı çıkış etkinleştirme biti
1 = Çıkış MCU’nun C1OUT pinine aktarılır.
0 = C1OUT yalnızca dâhili olarak sunulur (fiziksel olarak çıkış pinine aktarılmaz).
bit 4 C1POL: C1 karşılaştırıcısı polarite seçme biti
1 = C1OUT çıkış sinyali lojik olarak terslenir.
0 = C1OUT çıkış sinyali lojik olarak terslenmez.
bit 3 Kullanılmıyor: '0' olarak okunur.
bit 2 C1R: C1 karşılaştırıcısı referans seçim biti (evirmeyen giriş)
1 = C1VIN+ girişi C1VREF çıkışına bağlanır.
0 = C1’in C1VIN+ girişi MCU’nun C1IN+ pinine bağlanır.
bit 1-0 C1CH<1:0>: C1 karşılaştırıcısı kanal seçim biti (eviren giriş)
00 = MCU’nun C12IN0- pini C1’in C1VIN- pinine bağlanır.
01 = MCU’nun C12IN1- pini C1’in C1VIN- pinine bağlanır.
10 = MCU’nun C12IN2- pini C1’in C1VIN- pinine bağlanır.
11 = MCU’nun C12IN3- pini C1’in C1VIN- pinine bağlanır.

C1 karşılaştırıcısının basitleştirilmiş blok diyagramı Şekil 7.12’de gösterilmiştir. C1ON biti lojik-0 yapıldığında XOR kapısına lojik-0 çıkışı gönderilir. Q1 ve Q3 saat çevrimleri dört fazlı sistem saati çevriminin adımlarını ifade etmektedir. Q1 sinyali uyku modunda lojik-1 seviyesinde tutulmak suretiyle sistemin uyku modunda da çalışmaya hazır halde tutulması sağlanır.

Şekil 7.12 C1 karşılaştırıcısının basitleştirilmiş diyagramı

CM2CON0: C2 KARŞILAŞTIRICISI 0 NUMARALI KONTROL KAYDEDİCİSİ (ADRES: 108h – PIC16F887)

bit 7 C2ON: C2 karşılaştırıcısı etkinleştirme biti
1 = C2 karşılaştırıcısı etkin
0 = C2 karşılaştırıcısı kapalı
bit 6 C2OUT: C2 karşılaştırıcısı çıkış biti

Eğer C2POL = 1 ise (evrilmiş polarite):
C2VIN+ > C2VIN- olduğunda C2OUT = 0
C2VIN+ < C2VIN- olduğunda C2OUT = 1

Eğer C2POL = 0 ise (evrilmemiş polarite):
C2VIN+ > C2VIN- olduğunda C2OUT = 1
C2VIN+ < C2VIN- olduğunda C2OUT = 0
bit 5 C2OE: C2 karşılaştırıcısı çıkış etkinleştirme biti
1 = Çıkış MCU’nun C2OUT pinine aktarılır.
0 = C2OUT yalnızca dâhili olarak sunulur (fiziksel olarak çıkış pinine aktarılmaz).
bit 4 C2POL: C2 karşılaştırıcısı polarite seçme biti
1 = C2OUT çıkış sinyali lojik olarak terslenir.
0 = C2OUT çıkış sinyali lojik olarak terslenmez.
bit 3 Kullanılmıyor: '0' olarak okunur.
bit 2 C2R: C2 karşılaştırıcısı referans seçim biti (evirmeyen giriş)
1 = C2’in C2VIN+ girişi C2’nin C2VREF çıkışına bağlanır.
0 = C2’in C2VIN+ girişi MCU’nun C2IN+ pinine bağlanır.
bit 1-0 C2CH<1:0>: C2 karşılaştırıcısı kanal seçim biti (eviren giriş)
00 = MCU’nun C12IN0- pini C2’in C1VIN- pinine bağlanır.
01 = MCU’nun C12IN1- pini C2’in C1VIN- pinine bağlanır.
10 = MCU’nun C12IN2- pini C2’in C1VIN- pinine bağlanır.
11 = MCU’nun C12IN3- pini C2’in C1VIN- pinine bağlanır.

C2 karşılaştırıcısının basitleştirilmiş blok diyagramı Şekil 7.13’te gösterilmiştir. Görüleceği üzere C2’nin Timer1 modülü ile olan ilişkisi dışında diğer tüm özellikler C1 karşılaştırıcısıyla aynıdır. C2ON biti lojik 0 yapıldığında XOR kapısına lojik-0 çıkışı gönderilir. Q1 ve Q3 saat çevrimleri dört fazlı sistem saati çevriminin adımlarını ifade etmektedir. Q1 sinyali uyku modunda lojik-1 seviyesinde tutulmak suretiyle sistemin uyku modunda da çalışmaya hazır halde tutulması sağlanır.

Şekil 7.13 C2 karşılaştırıcısının basitleştirilmiş diyagramı

Şekil 7.14’te C1 karşılaştırıcısını ve eviren giriş olarak 4 analog kanalı kullanan bir uygulama devresi gösterilmiştir. Devrede RB7 pinine bağlı buton yardımıyla sırasıyla 4 analog kanaldan biri seçilmektedir. Karşılaştırıcının eviren girişi olarak kullanılan her bir analog kanal girişine ışığa duyarlı eleman olan LDR bağlanmıştır.

Seçilen analog kanaldaki bilgi, evirmeyen giriş kanalı RA3/C1IN+ pinine bağlı potansiyometre ile ayarlanmış olan voltaj seviyesiyle karşılaştırılmaktadır. Karşılaştırma sonucu RA4/C1OUT pinine bağlı LED yardımıyla dijital olarak alınmaktadır. O an için hangi kanalın aktif olduğunu görebilmek için sırasıyla ilgili kanalı simgeleyen ve D portuna bağlanmış olan LED’ler aktif olmaktadır.

RB7 pinine bağlı buton mikrodenetleyicinin port durum değişim kesmesini kullanarak çalışmaktadır. PIC16F887, B portunun her bir pini bağımsız olarak ayarlanabilme özelliğine sahiptir. Dahili zayıf çekme direncinin (weak pull-up) aktif kılınması için OPTION_REG kaydedicisinin (RBPU) ̅ bitine ek olarak WPUB (Weak Pull-Up port B) kaydedicisinin de ayarlanması gerekir. Benzer şekilde, port durum değişim kesmesi için INTCON kaydedicisinin RBIE bitine ek olarak IOCB (Interrupt On-Change port B) kaydedicisinin de ayarlanması gerekir.

Şekil 7.14 C1 karşılaştırıcısı ile 4 kanal analog giriş uygulaması

Tablo 7.6 C1 karşılaştırıcısı ile 4 kanal analog giriş uygulaması mikroC kodu

#define BUTON PORTB.RB7
#define KONTROL PORTD.RD0
#define CIKIS1 PORTD.RD1
#define CIKIS2 PORTD.RD2
#define CIKIS3 PORTD.RD3
#define CIKIS4 PORTD.RD4
unsigned char i, giris=0;
void ayar(){
/* Bu kısımda giriş/çıkış durumuna göre portların ayarı yapılır. */
 TRISA.RA0 = 1; //C12IN0- giriş olarak ayarlanıyor
 TRISA.RA1 = 1; //C12IN1- giriş olarak ayarlanıyor
 TRISA.RA3 = 1; //C1 evirmeyen girişi C1IN+ giriş olarak ayarlanıyor
 TRISA.RA4 = 0;
 TRISB.RB1 = 1; //C12IN3- giriş olarak ayarlanıyor
 TRISB.RB3 = 1; //C12IN2- giriş olarak ayarlanıyor
 TRISB.RB7 = 1; //RB7 buton için giriş yapılıyor
 PORTA = 0;
 PORTB = 0x80; //RB7 başlangıçta lojik-1 seviyesine çekiliyor
 TRISC = 0X00;
 PORTC = 0;
 TRISD = 0X00;
 PORTD = 0;
 TRISE = 0X00;
 PORTE = 0;
 OPTION_REG = 0; // dâhili pull-up'lar aktif
 WPUB=0X80; // RB7 pini için dâhili pull-up etkin
 IOCB=0X80; // RB7 pini için port durum değişim kesmesi etkin
 /* Bu kısımda port girişlerinin davranışı belirlenir ve
 analog kanal ayarları yapılır. */
 ANSEL = 0XFF; //Tüm AN kanalları analog olarak ayarlandı
 ANSELH = 0XFF; //Tüm AN kanalları analog olarak ayarlandı
 INTCON.GIE = 1;
 INTCON.RBIE = 1;
 OSCCON=0X70; /* Osilatör dâhili 8MHz ve OSC pinlerinin davranışı
 CONFIG1 konfigürasyon sözcüğüne göre ayarlanıyor */
 /* Bu kısımda C1 karşılaştırıcısının ayarları yapılır. */
 CM1CON0.C1ON = 1; //C1 açılıyor
 CM1CON0.C1OE = 1; //C1 çıkışı RA4/C1OUT pininden alınıyor
 CM1CON0.C1POL = 0; //Çıkış polaritesi terslenmiyor
 CM1CON0.C1R = 0; //C1 evirmeyen girişi RA3/C1IN+ olarak ayarlanıyor
 CM1CON0.C1CH0 = 0; //
 CM1CON0.C1CH1 = 0; // C1IN- girişi olarak C12IN0- seçiliyor
 Delay_ms(50);
}
void kontrol(){
 for(i=0;i<10;i++){
  KONTROL = ~KONTROL;
  Delay_ms(50);
 }
 KONTROL=0;
}
void main(){
 ayar();
 kontrol();
 while(1) {
  switch(giris){
   case 0:
    CIKIS4=0;
    CIKIS1=1;
    CM1CON0.C1CH0 = 0; //
    CM1CON0.C1CH1 = 0; // C1IN- girişi olarak C12IN0- seçiliyor
   break;
   case 1:
    CIKIS1=0;
    CIKIS2=1;
    CM1CON0.C1CH0 = 1; //
    CM1CON0.C1CH1 = 0; // C1IN- girişi olarak C12IN1- seçiliyor
   break;
   case 2:
    CIKIS2=0;
    CIKIS3=1;
    CM1CON0.C1CH0 = 0; //
    CM1CON0.C1CH1 = 1; // C1IN- girişi olarak C12IN2- seçiliyor
   break;
   case 3:
    CIKIS3=0;
    CIKIS4=1;
    CM1CON0.C1CH0 = 1; //
    CM1CON0.C1CH1 = 1; // C1IN- girişi olarak C12IN3- seçiliyor
   break;
  }
 }
}
void interrupt(){
 if(INTCON.RBIF){
  if(!BUTON){
   giris++;
   if(giris>3) giris=0;
  }
  INTCON.RBIF=0;
 }
}

CM2CON1: C2 KARŞILAŞTIRICISI 1 NUMARALI KONTROL KAYDEDİCİSİ (ADRES: 109h – PIC16F887)

bit 7 MC1OUT: C1OUT bitinin aynalanmış bir kopyası alınır. Bu bit belleği C1OUT karşılaştırıcı çıkışının mevcut değerinin bir kopyasını tutar. Böylece C1 karşılaştırıcısının fiziki çıkış pinini (RA4/T0CKI/C1OUT) kullanmak zorunda kalmadan, karşılaştırıcının mevcut değerini MCU’nun boşta olan başka bir pinine yönlendirebilirsiniz. PIC16F887’de görüldüğü üzere fiziki C1 çıkış pini aynı zamanda harici Timer0 saat darbesi girişidir. Bu hattı T0CKI özelliğiyle kullanmak istediğiniz bir karşılaştırıcı uygulamasında, örnek olarak aşağıdaki gibi bir kodlamayla C1 karşılaştırıcı sonucunu D portunun RD0 pininden alabilirsiniz:
PORTD.RD0 = CM2CON1.MC1OUT;
bit 6 MC2OUT: C2OUT bitinin aynalanmış bir kopyası alınır. Bu bit belleği C2OUT karşılaştırıcı çıkışının mevcut değerinin bir kopyasını tutar.
bit 5 C1RSEL: C1 karşılaştırıcısı referans seçme bitidir.
1 = MCU’nun CVREF pini C1 karşılaştırıcısının C1VREF girişine yönlendirilir.
0 = Mutlak voltaj referansı (0.6) C1 karşılaştırıcısının C1VREF girişine yönlendirilir.
bit 4 C2RSEL: C2 karşılaştırıcısı referans seçim bitidir.
1 = MCU’nun CVREF pini C2 karşılaştırıcısının C2VREF girişine yönlendirilir.
0 = Mutlak voltaj referansı (0.6) C2 karşılaştırıcısının C2VREF girişine yönlendirilir.
bit 3-2 Kullanılmıyor: '0' olarak okunur.
bit 1 T1GSS: Timer1 kapı kaynağı seçim biti
1 = Timer1 kapı kaynağı T1G
0 = Timer1 kapı kaynağı SYNCC2OUT
bit 0 C2SYNC: Comparator C2 Output Synchronization bit
1 = Çıkış Timer1 saat darbesinin düşen kenarıyla senkronizedir.
0 = Çıkış asenkrondur.

Şekil 7.15’deki devrede C1 ve C2 karşılaştırıcılarının her ikisini de ve CM2CON1 kaydedicisinin ayna çıkışlarını kullanan bir uygulama devresi gösterilmiştir. Devrede görüleceği üzere harici Timer0 girişi (T0CKI) kullanılmıştır. Harici zaman darbesi girişinden gelen darbelere göre zaman kesmesi üretilmekte ve belli aralıklarla (uygulamaya göre 10sn’lik aralıklarla) karşılaştırıcı girişleri kontrol edilmektedir. Karşılaştırıcı çıkışları CM2CON1 kaydedicisinin MC1OUT ve MC2OUT bitleri yardımıyla MCU’nun RD0 ve RD1 pinlerinden alınmaktadır. Böylece fiziki C1 çıkış pini (C1OUT), harici Timer0 saat darbesi girişi olarak tahsis edilmiştir. Aynı şekilde haberleşme bölümünde göreceğimiz SPI iletişim modunda köle seçimi (SS - Slave Select) olarak da kullanılan C2 çıkı pini (C2OUT) muhtemel bir SPI iletişimi uygulaması için boşa çıkartılmıştır.

Şekil 7.15 C1 ve C2 karşılaştırıcılarının ayna çıkışlarının kullanılması örneği

Uygulamada görüleceği üzere, karşılaştırıcıların eviren analog girişleri için pozitif sıcaklık katsayılı termistörler (PTC) kullanılmıştır. Program kodunda karşılaştırıcıların çıkış polariteleri terslenmektedir. Böylece, sıcaklık arttığında PTC dirençleri yükselmekte ve negatif giriş (eviren), pozitif girişten (evirmeyen) yüksek voltaj seviyesine ulaşınca polarite terslemesinden dolayı karşılaştırıcı çıkışları lojik-1 seviyesine ulaşmaktadır. Elde edilen karşılaştırıcı çıkış değerlerinin ayna değeri RD0 ve RD1 pinlerine yönlendirilmektedir. Her iki karşılaştırıcı çıkışı da lojik-1 olduğunda RC2/CCP1 pinine bağlı mosfet kontrollü 12V DC motor çalıştırılmaktadır.

Tablo 7.7 C1 ve C2 karşılaştırıcılarının ayna çıkışlarının kullanılması örneği mikroC kodu

#define MOTOR PORTC.RC2
#define MIRRORC1 PORTD.RD0
#define MIRRORC2 PORTD.RD1
unsigned char i;
void ayar(){
 /* Bu kısımda giriş/çıkış durumuna göre portların ayarı yapılır. */
 TRISA.RA0 = 1; //C12IN0- giriş olarak ayarlanıyor
 TRISA.RA1 = 1; //C12IN1- giriş olarak ayarlanıyor
 TRISA.RA2 = 1; //C2 evirmeyen girişi C2IN+ giriş olarak ayarlanıyor
 TRISA.RA3 = 1; //C1 evirmeyen girişi C1IN+ giriş olarak ayarlanıyor
 TRISA.RA4 = 1; //T0CKI hattı giriş olarak ayarlanıyor
 PORTA = 0;
 PORTB = 0;
 TRISC = 0;
 PORTC = 0;
 TRISD = 0;
 PORTD = 0;
 TRISE = 0;
 PORTE = 0;
 OPTION_REG.T0CS = 1; // Timer0 Clock-In girişi aktif, ayrıca prescaler 1:2
 TMR0 = 251; // (256-251)*2/T0CKI = 10/T0CKI, eğer T0CKI frekansı 1Hz ise
 // Timer0 kesmesinin oluşması için geçecek süre 10sn olur
 /* Bu kısımda port girişlerinin davranışı belirlenir ve analog kanal ayarları yapılır. */
 ANSEL = 0X0F; //A0-A3 kanalları analog diğerleri dijital I/O
 ANSELH = 0; //Tüm AN kanalları dijital I/O olarak ayarlandı
 INTCON.GIE = 1;
 INTCON.T0IE = 1;
 INTCON.PEIE = 1;
 OSCCON=0X70; /* Osilatör dâhili 8MHz ve OSC pinlerinin davranışı
 CONFIG1 konfigürasyon sözcüğüne göre ayarlanıyor */
 /* Bu kısımda C1 ve C2 karşılaştırıcılarının ayarları yapılır. */
 CM1CON0.C1ON = 1; //C1 açılıyor
 CM1CON0.C1OE = 0; //C1OUT dâhili
 CM1CON0.C1POL = 1; //Çıkış polaritesi tersleniyor
 CM1CON0.C1R = 0; //C1 evirmeyen girişi RA3/C1IN+ olarak ayarlanıyor
 CM1CON0.C1CH0 = 0; //
 CM1CON0.C1CH1 = 0; // C1IN- girişi olarak C12IN0- seçiliyor
 CM2CON0.C2ON = 1; //C2 açılıyor
 CM2CON0.C2OE = 0; //C2OUT dâhili
 CM2CON0.C1POL = 1; //Çıkış polaritesi tersleniyor
 CM2CON0.C1R = 0; //C2 evirmeyen girişi RA2/C2IN+ olarak ayarlanıyor
 CM2CON0.C1CH0 = 1; //
 CM2CON0.C1CH1 = 0; // C2IN- girişi olarak C12IN1- seçiliyor yapay gecikme yapılıyor 
}
void main(){
 ayar();
 while(1) {
 }
}
void interrupt(){
 if(INTCON.T0IF){
  MIRRORC1=CM2CON1.MC1OUT;
  MIRRORC2=CM2CON1.MC2OUT;
  if(MIRRORC1 && MIRRORC2){
   MOTOR=1;
  }
  if(!MIRRORC1 || !MIRRORC2){
   MOTOR=0;
  }
 }
INTCON.T0IF=0;
TMR0=251;
}

Karşılaştırıcı Kesmesi ve Uyku Modu

Karşılaştırıcı çıkış değerinde bir değişim meydana geldiğinde kesme bayrağının kurulması sağlanabilir. Karşılaştırıcı kesmesinin doğru kullanılabilmesi için bazı teknik ayrıntılara dikkat edilmelidir. Özellikle endüstriyel uygulamalarda yanlış kullanımdan kaynaklı istenmeyen kesme aktiviteleri oluşabilir. Her bir karşılaştırıcı modülü içinde eşleşmeme durumunu izleme devresi vardır. Karşılaştırıcı çıkışı Şekil 7.12 ve Şekil 7.13’te görüldüğü üzere D (Data) tipi flip-flop devresine aktarılmaktadır. Bu flip-flop türü EN (ENable) girişinden gelen darbelerin her yükselen kenarında D girişinde gözüken değeri çıkışa aktarma özelliğine sahiptir. EN girişinde darbe olmadığı durumda flip flop devresinin çıkış değeri sabit kalmaya devam eder. Bu nedenle bu tür devrelere tutma devresi (latch) denir. Kısacası bir sonraki darbeye kadar çıkış hattı bir önceki değerini korumaya devam eder.

Şekillerde görüldüğü üzere CMxCON0 kaydedicisi okunduğunda (Q3*RD_CMxCON0), tutma devrelerinden biri, değerini karşılaştırıcı çıkışı değeriyle günceller. Bu tutma devresi, bir sonraki okuma komutuna kadar ya da bir Reset işlemi gerçekleşene kadar değerini korur. Eşleşmeme durumunu izleyen devrenin diğer tutma devresi her Q1 darbesinde değerini güncellemektedir. Dolayısıyla Q1 darbesini izleyen tutma devresinin değişen karşılaştırıcı çıkışına kilitlenmesi durumunda, her iki tutma devresinin de çıkışlarının alındığı EX-OR (Exclusive-OR gate) kapısının girişinde farklılık olacağından çıkışta lojik-1 değeri üretilir ve bu değer PIR2 kaydedicisinin CxIF kesme kontrol bitine gönderilir. Eşleşmeme durumu, ilgili karşılaştırıcı kaydedicisi okunana kadar ya da karşılaştırıcı çıkışı bir önceki durumuna gelene kadar devam eder.

NOT1: CMxCON0 kaydedicisine yazma komutu (kaydedicinin tamamına ya da herhangi bir bitine) gerçekleştiğinde de eşleşmeme durumu ortadan kalkar. Çünkü her yazma komutu aynı zamanda yazma çevriminin başında okuma işlemi de içerir.
2: Karşılaştırıcı kesmeleri CxOE bitinin durumundan etkilenmeksizin doğru şekilde çalışmaya devam eder.

Karşılaştırıcı kesmesi eşleşmeme seviyesiyle değil eşleşmeme kenar tetiklemesiyle gerçekleşir. Bu, CMxCON0 kaydedicisiyle okuma/yazma işlemi yapmadan kesme bayrağının resetlenebileceği anlamına gelir. Eşleşmeme durumunu izleyen kaydediciler temizlendiğinde, karşılaştırıcının önceki durumuna dönmesine bağlı olarak bir kesme üretilecektir. Aksi takdirde, kesme üretilmeyecektir. Bu durumlar Şekil 7.16’da gösterilmiştir.

Şekil 7.16 Karşılaştırıcı modülünde kesmenin üretilmesi

Yazılım, CMxCON0 ya da CM2CON1 kaydedicilerinden okuma işlemi yapıldığı gibi, değişim olup olmadığını belirlemek için karşılaştırıcı çıkışının durumu hakkında bilgi alma ihtiyacı duyacaktır. PIR2 kaydedicisinin CxIF biti karşılaştırıcı kesme bayrağıdır. Bu bit yazılım içinde kendisine ‘0’ yazılarak temizlenmelidir. Ayrıca bu kaydediciye ‘1’ değeri de yazılabileceğinden kesme üretilebilir. Karşılaştırıcı kesmelerini etkinleştirmek için PIE2 kaydedicisinin CxIE biti ve INTCON kaydedicisinin PEIE ve GIE bitleri de kurulmalıdır. Her ne kadar PIR2 kaydedicisinin CxIF biti hala kurulu kalacak olsa da, bu bitlerden herhangi birinin kurulmaması durumunda kesme etkinleşmeyecektir.

NOT1: Bir okuma işlemi gerçekleştirilirken (Q3 çevriminin başlaması sırasında) CMxCON0 (CxOUT) değerinde bir değişim meydana geldiğinde PIR2 kaydedicisinin CxIF kesme bayrağı kurulmayabilir.
2: Her iki karşılaştırıcı da ilk etkinleştirildiklerinde, karşılaştırıcı modülünün besleme devresi dengeli hale gelene kadar karşılaştırıcının çıkışında geçersiz bir çıkış üretebilir. Bu nedenle, besleme devresinin dengeye oturması için 1us kadar beklenmeli (Delay_us(1); mikroC komutuyla ya da FOSC değerine bağlı olarak assembly’de birkaç adet NOP komutuyla), ardından karşılaştırıcı kesmeleri etkinleştirilmeden önce de kesme bayrakları temizlenmelidir.

Uyku moduna girmeden önce karşılaştırıcı etkinleştirilirse, Uyku (Sleep) sırasında aktif kalır. Karşılaştırıcının tükettiği ilave akım değeri Ek-E4’te PIC16F887’nin Elektriksel Özellikleri başlığında anlatılmıştır. Eğer karşılaştırıcı mikrodenetleyiciyi uyku modundan çıkartmada kullanılmayacaksa, uyku moduna girmeden önce kapatılabilir. Böylece ek bir akım tasarrufu sağlanmış olur. Karşılaştırıcı çıkışındaki bir değişim mikrodenetleyiciyi uyku modundan çıkartmaya yeter. Karşılaştırıcının, MCU’yu uyku modundan çıkartacak şekilde ayarlanması için INTCON kaydedicisinin PEIE ve GIE bitlerinin ve PIE2 kaydedicisinin CxIE bitinin kurulması gerektiği unutulmamalıdır. MCU’yu reset ettiren bir olay CMxCON0 ve CM2CON1 kaydedicilerini de reset durumuna sokar. Bu durum her iki karşılaştırıcının ve voltaj referanslarının kapalı durumuna girmesine yol açar.

Şekil 7.17’de her iki karşılaştırıcıyı da kullanan ve mikrodenetleyiciyi uyku modundan çıkartarak 12V DC motoru süren bir uygulama devresi gösterilmiştir. Karşılaştırıcı çıkışlarının her durum değişiminde kesme oluştuğundan (karşılaştırıcı kaydedicileri okuma işlemine tutulduğunda), karşılaştırıcı çıkışları kaydedicilerin okunması suretiyle kontrol edilmektedir. Eğer karşılaştırıcı çıkışları lojik-1 ise motor sürülmektedir. Aksi taktirde motor durdurulmaktadır. Analog karşılaştırıcıların eviren girişlerinin voltaj kontrolü 50 k’luk potansiyometreler ile yapılmaktadır. İsteğinize ve devreyi kullanım amacınıza göre, fiziksel değişime bağlı olarak direnç değişimi ilkesiyle çalışan herhangi bir algılayıcı da (termistör, LDR, yük sensörü, vb.) bağlayabilirsiniz.

Şekil 7.17 Uyku modunda C1 ve C2 karşılaştırıcıları kesme uygulaması

Tablo 7.8 Uyku modunda C1 ve C2 karşılaştırıcıları kesme uygulaması mikroC kodu

#define MOTOR PORTC.RC2
#define MIRRORC1 CM1CON0.C1OUT
#define MIRRORC2 CM2CON0.C2OUT
unsigned char i, kesme1, kesme2;
void ayar(){
/* Bu kısımda giriş/çıkış durumuna göre portların ayarı yapılır. */
 TRISA.RA0 = 1; //C12IN0- giriş olarak ayarlanıyor
 TRISA.RA1 = 1; //C12IN1- giriş olarak ayarlanıyor
 TRISA.RA2 = 1; //C2 evirmeyen girişi C2IN+ giriş olarak ayarlanıyor
 TRISA.RA3 = 1; //C1 evirmeyen girişi C1IN+ giriş olarak ayarlanıyor
 TRISA.RA4 = 0;
 TRISA.RA5 = 0;
 PORTA = 0;
 PORTB = 0;
 TRISC = 0;
 PORTC = 0;
 TRISD = 0;
 PORTD = 0;
 TRISE = 0;
 PORTE = 0;
 /* Bu kısımda port girişlerinin davranışı belirlenir ve
 analog kanal ayarları yapılır. */
 ANSEL = 0X0F; //A0-A3 kanalları analog diğerleri dijital I/O
 ANSELH = 0; //Tüm AN kanalları dijital I/O olarak ayarlandı
 INTCON.GIE = 1;
 INTCON.PEIE = 1;
 OSCCON=0X70; /* Osilatör dâhili 8MHz ve OSC pinlerinin davranışı
 CONFIG1 konfigürasyon sözcüğüne göre ayarlanıyor */
 /* Bu kısımda C1 ve C2 karşılaştırıcılarının ayarları yapılır. */
 CM1CON0.C1ON = 1; //C1 açılıyor
 CM1CON0.C1OE = 1; //C1OUT RA4 pininden alınacak
 CM1CON0.C1POL = 0;
 CM1CON0.C1R = 0; //C1 evirmeyen girişi RA3/C1IN+ olarak ayarlanıyor
 CM1CON0.C1CH0 = 0; //
 CM1CON0.C1CH1 = 0; // C1IN- girişi olarak C12IN0- seçiliyor
 CM2CON0.C2ON = 1; //C2 açılıyor
 CM2CON0.C2OE = 1; //C2OUT RA5 pininden alınacak
 CM2CON0.C2POL = 0;
 CM2CON0.C1R = 0; //C2 evirmeyen girişi RA2/C2IN+ olarak ayarlanıyor
 CM2CON0.C1CH0 = 1; //
 CM2CON0.C1CH1 = 0; // C2IN- girişi olarak C12IN1- seçiliyor
 //yapay gecikme yapılıyor
 C1IF_bit = 0;
 C2IF_bit = 0; //Kesmeler aktif edilmeden önce bayrakları temizleniyor
 asm{
  NOP;NOP;NOP;NOP; //Karşılaştırıcı modüllerinin besleme dengesi için yapay bekleme
 }
 PIE2.C1IE = 1; //C1 karşılaştırıcısı kesmesi aktif
 PIE2.C2IE = 1; //C2 karşılaştırıcısı kesmesi aktif
}
void main(){
 ayar();
 while(1) {
  if(kesme1 && kesme2) MOTOR=1;
  if(!kesme1 || !kesme2){
   MOTOR=0;
   asm{
    sleep;nop;
   }
  }
 }
}
void interrupt(){
 if(PIR2.C1IF){ // C1 kesmesi mi?
  if(MIRRORC1)kesme1=1;
  if(!MIRRORC1)kesme1=0;
  PIR2.C1IF=0;
 }
 if(PIR2.C2IF){ // C2 kesmesi mi?
  if(MIRRORC2)kesme2=1;
  if(!MIRRORC2)kesme2=0;
  PIR2.C2IF=0;
 }
}

Ek Karşılaştırıcı Özellikleri

Karşılaştırıcının bu anlatılanlar dışında iki tane daha ek özelliği vardır:

  1. Timer1 sayma etkinleştirme (kapı)
  2. Çıkışın Timer1 ile senkronize edilmesi

PIC16F887 mikrodenetleyicisinde Timer1 modülünün kapı etkinleştirme özelliği vardır. Timer1 modülünün T1CON kaydedicisinin TMR1GE biti lojik-1 yapıldığında bu özellik etkinleştirilmiş olur. Kapı etkinleştirildiğinde Timer1 modülünün TMR1H-TMR1L kaydedicileri CM2CON1 kaydedicisinin T1GSS bitine göre artış gösterir. CM2CON1 kaydedicisinin T1GSS biti temizlendiğinde (lojik-0) Timer1 kaydedicisi C2 karşılaştırıcısının çıkışına göre artar. Bu özellik yardımıyla analog olayların oluş aralığı ya da süresi zamanlanabilir. T1GSS biti kurulduğunda (lojik-1) RB5/AN13/(T1G) ̅ pininden gelen sinyalin durumuna göre artış sağlar.

Karşılaştırıcı Timer1 kapı kaynağı olarak kullanılacağı zaman, karşılaştırıcının Timer1 ile senkronize edilmesi tavsiye edilir. CM2CON1 kaydedicisinin C2SYNC bitini kurmak suretiyle, C2 karşılaştırıcısının çıkışı Timer1 ile senkronize edilir. C2’nin çıkışı Timer1 saat kaynağının düşen kenarında tutulur (latched). Eğer Timer1 önölçekleyicisi kullanılıyorsa, karşılaştırıcı çıkıcı ön ölçekleme değeri nispetinde tutulur. Daha ayrıntılı bilgi için Şekil 7.13’e ve Şekil 7.18’e bakabilirsiniz.

Şekil 7.18 PIC16F887’nin Timer1 blok yapısı

Karşılaştırıcı SR (Set-Reset) Tutma Özelliği

SR (Set-Reset) tutma özelliği karşılaştırıcı çıkışlarına ek bir kontrol özelliği kazandırır. Modül tek bir SR tutma devresi ve çıkışta çoktan seçicilerden (multiplexer-MUX) oluşur. SR tutma devresi set edilebilir, resetlenebilir ya da geçişli (toggle) ayarlanabilir. SR tutma devresi ayrıca, SRCON kontrol kaydedicisinin ilgili bitleri yardımıyla karşılaştırıcı çıkışından bağımsız olarak set ya da reset edilebilir. SR tutma devresinin çıkış MUX’ları, karşılaştırıcı çıkışını ya da tutma devresi çıkışını I/O portuna yönlendirmeyi sağlar.

Şekil 7.19 SR tutma devresi basitleştirilmiş blok diyagramı

SRCON: SR TUTMA DEVRESİ KONTROL KAYDEDİCİSİ (ADRES: 185h – PIC16F887)

bit 7: SR1: SR tutma devresi konfigürasyon bitidir. SR tutma devresi çıkışının I/O pinine aktarılabilmesi için öncesinde ilgili CxOE bitinin kurulması ve TRIS komutuyla da çıkış ayarının yapılması gerekir.
1 = Tutma devresinin Q çıkışı C2OUT pinine yönlendirilir.
0 = C2 karşılaştırıcısının çıkışı C2OUT pinine yönlendirilir.
bit 6 SR0: SR tutma devresi konfigürasyon bitidir. SR tutma devresi çıkışının I/O pinine aktarılabilmesi için öncesinde ilgili CxOE bitinin kurulması ve TRIS komutuyla da çıkış ayarının yapılması gerekir.
1 = Tutma devresinin Q çıkışı C1OUT pinine yönlendirilir.
0 = C2 karşılaştırıcısının çıkışı C1OUT pinine yönlendirilir.
bit 5 C1SEN: C1 SET etkinleştirme bitidir.
1 = C1 karşılaştırıcısının çıkışı SR tutma devresini kurar.
0 = C1 karşılaştırıcısının çıkışı SR tutma devresini etkilemez.
bit 4 C2REN: C2 RESET etkinleştirme bitidir.
1 = C2 karşılaştırıcısının çıkışı SR tutma devresini resetler.
0 = C2 karşılaştırıcısının çıkışı SR tutma devresini etkilemez.
bit 3 PULSS: SR tutma bitinin SET girişini tetikler.
1 = SR tutma devresini kurmak için darbe üretecini çalıştırır. Bit donanım tarafından hemen resetlenir.
0 = Darbe üretecini çalıştırmaz.
bit 2 PULSR: SR tutma bitinin RESET girişini tetikler.
1 = SR tutma devresini resetlemek için darbe üretecini çalıştırır. Bit donanım tarafından hemen resetlenir.
0 = Darbe üretecini ettiklemez.
bit 1 Kullanılmıyor: ‘0’ olarak okunur.
bit 0 FVREN: Sabit voltaj referansı etkinleştirme bitidir.
1 = INTOSC LDO’dan 0.6V referans etkileştirilir.
0 = INTOSC LDO’dan 0.6V referans pasifleştirilir.

Tutma devresi, bir saat kaynağına bağlı olmayan (bu yönüyle flip-flop devrelerinden ayrılır) Set-Reset özellikli bir devredir. Set-Reset girişlerinin her biri aktif yüksek (lojik-1) seviyelidir. SR tutma devresinin her iki girişi de bir karşılaştırıcı çıkışına ve yazılım kontrollü darbe üretecine bağlıdır. Tutma devresi C1OUT ile ya da SRCON kaydedicisinin PULSS bitiyle set edilebilir. Benzer şekilde, C2OUT ile ya da SRCON kaydedicisinin PULSR bitiyle resetlenebilir. Tutma devresi baskın olarak reset özelliklidir. Çünkü her iki girişi de aktif yüksek seviyede olduğunda tutma devresi reset durumuna geçer.

NOT: Tutma devresinin S ve R olarak iki girişi olduğu gibi Q ve Q olarak iki çıkışı vardır. Tutma devresinin S girişi lojik-1 ve R girişi lojik-0 olduğunda Q çıkışı lojik-1 olur. R girişi lojik-1 yapıldığında ise Q çıkışı lojik-0 olur. Q çıkışı Q çıkışının tersi olarak işlem görür. Diğer bir ifadeyle Q’nun lojik değeri neyse, Q tersi lojik değere sahiptir.

Karşılaştırıcı Voltaj Referansı

Karşılaştırıcı voltaj referansı modülü karşılaştırıcılar için programlanabilir voltaj referansı üretmeyi sağlayan bir modüldür. Karşılaştırıcılarla yapılan uygulamalarda son derece kullanışlı bir modüldür. Daha önceki uygulamalarda (Şekil 7.14, 7.15 ve 7.17) voltaj referansı olarak, C1IN+ ve C2IN+ girişlerine bağlanan potansiyometrelerle ayarlanan VSS-VDD kaynak gerilimi kullanılmıştı. Bu modül yardımıyla, mikrodenetleyiciyi besleyen VDD gerilim kaynağının ya da harici bir kaynağın programlanarak ayarlanan bir değeri referans olarak kullanılır. Voltaj referans modülü aşağıdaki özelliklere sahiptir:

  • Karşılaştırıcının çalışmasından bağımsızdır
  • İki farklı hassasiyette 16 adımlı voltaj aralığı
  • Çıkış VSS’ye kenetlenebilir
  • VDD ile rasyometriktir (VDD’nin değişiminden etkilenir)
  • Sabit referans (0,6V)

Aşağıda açıklandığı üzere VRCON kaydedicisi voltaj referans modülünü ayarlamak için kullanılır.

VRCON: VOLTAJ REFERANSI KONTROL KAYDEDİCİSİ (ADRES: 97h – PIC16F887, CVRCON: FB5h – PIC18F2550)

bit 7: VREN: Karşılaştırıcı voltaj referansı etkinleştirme bitidir.
1 = CVREF devresine enerji verilir.
0 = CVREF devresi kapatılır.
bit 6 VROE: Karşılaştırıcı VREF çıkış etkinleştirme bitidir.
1 = CVREF voltaj seviyesi aynı zamanda RA2/AN2/VREF-/CVREF/C2IN+ pininden de alınır.
0 = CVREF voltaj seviyesi RA2/AN2/VREF-/CVREF/C2IN+ pininden yalıtılır.
bit 5 VRR: CVREF voltaj aralığı seçim bitidir.
1 = Düşük aralık
0 = Yüksek aralık
bit 4 VRSS: Karşılaştırıcı VREF voltaj aralığı seçim bitidir.
1 = Karşılaştırıcı referans kaynağı, CVRSRC = (VREF+) – (VREF-)
0 = Karşılaştırıcı referans kaynağı, CVRSRC = VDD - VSS
bit 3-0 VR<3:0>: CVREF değer seçimi bitleridir ve bitlerin değeri 0 ≤ VR<3:0> ≤ 15 aralığında değişir.
VRR = 1 olduğunda: CVREF = (VR<3:0>/24) * VDD
VRR = 0 olduğunda: CVREF = VDD/4 + (VR<3:0>/32) * VDD

Voltaj referans modülünün çalışma ilkesi Şekil 7.20’de gösterilmiştir. Referans seviyesi olarak kullanılacak analog voltaj değeri, 16 dirençli R-2R modeli merdiven tipi dijital-analog dönüştürücü (DAC) devresi üzerinden seçilir. VRCON kaydedicisinin VRSS bitiyle referans kaynağı dâhili ya da harici olarak seçilebilir. Karşılaştırıcının voltaj referansı karşılaştırıcının konfigürasyonundan ayrıdır. VREN biti kurulduğunda voltaj referansı etkinleşir.

VR bitleriyle çıkış referans voltajı olan CVREF voltajı 16 kademeli olarak aşağıdaki formüle göre belirlenir:

DİKKAT: Mikrodenetleyicilerde ADC ya da karşılaştırıcı gibi analog işlemler yaparken mikrodenetleyicinin elektriksel limitleri dikkate alınmalıdır. VDD-VSS kaynağının dışında bir kaynak kullanılacağı takdirde mikrodenetleyicinin sınırları dışında voltaj yüklemesi yapılmamalıdır. Normal şartlarda çoğu PIC mikrodenetlyicisi 2,0 – 5,5V aralığında çalışmaya uygundur. Her bir pinden en fazla ne kadar akım çekilebileceği, en yüksek güç tüketimi, ideal çalışma sıcaklıkları altında ve diğer aralıklarda elde edilen tepki değerleri, vb. ilgili mikrodenetleyicinin elektriksel nitelikleri başlığı (Electrical Specifications) altında açıklanmaktadır. Bu kitapta da PIC16F887’nin önemli başlıca elektriksel nitelikleri Ek-E4’te açıklanmıştır.

Voltaj referansı olarak besleme kaynağından farklı harici kaynak kullanılmasının sebebi kısaca iki nedenle açıklanabilir:

  1. MCU’nun besleme kaynağına ek bir yük bindirmemek,
  2. bit/mV birimiyle ifade edilen ve mili volt başına bit çözünürlüğü değerine göre tepki veren sensörler için arzu edilen hassasiyeti elde etmek.

Şekil 7.20 Karşılaştırıcı voltaj referansı blok diyagramı

CVREF çıkış voltajı ek bir güç tüketimi olmadan VSS’ye kenetlenebilir. Bu işlem VRCON kaydedicisinin bitleri aşağıdaki gibi ayarlandığında gerçekleşir:

  • VREN = 0
  • VRR = 1
  • VR<3:0> = 0000

CMxCON0 kaydedicilerinin CxR bitleri ve CM2CON1 kaydedicisinin CxRSEL bitleri lojik-1 yapıldığında ilgili karşılaştırıcının CxIN+ girişine CVREF bağlanır. VRCON kaydedicisi yukarıdaki gibi ayarlandığında ilgili karşılatırıcının evirmeyen girişine VSS şase hattı yönlendirilmiş olur. Bu ayarlamalar karşılaştırıcının, ilave CVREF modülü akımı tüketmeden sıfır kesimi algılaması (zero-crossing detection, ayrıntılı bilgi için bkz. 4.10) gerçekleştirmesini sağlar.

Sabit voltaj referansı (SabitRef) VDD kaynağından bağımsızdır. Nominal çıkış voltajı 0,6V’tur. Bu referans SRCON kaydedicisinin FVREN biti kurularak etkinleştirilebilir. Bu referans, HFINTOSC (dâhili yüksek frekans osilatör) osilatör modu aktif olduğunda her zaman etkindir.

ÖNEMLİ: Sabit voltaj referansı modülü etkinleştirildiğinde, kuvvetlendirici devresinin çıkışının dengeye gelmesi bir miktar süreye ihtiyaç duyacaktır. Bu nedenle kullanıcının yazılım içinde yapay bir geciktirme yapması faydalı olacaktır. Mikrodenetleyicinin bu işlem için ihtiyaç duyduğu minimum gecikme Ek-E4’te Elektriksel Özellikler başlığı altında açıklanmıştır.

Tablo 7.9’da ADCON1 kaydedicisinin CFG1 ve CFG0 bitleriyle, VRCON kaydedicisinin VRSS ve VROE bitlerine göre RA3 ve RA2 pinlerinin almış olduğu görevler ve voltaj referans tercihleri gösterilmiştir.

Tablo 7.9 Karşılaştırıcı ve ADC Voltaj Referans Önceliği
RA3RA2Karşılaştırıcı
Referans (+)
Karşılaştırıcı
Referans (-)
ADC
Referans (+)
ADC
Referans (-)
CFG1CFG0VRSSVROE
I/OI/OAVDDAVSSAVDDAVSS0000
I/OCVREFAVDDAVSSAVDDAVSS0001
VREF+VREF-VREF+VREF-AVDDAVSS0010
VREF+CVREFVREF+AVSSAVDDAVSS0011
VREF+I/OAVDDAVSSVREF+AVSS0100
VREF+CVREFAVDDAVSSVREF+AVSS0101
VREF+VREF-VREF+VREF-VREF+AVSS0110
VREF+CVREFVREF+AVSSVREF+AVSS0111
I/OVREF-AVDDAVSSAVDDVREF-1000
I/OVREF-AVDDAVSSAVDDVREF-1001
VREF+VREF-VREF+VREF-AVDDVREF-1010
VREF+VREF-VREF+VREF-AVDDVREF-1011
VREF+VREF-AVDDAVSSVREF+VREF-1100
VREF+VREF-AVDDAVSSVREF+VREF-1101
VREF+VREF-VREF+VREF-VREF+VREF-1110
VREF+VREF-VREF+VREF-VREF+VREF-1111

Şekil 7.21’de karşılaştırıcı voltaj referansını kullanarak gerçekleştirilmiş bir batarya şarj voltajı izleme uygulaması gerçekleştirilmiştir. Devrede DC 12V’luk akülerin şarj durumunun izlenebilmesi için bir dizi düzenleme yapılmıştır. DC 12V, mikrodenetleyicinin girişlerinde referans seviyesi olarak kullanılmaya uygun bir voltaj seviyesi değildir. Bu nedenle UA741 OPAMP entegresi gerilim izleyici (voltage follower) gibi kullanılarak MCU için uygun voltaj aralığı elde edilmiştir. CVREF seviyesi için MCU’nun VDD – VSS beslemesi seçilmiş ve dolayısıyla DC 5V ile çalıştırılan bir MCU için VRCON kaydedicisinin VR<3:0> bitleri ‘1011’ şeklinde ayarlanarak 2,97V’luk CVREF değeri elde edilmiştir. Burada amaç 12V’luk bataryanın gerilim değeri 11V seviyelerine düştüğünde devrenin ikaz vermesini sağlamaktır. Bu nedenle OPAMP’ın evirmeyen girişine bağlanan direnç grubu, OPAMP çıkışında 2,97V seviyesine uygun olacak şekilde seçilmiştir.

UA741 OPAMP entegresi gerilim izleyici olarak kullanılırken yalnızca pozitif kaynak ile beslenmiştir. R3 direnci üzerinden verilen akü ya da batarya grubunun gerilim değeri 12V olduğunda OPAMP çıkışında, dolayısıyla C1 karşılaştırıcısının C12IN0- eviren girişinde 3,20V değeri elde edilir. Bu değer hesaplanan CVREF değerinden büyük olduğu için sistem ikaz vermez. Ancak akü ya da batarya grubunun voltaj seviyesi 11V dolaylarına indiğinde, OPAMP çıkışı 2,93V seviyesine iner ve bu durumda sistem fasılalı olarak ikaz verir.

Şekil 7.21 Voltaj referans modülüyle batarya şarj izleme devresi

Uygulamada dâhili 8 MHz (HFINTOSC) osilatörü kullanılmıştır. Gerçek uygulamada, derleme öncesinde Project→Edit Project pencersinden INTOSCIO ya da INTOSC osilatör tercihlerinin yapılması unutulmamalıdır. Voltaj şarj değeri izlenen akü ya da batarya grubundan ciddi derecede akım geçişini önlemek için gerilim bölücü olarak davranan R3 ve R4 dirençlerinin değeri büyük seçilmiştir. Bilindiği üzere OPAMP’lar yüksek giriş direncine sahip olduklarından giriş akımları 0’a yakındır. Tüm akım dirençler üzerinden akar. Bu akımı daha fazla düşürmek için R3 ve R4 dirençlerinin değeri oransal olarak 100kΩ’lar mertebesinde seçilebilir. OPAMP’lar ile yapılan gerilim izleyicilerde, gerilim bölücü üzerinden elde ettiğiniz gerilim kayba uğramadan mikrodenetleyicinin ilgili girişinde gözükür.

Tablo 7.10 Voltaj referans modülüyle batarya şarj izleme devresi mikroC kodu

unsigned char i;
void ayar(){
 /* Bu kısımda giriş/çıkış durumuna göre portların ayarı yapılır. */
 TRISA = 0x05; //C12IN0- ve CVREF giriş olarak ayarlanıyor
 PORTA = 0;
 PORTB = 0;
 TRISC = 0;
 PORTC = 0;
 TRISD = 0;
 PORTD = 0;
 TRISE = 0;
 PORTE = 0;
 /* Bu kısımda port girişlerinin davranışı belirlenir ve
 analog kanal ayarları yapılır. */ 
 ANSEL = 0X0F; //A0-A3 kanalları analog diğerleri dijital I/O
 ANSELH = 0; //Tüm AN kanalları dijital I/O olarak ayarlandı
 OSCCON=0X70; /* Osilatör dâhili 8MHz ve OSC pinlerinin davranışı
 CONFIG1 konfigürasyon sözcüğüne göre ayarlanıyor */
 /* Bu kısımda C1 karşılaştırıcısının ayarları yapılır. */
 CM1CON0.C1ON = 1; //C1 açılıyor
 CM1CON0.C1OE = 0; //C1OUT RA4 pininden alınmayacak
 CM1CON0.C1POL = 0; //Voltaj terslemesi yapılmayacak
 CM1CON0.C1R = 1; //C1 evirmeyen girişi C1VREF olarak ayarlanıyor
 CM1CON0.C1CH0 = 0; //
 CM1CON0.C1CH1 = 0; // C1IN- girişi olarak C12IN0- seçiliyor
 CM2CON1.C1RSEL = 1; //CVREF C1 karşılatırıcısının C1VREF girişine veriliyor
 VRCON = 0B10001011;//Voltaj referans modülü açılıyor,2.97V CVREF elde ediliyor
 asm{
  nop;nop;nop;nop;nop; //voltaj seviyesinin oturması için yapay bekleme
 }
 VRCON.VROE=1; //CVREF gerilimi aynı zamanda CVREF pininden de alınıyor
 asm{
  nop;nop;nop;nop;nop;
 }
}
void ikaz_ver(){
 for(i=0;i<5;i++){
  IKAZ = ~IKAZ;
  Delay_ms(100);
 }
}
void main(){
 ayar();
 while(1){
  if(MIRRORC1) ikaz_ver();
 }
}

Dijital Analog Dönüştürme (DAC) Modülü

Bilindiği üzere mikrodenetleyiciler belirli bir voltaj aralığında lojik-1 ve lojik-0 ikilik değerleriyle çalışan sistemlerdir. Ara voltaj değerleri elde etmemiz için kısaca DAC (Digital Analog Converter) diye bilinen dijital analog dönüştürücülerden yararlanmamız gerekir.

Bazı PIC mikrodenetleyicilerinde dâhili dijital analog dönüştürücü modülü bulunmaktadır. Ancak mikrodenetleyicilerde dijital analog dönüştürme işlemi için genellikle harici entegre devre sistemleri kullanılmaktadır. Çoğunlukla bu sistemler SPI iletişim protokolü ile haberleşir. Bölüm 9.2.2.’de SPI iletişim protokolünü kullanan MCP4921 DAC entegresiyle dijital analog dönüştürme uygulaması anlatılmıştır.

Bu bölümde dâhili DAC modülüne sahip ve son derece zengin özellikleri olan PIC12F1840 mikrodenetleyicisi anlatılacaktır. Bu mikrodenetleyicinin, ekstra düşük voltaj teknolojisine sahip (XLP) LF serisi modeli de bulunmaktadır. Bu mikrodenetleyici dâhili DAC modülü sayesinde harici bir dönüştürücü gerektirmeden dijital analog dönüşümü gerçekleştirebilir.

DAC modülü; 32 seçilebilir seviyeli ve girişle rasyometrik olan değişken bir voltaj referansı sunar. DAC modülünün girişi:

  • Harici VREF pinlerine,
  • VDD besleme kaynağına,
  • FVR’ye (Fixed Voltage Reference – Sabit Voltage Referansı) bağlanabilir.

DAC’ın çıkışı:

  • Karşılaştırıcı pozitif girişine,
  • ADC giriş kanalına,
  • DACOUT pinine ve
  • Kapasitif algılama modülüne referans voltajı sunacak şekilde ayarlanabilir.

DAC, DACCON0 kaydedicisinin DACEN biti ayarlanarak etkinleştirilebilir. DAC çıkış geriliminin nasıl elde edildiği Tablo 7.12’de gösterilmiştir.

Tablodan görüleceği üzere analog çıkış gerilimi (VOUT) hiçbir zaman tam olarak kaynak gerilimine (VSOURCE+) eşit olmamaktadır. DAC modülünü etkinleştiren DACEN pini kurulduğunda ve kaynak gerilimi VDD olarak ayarlandığında, en yüksek çıkış gerilimi DACR pinlerinin ‘11111’ olarak ayarlanması durumunda elde edilir. Bu durumda VDD gerilimi 5V olarak düşünülürse;

VOUT = 5x(31/32)=4,84V olarak elde edilir.

Tablo 7.12 DAC çıkış voltajının hesaplanması

Şekil 7.22’de Dijital Analog Dönüştürücü modülünün blok diyagramı gösterilmiştir.

Şekil 7.22 DAC modülü blok diyagramı

FVRCON: SABİT VOLTAJ REFERANSI KONTROL KAYDEDİCİSİ (ADRES: 197h – PIC12F1840)

bit 7: FVREN: Sabit voltaj referansı etkinleştirme bitidir.
1 = Sabit voltaj referansı modülü etkinleştirilir.
0 = Sabit voltaj referansı modülü kapatılır.
bit 6 FVRRDY: Sabit voltaj referansının hazır olduğunu bildiren bayrak bitidir.
1 = Sabit voltaj referansı çıkışı kullanım için hazırdır. Bu bit PIC12F1840 için her zaman lojik-1’dir. Düşük voltaj özellikli olan PIC12LF1840 için kullanılan bir bittir.
0 = Sabit voltaj referansı çıkışı kullanım için hazır değil ya da etkinleştirilmedi.
bit 5 TSEN: Sıcaklık göstergesi etkinleştirme bitidir.
1 = Sıcaklık göstergesi etkin
0 = Sıcaklık göstergesi kapalı
bit 4 TSRNG: Sıcaklık göstergesi aralığı seçim bitidir.
1 = VOUT = VDD – 4VT (yüksek aralık)
0 = VOUT = VDD – 2VT (düşük aralık)
bit 3-2 CDAFVR<1:0>: Karşılaştırıcı ve DAC Sabit Voltaj Referansı seçim bitleridir. Sabit Voltaj Referansı çıkış gerilimi VDD gerilimini aşamaz.
00 = Karşılaştırıcı, DAC ve CPS (CaPacitive Sensing) modülü Sabit Voltaj Referansı aygıt çıkışı kapalı
01 = Karşılaştırıcı, DAC ve CPS modülü Sabit Voltaj Referansı aygıt çıkışı 1x (1,024V)
10 = Karşılaştırıcı, DAC ve CPS modülü Sabit Voltaj Referansı aygıt çıkışı 2x (2,048V)
11 = Karşılaştırıcı, DAC ve CPS modülü Sabit Voltaj Referansı aygıt çıkışı 4x (4,096V)
bit 1-0 ADFVR<1:0>: ADC Sabit Voltaj Referansı seçim bitleridir.
00 = ADC Sabit Voltaj Referansı aygıt çıkışı kapalı
01 = ADC Sabit Voltaj Referansı aygıt çıkışı 1x (1,024V)
10 = ADC Sabit Voltaj Referansı aygıt çıkışı 2x (2,048V)
11 = ADC Sabit Voltaj Referansı aygıt çıkışı 4x (4,096V)

DACCON0: DİJİTAL ANALOG DÖNÜŞTÜRÜCÜ KONTROL KAYDEDİCİSİ 0 (ADRES: 198h – PIC12F1840)

bit 7: DACEN: DAC etkinleştirme bitidir.
1 = DAC etkin
0 = DAC kapalı
bit 6 DACLPS: DAC düşük güç voltaj durumu seçim bitidir.
1 = DAC pozitif referans kaynağı seçilir.
0 = DAC negatif referans kaynağı seçilir.
bit 5 DACOE: DAC voltaj çıkışı etkinleştirme bitidir.
1 = DAC voltaj seviyesi aynı zamanda DACOUT pininden de alınır.
DİKKAT: Analog sinyalin doğrudan başka elektronik devrelerde ya da elemanlarla birlikte kullanımı mikrodenetleyiciye zarar verebilir. Bu nedenle analog sinyalin dış ortamda kullanımını gerektiren durumlarda Şekil 7.23’te gösterildiği gibi DACOUT pinine tampon devresi bağlanmalıdır. Tampon devresi, Şekil 7.21’deki uygulamada kullanılan gerilim izleyici modunda OPAMP entegresiyle yapılabilir. Çıkış kondansatörü 0,1uF kutuplu olabilir.

Şekil 7.23 DACOUT pinine tampon devresinin bağlanması

0 = DAC voltaj seviyesi DACOUT pininden yalıtılır.
bit 4 Kullanılmıyor: Lojik-0 olarak okunur.
bit 3-2 DACPSS<1:0>: DAC pozitif kaynak seçim bitleridir.
00 = VDD
01 = VREF pin
10 = FVR tampon2 çıkışı
11 = Rezerve edilmiştir, kullanmayınız
bit 1 Kullanılmıyor: Lojik-0 olarak okunur.
bit 0 DACNSS: DAC negatif kaynak seçim bitleridir.
1 = VREF-
0 = VSS

DACCON1: DİJİTAL ANALOG DÖNÜŞTÜRÜCÜ KONTROL KAYDEDİCİSİ 1 (ADRES: 199h – PIC12F1840)

bit 7-5 Kullanılmıyor: Lojik-0 olarak okunur.
bit 4-0 DACR<4:0>: DAC voltaj seviyesi belirleme bitleridir. DAC modülü 32 seviyelidir ve 25 = 32 adımlı analog voltaj seviyesi bu bitlerce belirlenir.

Şekil 7.24’te gösterilen uygulama ile 5V DC kaynaktan yaklaşık 50Hz frekanslı testere dişi gerilimin elde edilmesi gösterilmiştir. 0-5V arası yükselip alçalan analog gerilim, işlenmek üzere OPAMP ile gerçekleştirilmiş gerilim izleyicili tampon devresine uygulanmıştır. Tampon devresi çıkışındaki gerilim güvenli şekilde uygun referans düzenleyici ve filtre devreleriyle -2,5V – 2,5V arasında ya da daha yüksek genlikle salınım yapan sinüsoidal gerilime dönüştürülebilir.

Şekil 7.24 PIC12F1840 ile DAC uygulaması

OPAMP devresinin çıkışına basit bir RC devresi ile alçak geçiren filtre devresi bağlanarak testere dişi sinyalin sinüs dalgasına dönüşümü sağlanmıştır. Yüksek frekanslı sinyaller kondansatör üzerinden şaselenmektedir. Kondansatör ve direnç değerleri geçmesi istenen üst frekans değerine göre hesaplanır. Kondansatör değerinin çok küçük seçilmesi durumunda sinyal değişime uğramadan olduğu gibi alınır. Bu nedenle uygun değer seçiminde Denklem 7.1’den yararlanılır ve kesim frekansı hesabı yapılır. Kesim frekansı, güç kaybının yarı yarıya gerçekleştiği ya da sinyal genliğinin √2/2 katı kadar zayıfladığı frekanstır (cut-off frequency - fc).

fc=1/2πRCDenklem 7.1

Şekil 7.25 Alçak geçiren filtrede frekans tepkisi

Kesim frekansında genlik olarak desibel cinsinden oluşan kayıp Denklem 7.2 ile hesaplanır.

Denklem 7.2

Kesim frekansını yaklaşık olarak 100 Hz dolaylarında belirlersek R = 1,5 kΩ ve C = 1 uF değerlerinin ideal sonucu vereceği görülecektir. Böylece 50 Hz’lik testere dişi sinyalimiz güç kaybına uğramadan sinüs dalga formu elde edilecek şekilde filtrelenmiş olur. Şekil 7.26’da testere dişi sinyalin ve sinüs dalgasının gösterildiği osiloskop ekranı yer almaktadır.

Şekil 7.26 DAC çıkışı ve filtrelenmiş durumu

Tablo 7.13’te gösterilen uygulamanın gerçek fiziki devrede de çalışması için konfigürasyon sözcüklerinin ayarlanmasını sağlayan proje düzenleyicisi (Project Edit) penceresinin Şekil 7.27’de gösterildiği gibi ayarlanması yerinde olacaktır. Uygulama devresi 8 MHz dâhili osilatör ile gerçekleştirilmiştir. Uygun frekansın elde edilmesi Timer0 kesmesi kullanılarak gerçekleştirilmiştir. Söz konusu uygulamada yakşalık 20 msn’lik (50Hz) bir periyot elde edilmiştir. ‘while()’ döngüsü içindeki ‘sure’ değişkeni değerini ayarlamak suretiyle belli bir aralıkta farklı frekans değerleri elde edebilirsiniz

Şekil 7.27 PIC12F1840 ile DAC uygulaması için konfigürasyon sözcüklerinin ayarlanması


char i;
unsigned int sure;
void ayar(){
 ANSELA=0x01; //AN0 analog diğerleri dijital I/O
 OSCCON=0B01110000; //8MHZ dâhili HFINTOSC
 FVRCON=0; //Sabit voltaj referansı modülü kapalı
 OPTION_REG = 0B00000000; //Timer0 prescaler 1:2
 DACCON0.DACEN=1; //DAC modülü açılıyor
 DACCON0.DACLPS=1; //Pozitif referans kaynağı
 DACCON0.DACOE=1; //DAC voltaj seviyesi DACOUT pininden alınır
 DACCON0.DACPSS1=0;
 DACCON0.DACPSS0=0; //DAC pozitif kaynağı VDD
 TRISA = 0X01; //DACOUT pini giriş olarak ayarlanıyor
 PORTA = 0;
 LATA = 0;
 INTCON.GIE=1;
 INTCON.T0IE=1;
 TMR0=255;
}
void main() {
 ayar();
 DACCON1=0; //0B00000000;
 Delay_ms(100);
 while(1){
  for(i=0;i<32;i++){
   while(sure<35);
   sure=0;
   DACCON1++;
  }
  for(i=0;i<32;i++){
   while(sure<34);
    sure=0;
    DACCON1--;
  }
 }
}
void interrupt(){
 if(INTCON.TMR0IF){//Timer0 kesmesi 1us'ye ayarlandı
  sure++;
  TMR0=255;
  INTCON.TMR0IF=0;
 }
}


Kapasitif Algılama Modülü (Capasitive Sensing Module – mTouch™)

Kapasitif algılama modülü PIC12F1840 ile dâhili olarak sunulmuş ve harici bir elektronik donanıma gerek duymadan yakın mesafeden algılama gerçekleştiren bir çevresel aygıt donanımıdır. Bu tür donanımlar membran panel gibi dokunmatik olarak çalışan tuşların ve butonların yerine kullanılabilir. Yeni nesil ev elektroniği aletlerinde, LCD ekranların kontrolünde, otomobillerde vb. alanlarda günlük yaşamda karşımıza çıkan bir teknolojidir.

PIC12F1840 mikrodenetleyicisinin 4 adet kapasitif algılama özellikli pini vardır. PCB olarak hazırlayacağınız bir pedi bu girişlerden birine bağladığınızda ve gerekli kaydedici ayarlamalarını yaptığınızda basitçe çalışacak bir yakın mesafe algılayıcısı tasarlamış olursunuz. Pede parmağınızı yaklaştırdığınızda, ayarladığınız mesafeden algılama gerçekleşecektir.

Temel çalışma ilkesi, bu girişlerin kapasitif yükleme etkisine karşı gösterdikleri hassasiyetle ilgilidir. Yaklaşım gerçekleştiğinde kapasitif yükleme etkisiyle birlikte frekans kayması meydana gelir. Timer modülleri kullanılarak frekansta gerçekleşen bu kayma tespit edilir. Şekil 7.28’de Timer0 ve Timer1 modüllerinin kapasitif algılama osilatörüyle birlikte kullanımı gösterilmiştir. Yapılacak uygulamada Timer0 frekans üreteci için zaman kaynağı, Timer1 ise R/C osilatörünü sayıcı olarak olarak kullanılır.

Şekil 7.28 Kapasitif algılama blok diyagramı

Bu modülün kullanımı oldukça kolaydır. Kapasitif algılama modülü analog kanal üzerinden çalışır. Kısaca ilgili kanaldan okuma yapmak için şu adımlar izlenir:

  • CPSCON1 kaydedicisinin CPSCH bitleri ayarlanarak arzu edilen CPS<3:0> kanalı seçilir.
  • Karşılık gelen analog kanal ANSEL kaydedicisiyle ayarlanır.
  • Karşılık gelen TRIS komutuyla pin giriş olarak ayarlanır.
  • Yazılım algoritması işletilir.

Kapasitif algılama osilatörü üçgen dalga üretecek sabit bir akım kaynağına sahiptir. CPSCON0 kaydedicisinin CPSOUT biti akımın kapasitif algılama osilatörüne girdiğini mi (sink) yoksa osilatörden çıktığını mı (source) göstermektedir. Osilatör bir PCB ped şeklinde tasarlanmış bir kapasitif yükü sürecek şekilde tasarlanmıştır ve aynı zamanda Timer0 ya da Timer1 için saat darbesi kaynağı olur. Osilatör, CPSCON0 kaydedicisinin CPSRNG<1:0> bitleriyle tanımlanan 3 farklı akım moduna sahiptir. Osilatör için farklı akım modlarının olması iki duruma hizmet eder:

  • Belli bir zaman aralığında zamanlayıcının daha yüksek saymasını sağlamak.
  • Frekansta değişim meydana geldiğinde zamanlayıcıdaki sayma farkını arttırmak.

Kapasitif algılama osilatörü, osilasyonun başlaması için iki voltaj eşiği sağlayan voltaj referansı tekniğini kullanır. Üst voltaj eşiği Ref+, alt voltaj eşiği Ref- olarak isimlendirilir. Kullanıcı, kapasitif algılama osilatörüne dâhil sabit voltaj referansından ya da FVR modülü ve DAC modülü tarafından sağlanan ayarlanabilir voltaj referansından ikisi arasında tercih yapabilir. Tercih işlemi CPSCON0 kaydedicisinin CPSRM bitiyle yapılır. Sabit voltaj referansları seçildiğinde, VSS alt voltaj eşiği Ref-‘i, VDD ise üst voltaj eşiği Ref+’yı belirler.

Ayarlanabilir voltaj referansları kullanıldığında, DAC voltajı alt eşik değerini (Ref-), FVR ise üst voltaj eşiğini (Ref+) belirler. Bu ayarlanabilir referansları kullanmanın avantajı, VDD’deki değişimlerde frekansın sabit kalmasıdır. Ayarlanabilir voltaj referansları kullanılarak farklı osilasyon frekansları elde edilebilir. Üst voltaj referansı daha fazla düşürüldükçe ve alt voltaj referansı da daha fazla yükseltildikçe daha yüksek kapasitif algılama osilatörü frekansı elde edilir.

Bu açıklanan çalışma modlarının kısa özeti Tablo 7.14’te sunulmuştur.

Tablo 7.14 Voltaj referanslarına göre akım modları
CPSRMMenzilCPSRNG<1:0>ModuNominal Akım
0Düşük00Kapalı0.0 uA
01Düşük0.1 uA
10Orta1.2 uA
11Yüksek18 uA
1Yüksek00Gürültü Algılama0.0 uA
01Düşük9 uA
10Orta30 uA
11Yüksek100 uA

Şekil 7.29’da PROTEUS programının TOUCHPAD aracı kullanılarak gerçekleştirilmiş uygulama devresi gösterilmiştir. Yapılan kaydedici ayarları ve mikrodenetleyicinin çalışma frekansına bağlı olarak, canlandırma devresinde kullanılan pedin değerleri ölçülmüştür. Başlangıçta yaklaşık 13500 dolaylarında bir algılama değeri elde edilmektedir. Canlandırmanın üstündeki el simgesi hareket ettirilip aktivasyon gerçekleştiğinde, algılama değeri keskin şekilde çift haneli sayılara düşmektedir. Proteus programının bu aracı güncelleme yapmamaktadır. Dolayısıyla doğru etki sonucunun izlenebilmesi için devreyi gerçek fiziki şartlarında kurmanız tavsiye edilir.

Şekil 7.29 PIC12F1840 ile kapasitif yakın mesafe algılama uygulaması

Devrenin kaynak kodu Tablo 7.15’te gösterilmiştir. Program kodundan görüleceği üzere, düzenli aralıklarla (dâhili işlemci osilatörünün frekansında) Timer0 kesmesi oluşmaktadır. Bu kesmenin süresi içinde Timer1 zamanlayıcısı sayıcı olarak çalıştırılmaktadır. OPTION kaydedicisinin TMR0CS biti lojik-0 olarak kurulduğundan Timer0 zamanlayıcısı FOSC/4 (bu uygulama için 1 MHz) frekansında çalışmaktadır. T1CON kaydedicisinin TMR1CS bitleri ‘11’ olarak ayarlandığından, kapasitif algılama osilatörü Timer1 modülünün saat darbesi kaynağı olarak işlemektedir. Kapasitif Pede yapılan etkiye bağlı olarak kapasitif algılama osilatörünün frekansı keskin şekilde düşer ve Timer1’in sayma değeri de buna bağlı olarak düşüş gösterir.

Program içinde ‘referans’ isimli bir değişken vardır. Bu değişken ile Timer1’in sayma değeri karşılaştırılmaktadır. Yapacağınız devrenin hassasiyetine bağlı olarak bu değerler ve osilatör tercihleri, voltaj referansları tercihleri değişiklik gösterebilir. En ideal sonucu bu değerlerde yapacağınız değişiklikler ve devre tasarımınıza göre elde edebilirsiniz.


#define GIRIS PORTA.RA0
#define LAMBA PORTA.RA2
const unsigned int referans=1000;
unsigned int touch, touch_low, touch_high;
void ayar(){
 ANSELA=0x01; //AN0 analog diğerleri dijital I/O
 TRISA = 0X01; // CPS0 pini giriş olarak ayarlanıyor
 CM1CON1 = 0; //Karşılaştırıcılar kapalı
 CPSCON0.CPSRM = 0; //Dahili osilatörün voltaj referansları kullanılıyor
 CPSCON0.CPSRNG1 = 1; //Osilatör yüksek menzil modunda
 CPSCON0.CPSRNG0 = 1;
 CPSCON0.CPSON = 1; //Kapasitif algılama modülü açılıyor
 CPSCON1 = 0; //CPS0 giriş olarak seçiliyor
 T1CON = 0b11000101;//Timer1 kaynağı Capacitive Sensing osilatörüdür
 T1GCON.T1GSS1 = 0;
 T1GCON.T1GSS0 = 1; //Timer1 gate kaynağı olarak Timer0 taşması seçilir
 OSCCON=0B01101000; //4MHZ dahili HFINTOSC
 OPTION_REG = 0B00000111; //Timer0 prescaler 1:256
 PORTA = 0;
 INTCON.GIE=1;
 INTCON.T0IE=1;
 INTCON.PEIE=1;
 TMR0=0;
}

void main() {
 ayar();
 Delay_ms(100);
 LATA=0;
 while(1){
  if(touch<referans){
   LAMBA = 1;
  }
  else{
   LAMBA = 0;
  }
 }
}

void interrupt(){
 if(INTCON.TMR0IF){//Timer0 kesmesi olursa
  touch_low=TMR1L;// Timer1'i oku
  touch_high=TMR1H << 8;
  touch = touch_low + touch_high;
  T1CON.TMR1ON=0; // Timer1'i kapat
  TMR1H=0;// Timer1'i temizle
  TMR1L=0;
  Delay_us(20);
  T1CON.TMR1ON=1;// Timer1'i kur
  INTCON.TMR0IF=0;
  TMR0=0;
 }
}