Merhaba elektronik Severler.. Öncelikle diğer yazılarımda olduğu gibi epey bir gecikme oldu fırsat bulamayıp akşamdan akşama bir iki kelime yazınca ara bukadar uzuyor. Aslında aranın uzamasındaki bir sebepte mail adresime gelen hak etmediğim bazı eleştiriler neticesinde biraz gönül kırıklığı oluştu bu yüzden ara normalden azla uzadı ama yinede yazmadan edemedim.
Bir önceki dersimizde programcılık deneyimlerimiz arasına TIMER0 kesme kullanım algoritmasını ve ilgili değimlerini ve programsal kullanımını ve örnek uygulamamızı gerçekleştirdik.
Bu dersimizde PIC ile analog işlemlere değinip ADC modülünün kullanımını öğreneceğiz. Ve bunu örnek bir proje ile pekiştireceğiz. Bu dersimizin sonunda sizlerden bir ev ödevi talebim olacak bu ödevi bana maille ulaştıracaksınız yada ulaştırmasanız da olur. 😀
Gelecek dersimde Kısmet Olursa PWM tekniğini Donanımsal ve yazılımsal olarak inceleyeceğiz. Ayrıca Dersimi Uzun Zamandır Üzerinde Yoğunlaştığım USB ile PIC kontrol Kısmına getirip Size İlham kaynağı verip Bitirmeyi planlıyorum Sanıyorum 4 5 Ders Daha Görüşüp sonra veda zamanı gelecek.
Dersimize başlamadan önce alışkanlık olan işimize yarayabilecek birkaç kısa bilgi verdikten sonra dersimize geçelim.
• Analog terimi minimum(0v) ile maksimum(5v) arasında çok sayıda değer elde edilebilen olgulardır.
• Dijital terimi (0)minimum ve maksimum(5v) arasında asdece iki değer elde edilebilen olgudur.PICler donanımsal olarak ADC modül barındırır (Dahili olarak üretilmiş PICler ADC Barındırır Örn 16 628 A ADC yoktur 12f675 de ADC vardır)
• Yazılımlarımızın hayata dahil olduğu kartlar(PCB) baskılı devre kartlarıdır bu sebeple baskı devremizinde yazılımcılığımız kadar ileri düzeyde tasarlanması gerekir. Deneme kartlarını hazırlarken bazen perhidrol tuzruhu karışımının devremizi biz istemesekte bazen tamamen ertir ne oldu da bu baskı eridi diye içten içe dertleniriz sonrasında daha önceden perhidrol aldığımız eczane yolu bu kez bujiteriye düşer oradan aldığımız asitli baskı devreyi 2saatte çözmez.
Yahu nedir bu işin sırrı derseniz eczanelerden aldığınız asit kimyasal ilaç yada bir başka ilaç etken maddesidir bujiteriden aldığınız asit saç ağartıcı boya olarak satıştadır. Burada dikkat edeceğiniz husus asitin karışım yüzdesidir. Genelde şişelerinin üzerinde yazmaktadır. %50 perhidrol % 35 Perhidrol yazar. Burada pratik yapacağınız kısa ölçü şudur yüdesi 50 ise 5 ölçek tuzruhu 1 ölçek peroksit 35% ise 3,5 tuzruhu 1 peroksit kullanınız. Bu size olması gerektiği gibi derişim sağlayacaktır. Kartınız ne eritecek kadar hızlı nede sizi nöbetçi asker yapacak kadar uzun çözecektir.
• Ütü yöntemi kullanan öğrencilerime bir yöntem. Bazılarınız belkide uyguluyorsunuzdur. Seri üretim kartlar için bir test baskısı alırız kaldırıp koyarız bir kenara k bunun için bu yöntemi uygulamaya gerek yok zaten profesyonel baskı alınca eleman ve isimlendirme baskısı olacak ama kullanacağınız veya ödev olarak yapacağınız bazı devreler için eleman baskısını kendimizde yapsak güzel olmaz mı . Proteusta tasarladığımız devrenin elemen isimlerini text mod ile yazıp kart üzerine yerleştiriyoruz. Baskı yüzlerini lazer yazıcıdan çıktı alıyoruz ayrı ayrı(çift katman için) ve sonra ayrı bir sayfa top silk seçip birde yazıcı sayfasında sağda mirror seçeneği var onu işaretleyip yazdırın. Baskı devreyi ütülryin asit işlemlerini bitirin. Bakırlı plaketin TOP üst yüzeyini kurulayıp temizleyin ve eleman baskısını 20 30 saniye ütüleyip sıcak ken kaldırın siyah toner elemanların yerlerinde belirecek delip yerleştirin işte bitti.
Örnek resimler aşağıda Test Çalışması ve Profesyonel baskısı
ELDE YAPILMIŞ ÇOOK EMEKLİ BİR BASKI —- PROFESYONEL OLARAK ÜRETİLMİŞ BASKI
ANİMASYONLU TÜRK BAYRAĞI BASKI DEVRESİ
Bir tanesini basmak saatlerce sürer
ANİMASYONLU TÜRK BAYRAĞI BASKI DEVRELERİ
HEPSİNİ TAMAMEN ÜRETMEK BİR GÜN ALIR
Bu kadar bilgi bu ders için yeterli.
Gelelim Dersimizde işleyeceğimiz konuya . ADC konusu nedense bana itici gelmişti öğrenirken ama uygulamaya koyulunca çok faydalı programcılık deneyimi olduğunu farkettim. ADC modülü şu şekilde düşünürsek daha sevecen geleceğini düşünüyorum. Gerçek hayatta hayatımızı etkileyen tüm fiziksel olgular analog büyüklüklerdir dolayısıyla bu fiziksel etkenlerin algılayıcı devre elemenlarıda analogdur.
Biz ise pic kullanıp herşeyi dijital düşünüp dijital tasarlıyoruz. Bu tasarımları bu şekilde yapmaya hep konforlu ve daha rahat yaşam ve iş hayatı için yapmak zorunda kalıyoruz. Örnek verecek olursak sıcaklığa göre otomatik çalışacak klima ışıklara göre açılıp kapanan pencere panjurları , yangın sırasında otomatik su fıskiyelerinin otomatik olarak çalışıp yangının söndürülmesi arabadan inmeden uzaktan kumanda ile yada arabamız yaklaşınca otomatik açılan park kapısı fazla ağırlıkta yük taşıyacak olan asansörün aşırı yük uyarısı vermesi.. bunun gibi onlarca örnek verilebilir. De 🙂 bu kadar işlemin bizimle ve konumuzla ne alakası var şöyleki saydığım bir çok iş zaten geçmişte tasarlanmış sistemler sayesinde var ancak biz bugün bunu PIC veya denetleyicilerle yapmak durumundayız .
Örneğin bir ağırlık sensöründeki röle ağırlık bilgisini tıkırtıkır bilgisayara bilgi olarak gönderemez yada nekadar fazla yükü var saptayamaz oysa PIC öylemi ağırlığı hem ölçer hem ka kiloymuş belirler hem bilgiasyara dijital bilgiyi iletir hemde Asansöre en son binen kişi LÜTFEN insin yada iki kişi insin sizi bu ağırlığınızla çekemem diye nazik birşekilde uyarı da verebilirç 😀 şişmanlar alınmasın sakın haa bende şişmanım ama böyle tasarımlar ekisine göre daha akılcı geliyor bana.
İşte fiziki bir kısım olguları PIC içerisine alacaksak dış dünyadaki analog büyüklükleri ancak analog portlar sayesinde PIC içerisine alırız.
Örneğin 35derecede bir soba çalışmasını durduracak ve 20 dereceye kadar duracak bir sistem için bir gerilim bölücü direnç ile PTC yada NTC yardımı ile bu sistem optimize edilebilir yada LM35 kullanılıp çeşitli programlar üretilebilir.
Yahu hoca ne kadar konuştun dediğinizi hisseder gibi oldum şimdi ancak konu gerçek örneklerle tam otursun da gerisi üç beş kod ve ayardan ibaret. Savulun eski sistemler Gümbür gümbür yazılımcılar yetişiyor ülkemde.
İşte bu örneksel sinyalden sayısal dönüşüme girerken bilmemiz gereken ADCON0 ADCON1 ve ANSEL kaydedicileridir.
Bu kaydediciler PIC donanımındaki hangi ANALOG modüllerin kullanılacağını hangisinin dijital olacağını belirlememize referans gerilim olarak kaynağımı yada yoksa başka bir gerilim noktasını mı kullanacağımızı Okunan analog örneğin dijital dönüşümünün tamamlanıp tamamlanmadığını dönüşüm sırasında dönüşüm tamamlandı kesmesi oluşturmak için çeşitli ayarlar yapılır.
Bu kaydedicilere girmeden önce REFERANS VOLTAJ nedir neden gereklidir kısaca bahsedeyim.
Voltaj referansı PICin ölçeceği maksimum gerilimdir(5vtan büyük olamaz) örneğn 200volt ölçecek bir volt metre için 200voltu 5volt Maks göre örneklememiz gerekir bu trafo ile ,optokuplörle gerilim bölme yöntemleri ile yapılabilir. Örneğin kaynak gerilimi (burada ki kaynak gerilimi PIC besleme gerilimidir).
877a 12f675 18f4620 18f4550 vs birçok PIC üzerinde 10 bit yani 1024 basamaklı dönüşüm yapan değişik adetlerde ADC portlar bulunmaktadır. Bu yüzden bizim referans gerilimi 1024 0 hariç 1023 basamakta maksimuma erişir.
Örneğin VREF+ pinini +5V’a ayarlarsak Analog girişten 5V alındığında 10 bitlik çıkış 11 1111 1111 olur yani decimal 1023 değeridir bu.
VREF- ise ekranın göstereceği en küçük sayı yani 0 ı ayarlar. Örnek olarak bu girişi GND’ ye bağlarsak ve Analog girişten okuduğunuz gerilim 0 Volt ise ekranda 10 bitlik 00 0000 0000 yani decimal 0 sayısı gözükür.
Bu girişleri kullanmadan direk olarak kaynak şeçilerek bu veref pinlerinide uygulamaya göre kullanabiliriz.VREF+ yı +5v a VREF- yi GND PIC içsel olarak bağlarye bağlarız.
Bir değerin ölçümünü hesaplamak için ise şu yolu izleriz:
Örneğin : VREF+ = 3V VREF- = 0V ise
(3V – 0V) / 1023= 0,00293V eder. Bu değer her sayıya denk gelen gerilimdir. Yani Analog girişteki her 0,00293V’luk değer değişimi dijital veriden 10 bitlik sayının bir hanesini dijitini değiştirir.
ADC dönüşümündeki değer 1500 ise 1500 * 0,00293=4,395v Analog girişteki gerilimi gösterir.
“Alıntıdır“
Analog girişin her 10 mV’luk artışında dijital çıkışın bir artmasını istiyorsam ve Vref+ değerim +5V ise, Vref- değeri ne olmalıdır?Vref- değerine x diyelim ve Denklemi şu şekilde kuralım:
( 5 – x ) / 1023 = 0,01V
5 – x = 10,23
x = -5,23 V olursa işimiz hallolur.
“Alıntıdır“
Gelelim bu işlemlerin nasıl yapıldığına. Öncelikle ADCON0 ve ADCON1 kaydedicilerini anlamak lazım.
Bu kaydediciler aracılığı ile PIC e bak senin şu pinini analog giriş yapacağım şu pinlerini dijital olarak kullanacağım şu pinden referans voltaj Şu analog girişindeki veriyi okuyup dijitale çevireceğim alacağım vs diyeceğiz.
ADCON 0 kaydedicisi PIC içerisine alınan bir analog verinin dönüşüm Hızını dönüşüm bittimi bitmedimi bilgisini ADC dönüşüm modülünü açıp kapatmamıza ve her hangi bir analog girişi dönüştüreceğimizi belirlememizi sağlar.Her dönüşüm sırasında Tekrar ayarlanıp hangi kanal okunup değerlendirilecekse ona göre set edilmelidir.
ADC0 kaydedicisi PIC DATAsheeti üzerinden incelenmelidir. Bu kaydedici 16F877A için geçerli datasheett üzerinden alınmıştır kısaca üzerinde yazanların anlamları Şöyledir.
Her hücrenin üzerinde R/W-0 yazmaktadır Bu değerler kaydedicinin bitlerinin yazılabilir ve okunabilir olduğunu ifade eder U-0 yazan kısmı ise UNUMPLOYED kullanılamaz demektir. Yanlarında yazılan değer ise “0” Bu kaydedici PIC enerjilendiğinde veya resetlendiğinde eğer haricen kullanıcı değer atamamış ise var sayılan değerler 0 olur.
Burada
Bit 7 – 6 Dönüşümün kaç işlemci saykılında yapılacağını seçmemize olanak tanır. Eğer ki Bir EKG cihazı tasarlamıyorsanız genel olarak bu seçimi kullanmayacaksınız.
bit 5-3 CHS2:CHS0: Analog kanal seçim bitleri
000 = Kanal 0 (AN0)
001 = Kanal 1 (AN1)
010 = Kanal 2 (AN2)
011 = Kanal l 3 (AN3)
100 = Kanal 4 (AN4)
101 = Kanal l 5 (AN5)
110 = Kanal 6 (AN6)
111 = Kanal 7 (AN7)
NOT ANAOG KANAL SAYICI PIC DONANIMANA BAĞLIDIR PICten PIC EDEĞİŞİKLİK GÖSTERİR
bit 2 GO/DONE: A/D Dönüşüm Durum Biti
ADON = 1 olduğunda geçerlidir:
1 = A/D Dönüşümü işletiliyor Demektedir (Bu bit Dönüşüm başladığında set edilir dönüşüm bittikten sonra donanımsal olarak sıfırlanır)
0 = A/D her hangi bir dönüşüm yapılmıyor demektedir.
bit 0 ADON: A/D Dönüşüm Aktif etme biti
1 = A/D Dönüşüm Modülü Aktiflenir diğer ayarlara göre her hangi bir kanalın adc dönüşümü yapılır
0 = A/D Dönüşüm Modülü pasif yapılır
Yani bir analog girişi okuyup bir değişkene dijital olarak aktarmamız için bu işlemleri ADCON0 ile belirliyoruz.
Ya sanki anlamadınız gibi yada gözünüz korktu gibi 🙂
Ama Korkmayın MikroC ile Bukadar ayar nedir ne değildir diye bilmeksizin
ADC_read(); yazdığınızda ve parantezin içerisine kaç yazarsak O kanalı okuyacağımız bilmeniz size yetecek de artacaktır.
MikroC varsayılan Hız olarak İşlemci Hızı/4 oranda hızla yani işlemci iç hızında işlem yaparak dönüşüm yapacaktır.
Kısacası ADC_read(3); yazdığımızda AN3 girişini okur bir değişkene döndürmek üzere aktarım yapılmalıdır. Volt= ADC_read(3); yazdığımızda volt değişkenine 10bitlik Dijital bilgi olarak yazar.
PIC giriş çıkış pinlerini ayarlamak için ADCON1 kaydedicisini inceleyelim
Üzeride belirtildiği üzere W/R yaz oku bitleri vardır e varsayılan değerleri 0dır.
Bit7 ADFM: A/D Result Format Select bit
1 = Sonuç Sağa yaslandı
0 = Sonuç Sola yaslandı
Bit6 ADCS2: A/D Dönüşüm Saat hızı seçim biti ADC0 ile birlikte değerlendirmek gerekir
BİT5-BİT 4 KULLANILAMAZ
Bit 3 Bit 0 Bir tablo teşkil eder ki onu tabloda incelemek gerekir.
bit 3-0 PCFG3:PCFG0: A/D Port ayar kontrol bitleri
Biz eğer sadece b analog giriş kullanacaksak C/R yazan sütundan C kısmında 1 yazan Yerlere bakacağız Yani en alt iki satır bizim işimize yarıyor PCFG3 0 pinlerine 1110 yazdığımızda yani C/R 1/0 yazan satırı seçtiğimizde AN0 Analog Diğerleri Dijital olacak ve + – Referanslar Pıc besleme Gerilimi + – Değerleri olacaktır Yanı – 0V + 5V olacaktır.
Eğer En alt satırı seçersek AN= analog pin AN3+ AN2 – analog girişleride Referans gerilim girişleri olarak kullanılmaya ayrlanmıştır. Döünüşüm bu ref değerlerine göre yapılacaktır. Burada unutulmaması gereken PIC girişleri 0 6Volt gerilim değerinde sorunsuz çalışır üzeri gerilimler PİNleri yada PIC i yakar Bu sebeple Pic 5 volt üzeri değerleri ölçecekse gerilim dirençle , opampla ,veya Optokuplör aracılığı ile Uygun seviyelere oransal olarak bölünüp PIC e girdirilmelidir.
Göreceğimiz Sonuç PIC içerisinde uygun kat sayılarla çarpılıp gösterilerek gerçek değer sanal olarak bulunur. Yani 50voltluk bir gerilim ölçülecekse Bu gerilim Sinyal örneklemesi yapılıp PICe verilmelidir.
Burada Dirençle gerilim Bölme yöntemine göre Giriş 50 volt olunca VCC PIC 4Volt olur Giriş 25volt olunca VCCPIC 2Volt olur.
VCC PIC = ( Rkırmızı X Vgiriş)/Rkırmızı+Ryeşil olarak hesaplanır. Yani Giriş Voltajı 62,5 voltun üzerine çıktığında VCC PIC 5 voltu aşar ve tehlike oluşturur.
Buraya kadar anlattıklarımız şimdi kısa bir örnek üzerinde değerlendirip bir uygulama projesi üzerinde öğrendiklerinizi pekiştiriniz.
16F877A için Proje oluşturup C kodlarına aşağıdakileri yazınız.
unsigned int volt ;
void main()
{
ADCON1 = 0x80; //Sonuç Sağa Yaslandı Vref kaynak gerilimine Ayarlandı Tümanalog portlar ADC için kuruldu
TRISA = 0xFF;
TRISB = 0x3F;
TRISC = 0;
For(;;) { //Sonsuz Döngü
volt = ADC_Read(2); // AN2 Okunup dönüşüm yapılacak ve volt değişkenine aktarılacak
PORTC = volt; //ilk sekiz biti PORTC de gösterilir
PORTB = volt >> 8; //kalan son iki biti PORTB’nin 6 ve 7.pinine gönderir.
}
}
Yukarıdaki kod parçası sizin için ADC2 pinini okur işlem yapabileceğiniz 10 bitlik veriye çevirir.
AN2 5 volt olduğunda Dijital veri 1023 değerini alır. Hesaplamalar için dersin üst yapraklarına göz atınız.
5/1023 değeri kadar volt artışında değer 1 artar
0 olduğunda dijital veri 0 olur.
Yapacak olduğunuz işleme göre İF (volt== ….) olduğunda şunları yap mesela su sıcakken çeşme içine yerleştirilen rgb led kızarsın soğukken maviye dönsün 35 40 derece arasında yeşile çalık yansın gibi bir probleme LM35 Analog sıcaklık ölçme entegresi ile pek ala çözüm getirebilirsiniz.
Bu işlemleri 12F675 683 veya 629 ile yapmak mümkün o sebeple ekte Hepsinin ortk yazılımyapısına sahip 675 için bir proje sunuyorum.
Ekteki proje LDR aracılığı ile ışığı ölçüp ona göre sera aydınlatmasında kullanılmak üzere tasarlanan RGB LED projektörü çalışıtıroyor. Ekteki dosyayı memleketimde üniversite okuyan bir arkadaşımın ödevinde yardımcı olmak için yazmıştım şimdi yeri geldi sizlerede sunayım istedim.
Projenin C yazılımı
/*LDR IŞIK SEVİYE ÖLÇER */ /*yazılımı geliştiren AYTAÇ DÜRGEN */ unsigned short b,g,menu,eeprom_veri,menu_sirasi; unsigned long volt_ham,volt_ara,volt; unsigned int dongu; unsigned short isik_seviyesi ; /*********************************************/ void bekle_on(unsigned int i) {unsigned int a; for(a=0;a<i;a++) {Delay_us(1); } } /***********************************************/ void bekle_off(unsigned int i) {unsigned int a; for(a=0;a<255-i;a++) {Delay_us(1); } } void an3_oku(){ volt_ham = ADC_read(3); // ADC 3 kanal okundu } /*********Bu kısım binary değeri 5 3 1,5 gibi ondalık değere dönüştürür **********/ void donusum_yap(){ volt_ara = (long)volt_ham*50000; // okunanan 10 bit adc değerinin mili volt değeği bulunuyor volt_ara = volt_ara/1023; volt = volt_ara/10000; } /*****Işık Seviyesine Göre Projektörü çalıştıracak PWM darbeleri ayrlanıyor******/ void pwm_ayarla(unsigned short isik_seviye){ GPIO=1; bekle_on(isik_seviye); // Ton süresi kadar bekle GPIO=0; bekle_off(isik_seviye); } /****ölçülen değere göre ışık eviyesi kıyaslanıyor********** Karanlıkta maksimum ışık alaca karanlıkta kısık ışık aydınlıkta sönme şeklinde kıyaslama yapılıyor**/ void isik_seviyesi_belirle(){ if(volt_ham>=251 && volt_ham<350)isik_seviyesi=30; if(volt_ham>=350&&volt_ham<450)isik_seviyesi=60; if(volt_ham>=450&&volt_ham<600)isik_seviyesi=90; if(volt_ham>=600&&volt_ham<800)isik_seviyesi=140; if(volt_ham>=800&&volt_ham<900)isik_seviyesi=190; if(volt_ham>=900&&volt_ham<1000)isik_seviyesi=220; } /***************************************************/ void ayarlar(){ CMCON=0x07; // komparatör kapatıldı giriş çıkış dijital ANSEL=0x18; // 12Fxx serisinde Analog Pin seçimi ANSEL kaydedicis ile yapılır. TRISIO=0x14; GPIO=0; ADCON0=0x8D;// sağa yaslandı AN3 Giriş VREF + - Besleme Gerilimi seçildi. } /****************************************************/ main(void) { ayarlar(); for( ; ; ){ if(GPIO.B2){ // GPIO ya eksi tarafına bağlı butona basılmamışsa İf bloğu Yani ldr ye duyarlı çalışma an3_oku(); if(volt_ham>250&&volt_ham<1000){ an3_oku(); isik_seviyesi_belirle(); for(dongu=0;dongu<4000;dongu++){ // yaklaşık 10 sn bekleme için döngü pwm_ayarla(isik_seviyesi); delay_us(1); } } if(volt_ham<250){ GPIO=0;} // hava aydınlıksa tamamen söndür if(volt_ham>=1000){GPIO=1;} // hava karanlıksa MAX ışık ver } else GPIO=1; // butona basılmışsa Direk olarak ışık ver } }
Proje dosyalarında vermiş olduğum örneğe ilişkin yayınlanmış olan LM35 ile Bilim teknik dergisi dökümanı Ldr teorik bilgi için lazer ve ldr uygulaması incelenmiş sağladığı faydadan ötürü emeği geçenlere saygılarımı sunarım.
http://www.facebook.com/#!/umutelektroniktarsus(aytacdurgen)
[email protected]
[email protected]
www.ledpiksel.com
Aytaç Dürgen
Umutelektronik SAN TİC LTD ŞTİ
LED kayan Yazı, LED VİDEO EKRAN , LED TABELA, Animasyon, Saat derece,RGB ,kayan yazı otobüs güzergah kontol kartları,USB Cihaz Kontrolü,USB kontrollü Petrol Fiyat Gösterge Kontrol Kartları,
544 924 28 87
TARSUS MERSİN
MikroC Dersleri 11 Uygulama dosyaları;
Şifre-Pass: 320volt.com
Yayım tarihi: 2012/07/17 Etiketler: kılavuz ders, mikroc dersleri, mikroc kitap, mikroc kullanımı, mikroc programlama
İlgilenenlere faydalı olması dileğimle.
Hocam ellerinize sağlık, sizde olmasanız Türkiye’ de mikroC gibi güzel bir dili öğrenemeyeceğiz.
İlgilenenlere faydalı olması dileğimle.
Aytaç Hocam bu derslerin devamı gelecekmi gelecekse tahminen kaç dersimiz kaldı.
Saygılar…
@asit: Derslerin Devamı Gelecek 6 7 ders daha planlıyorum USB kontrolüne kısaca değinip derslerim Son bulacak Allah izin verirse
Teşekkürler hocam cevabınız için.İnanın çok faydası oluyor öğrenmek isteyenlere.
Saygılar…
teşekkürler çok güzel paylaşım.
Çalışmalarınızda başarılar.
Hocam ADC den veri okuma süresini ayarlayabiliyor muyuz?
mesel 3 sn de bir oku gibi..
çok teşekkür yardımcı olduğunuz için:)