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 :)



7 yorum:

  1. pic16f877a entegresine pot bağladığımızda 0-255 arası değeri lcdde nasıl görürüz

    YanıtlaSil
    Yanıtlar
    1. Öncelikle ADC değerini 8 bit yapmanız gerekiyor. Programda yazıldığı gibi okunacak adc değerinin atanacağı değişkenin de "unsigned long int" olarak tanımlamanız gerekiyor.

      Sil
  2. bu programı micro c ye nasıl çevirebilirim?

    YanıtlaSil
  3. ccs c compiler de kodların yazılışı ve pwm ayarlarını atar mısnız?

    YanıtlaSil
  4. Yanıtlar
    1. Üslubunu takın !
      Hex dosyası falan yok, kodlar yukarda kendin derle yükle !

      Sil