Potentiometer etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
Potentiometer etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

14 Nisan 2015 Salı

PIC16F877A CCS C - PWM ile DC Motor Sürme


Arduino ile DC motor sürmüştük. Aynı uygulamayı PIC ile yapmak isteyenler için bu yazıyı oluşturdum. 
0-1023 arası okunan ADC değerini, 0-255 arasında bir değere dönüştürerek motoru istediğimiz hızda süreceğiz.
Şemada npn,pnp ve mosfet kullanarak oluşturulmuş bir sürücü devresi var. İsterseniz Arduino ile yaptığımız uygulamadaki sürücü devresi ile de bu uygulamayı gerçekleştirebilirsiniz.2N2222 transistörünü kullanabilirsiniz. Tek transistörlü sürücü devresi için,

Arduino ile DC Motor Sürme

Uygulama kodlarına geçmeden önce belirtmek istediğim birşey var. LCD kütüphanesini ben kendime göre ayarlamıştım. LCD devresini oluştururken kablolamaları kendi kütüphanenize uygun olarak bağlayın ve yazılımın LCD ile alakalı yerlerini de yine aynı şekilde kendinize göre oluşturun . 






#use fast_io(a) 
#use fast_io(c)
unsigned long int data,k; //data=adc değeri, k pwm değeri olacak
#include <flexy_lcd.c> // kendi LCD kütüphanenizi yazın
void main()
{
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_CLOCK_DIV_2);
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DIV_BY_16,255,1); // PWM için timer2 kullanılıyor, maksimum değeri 255 olarak ayarladık


set_tris_a(0x01);
set_tris_c(0x00);
setup_ccp1(CCP_PWM); //17 nolu pin, RC2
setup_adc(adc_clock_div_32);
setup_adc_ports(AN0); // AN0 'ı ADC portu olarak ayarladık
lcd_init();
set_adc_channel(0); //ADC kanalını setledik
set_pwm1_duty(k); // PWM'i setledik
delay_us(20);
while(1)
{
data=read_adc(); //Datayı okuyoruz.
k=(data*0.249266862); //0-1023 arası okunan değeri 0-255 arası değere çeviriyoruz
set_pwm1_duty(k); //PWM sinyalini gönderiyoruz.
printf(lcd_putc,"\fADC=%Lu \nPWM=%Lu",data,k); // LCD'ye yazdırıyoruz.
delay_ms(100);
}
}


Projeyi oluşturduğumuz klasörün içerisinde bir de .h uzantılı bir dosyamız var. Onun içinde bir kaç değişiklik yapmamız gerekiyor. 8 olan ADC değerini 10 yapmak gibi.





#include <16F877A.h>
#device ADC=10 //ADC değeri genelde 8 oluyor burda , 10 yapıyoruz

#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected
#FUSES RESERVED //Used to set the reserved FUSE bits
#FUSES XT

#use delay(clock=4000000) //delay fonksiyonunu kullanmak için OSC frekansını girdik.


Kolay gelsin :)



22 Ağustos 2013 Perşembe

Arduino - LCD Ekran Uygulaması

LCD uygulamaları mikroişlemciler ile yapılan uygulamalar için önemli bir temel taş. Çünkü ölçülmesini istediğimiz (mesafe ölçümü,hız ölçümü vs.) birimleri aynı anda ekranda görebilme imkanımız bulunmakta.

Öncelikle LCD ekrandan bahsetmek istiyorum.Gereksiz bilgi ama açılımı Liquid-Cyrstal Display. Piyasada çok çeşidi var hatta Arduino için üretilmiş olanları bile var.Fakat ben LCD ekranımı Arduino'yu almadan çok çok önce aldığım için biraz farklı ve bağlantıları resimden de anlaşılacağı üzere biraz karmaşık oldu.







Bu karmaşıklığı LCD numaralarını göstererek daha basite indirgeyebiliriz. Yan tarafta LM016'nın numaralandırılmış hali var.Fakat sorunlar burda da bitmiyor. LCD üreticisi firmalar bu numaraları sıralı bir şekilde üretmeyebiliyor.





 Ben 1-16 arasında numaralandırılmış olan kısmı lehimleme tercihinde bulundum.

Ekran parlaklığını potansiyometre ile ayarlıcaz.Bunu da VDD-VSS arasında potansiyometre koyarak yapcaz. Yani LCD'nin 3 numaralı kısmı potansiyometrenin orta bacağına takılı olcak. 2 numara VDD ve potansiyometrenin uç bacağı, 1 numara VSS ve o da  potansiyometrenin diğer uç bacağına bağlı olacak.

LCD 4 numaralı pin data girişi yeri, 5 numaralı pin toprağa bağlı ekrana datayı yazacak ve 6 numaralı pin de sinyal aktifliği yeri.Daha çok bilgiyi aşağıdaki adresten LM016L'nin datasheetinden edinebilirsiniz.


http://pdf1.alldatasheet.com/datasheet-pdf/view/146552/HITACHI/LM016L.html



Kodlarımız;



#include <LiquidCrystal.h> // Kütüphane Gerekli
LiquidCrystal lcd(7, 8, 9, 10, 11, 12); //Arduino pinleri LCD için

void setup(){
  lcd.begin(16,2); 
}

void loop(){
  lcd.clear(); 
  lcd.setCursor(0,0); //komutu ile imleci istediğimiz karakter kutusunda konumlanmasını sağlıyoruz.İlk satırın ilk sütununa.
  
lcd.print("arduinotik"); // İmlecten itibaren bu yazı yazılacak
  lcd.setCursor(0,1); // 2.satırın ilk sütunundayız şimdi de
  lcd.print("dunyasi"); // 2.satıra bu yazı yazılacak
  delay(15000); //Bu kısım LCD'lerin frekans çalışma aralığı yüzünden giriliyor.
}


Yüklediğim resim biraz karışık bunun için özür dilerim.O yüzden bağlantıları tek tek yazdım devrenin kurulumunun kolay olması için. LCD'nin pinlerini esas aldım.

LCD'nin
1 - VSS (Toprak)
2-  +VDD
3-  Potansiyometrenin Ortası
4-  Arduino 7.pinine
5-  Toprak
6-  Arduino 8.pinine

11- Arduino  9.pinine
12- Arduino 10.pinine
13- Arduino 11.pinine
14- Ardunio 12.pinine
15- +VDD   
16-  Toprak

***Şemada 15. ve 16.pinlerin yerlerini ters yazmışım çok özür diliyorum. 15 VDD, 16 Toprağa bağlı olmalı.Potansiyometrenin

Sağ Bacak Toprak, Sol Bacak +VDD



24 Temmuz 2013 Çarşamba

Arduino - Analog Girişler (Voltmetre)

Hayatta herşeyin "1" ve "0" lardan oluşmadığından bahsetmiştik.Hayat analog değerlerle kaynıyor :D. Bu yazımda bunu daha iyi anlıcaz. Maksimum 5V'a kadar ölçüm yapabilen bir voltmetre yapıcaz.

Arduino analog girişleri 10bitliktir. 2^10= 1024 matematiksel hesabından, okunan her analog değer 1024 örneğe ayrılır.Bu ayrılan örneklere göre de okunma işlemi yapılır yani her değer 0-1023 değerleri ve bu değerler arasında ki en yakın tamsayı değerine atanır. Aslında daha önce bahsetmem gerekiyordu (Analog çıkışlarda) bu ADC olayından , geç kaldığım için özür dilerim.


Bizim analog gerilim değerimiz maksimum 5V  olacak. Bu 5V'luk değer 0-1023 değerleri arasında atanacak. Bu, seri haberleşme portunu kullanıp değer okurken küçük bir matematiksel formüle ihtiyacımız olacağını gösteriyor bize.



Öncelikle potansiyometrenin bir ucu 5V'ta, bir ucu toprakta, orta ucu da A1 pininde olmak üzere şekildeki gibi devremizi bağlıyoruz.Analog girişi üzerinde Analog yazan pinlerden yapıyoruz.



void setup ()
{ Serial.begin(9600);} //9600 baud hızında seri haberleşme komutu

void loop () {
int  analogdeger = analogRead(A1); //A1'den okunan analog değerleri atadık
  
  float gerilim = analogdeger * (5.0 / 1023.0);  // Bu kısmı aşağıda açıklıcam
  
  Serial.println(gerilim);  //Ekranda gerilim değerini gösteriyoruz.
  delay(50); //2 ölçüm arasında geçen zaman dilimi (ms)
  }


A1 pininden okunan değerler 0 ile 1023 arasında değişen değerler olacak. Temel Ölçme dersinde öğrendiğimiz analog ölçüm formülünü bu kısımda kullandık, kullandık ki seri haberleşme sayesinde ekrana yazdıracağımız değer volt biriminde olsun.

Gerilim = Okunan Skala Değeri x ( Maksimum Okunabilen Değer / Maksimum Skala )




Analog olarak değer okumak bizim için çok mühim  olacak çünkü aklıma gelen örnek Helikopterler,Multikopterler vb.  araçları kullanırken yapacağımız kumanda sistemlerinde kullanabiliriz bu analog değer okumayı.