pcbway

PWM ve 16f628a

Başlatan MIrchhh, 11 Ağustos 2010, 16:39:48

MIrchhh

Merhaba


Sitenizin https://320volt.com/cizgi-izleyen-robot-yapimi-tanimi-calisma-prensibi/ adresinde bulunan çizgi izleyen robot projesini inceledim. PWM kullanmak için yalnızca PORTB.3 kullanmamız gerekmiyormu bu şekilde çalışır mı ? ben bu robot projesini yaptım bi yöne düzgün dönerken diğer yöne dönmüyor. Düz gitmede sorun yok ama bir yöne dönerken pwm çalışmıyor sanki motor tamamen duruyor. Bir çok yerde PWM için yalnızca CCP bacağı kullanılır deniyor. Portb.4 ve Portb.6 dan pwm yapabilirmiyiz? Birde devreye baktığımda L293D entegresine portb.0 portb.1 portb.2 ve portb.3 ten  bağlantı alınmış programla herhangi bir alaksı yokki gibi geliyor bana yardımcı olabilirseniz çok sevinirim. PWM kullanmak için illede CCP den mi kullanmalıyım? Pic basic pro gibi basit bir dilde yazmak istiyorum. ama zorda kalırsam assembly de yazabilirim. Motor sürücünün neden 4 inputunada bağlantı yapıyoruz 2 input yeterli değilmi?


Teşekkürler...

justice_for_all

bahsettiginiz resme baktim semada goruldugu uzere L293 entegresinin yetkilendirme (enable) pinleri direkt olarak beslemeye baglamis yani pwm hic kullanilmamis.Pwm bu gibi surucu entegrelerinin yetkilendirme ucuna baglanmak zorunda.Pwm CCP ile kullanilir haklisiniz ama herhangi bi pinden program yazarak sizde pwm yapabilirsiniz.Devrede motor surucunun 4 input kullanilmasinin sebebi iki ayri motoru kontrol etmek icin.portb.0 portb.1 portb.2 ve portb.3 pinlerinin L293 entegresiyle alakasi var motor hareketi ve yonleri bu pinlerle saglanmakta umarim yardimci olabilmisimdir...

MIrchhh

evet fazlasıyla yardımcı oldunuz çok teşekkür ederim. peki bu programı pic basic proda yazabilirmiyim? assembly e bulaşmak istemiyorum şu an için 3. sınıftayım hala pic dersi almadım kendim öğrenmek istiyorum fakat assembly de if durumları biraz karışık olduğu için baya zorlanırım gibi geliyor:/

justice_for_all

basic te yazabilirsin ama ben basic te calismiyorum ben c dili ile yaziyorum bu yuzden basicte yardimci olamiycam...

MIrchhh

peki c de yazabilmem için yardımcı olabilirmisiniz? biraz araştırmayla c programlamayı öğrenebilirim fakat bu pwm işleri biraz daha karışık geliyor bana:( if statementları yazarım fakat bu tür özel işler baya karışık gibi :(

justice_for_all

siz yapmak istediginiz seyi acikca yazin ben yapmaya calisirim...benim onceden yazdigim kod vardi onu yuklerim biraz bakin...




#include <16F877A.h>

#FUSES HS                       //Crystal osc <= 4mhz
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOWRT                    //Program memory not write protected
#FUSES NOCPD                    //No EE protection

#use delay(clock=12000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)

  #include <ctype.h>
  #include <stdio.h>
  #include <stdlib.h>
  #include <lcd.c>

////////////////////76543210
//#define  movIleri 0b00010001
//#define  movGeri  0b00101000
//#define  movSag   0b00000001
//#define  movSol   0b00010000
//#define  movAniDur 0b00000000

int1  rxDone=0;

char veri[2];


             
int a=0;
int y=0;

void ileri()
  {
      output_high(pin_c3);
      output_low(pin_c0);
      output_high(pin_c4);
      output_low(pin_c5);
  }
  void geri()
  {
      output_high(pin_c0);
      output_low(pin_c3);
      output_high(pin_c5);
      output_low(pin_c4);
  }
   void dur()
  {     
      output_low(pin_c0);
      output_low(pin_c3);
      output_low(pin_c4);
      output_low(pin_c5);
  }
  void sag()
  {
      output_low(pin_c0);
      output_high(pin_c3);
      output_low(pin_c4);
      output_low(pin_c5);
  }
  void sol()
  {   
      output_low(pin_c0);
      output_low(pin_c3);
      output_high(pin_c4);
      output_low(pin_c5);
  }
#INT_TIMER1 //defining THE TIMER1 INTERRUPT
void timer_kesmesi(void)
{
   set_timer1(500);
   
   if(++a==5)
   {
      dur();
      a=0;
      disable_interrupts(int_timer1);
   }
}//end of  INT_TIMER1

#INT_RDA  //defining THE SERIAL PORT INTERRUPT
   void  seri()
   {
      int sayac;
     
      if(sayac<2)
      {
         veri[sayac]=getc();
         sayac++;
         if(sayac==2)
         rxDone=1;
      }
      else
      sayac=0;
     
      enable_interrupts(int_Timer1);
     
     set_timer1(500);
   }//end of INT_RDA
void main()
{
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_EXT_L_TO_H|RTCC_DIV_1);
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
   setup_timer_2(T2_DIV_BY_16,250,1);
   setup_ccp1(CCP_PWM);
   setup_ccp2(CCP_PWM);
   enable_interrupts(GLOBAL);
   enable_interrupts(INT_RDA);
   //enable_interrupts(INT_TIMER1);
  // lcd_init();
   //lcd_gotoxy(1,1);
   //printf(lcd_putc,\"\\f  SERIAL PORT\");
   //lcd_gotoxy(1,2);
   //printf(lcd_putc,\"  APPLICATION\");
 
   dur();
   while(1)
   {
      output_toggle(pin_d5);
      output_toggle(pin_d4);
      delay_ms(200);
     if(rxDone)
      {
      switch(veri[1])
         {
            case  \'f\':  printf(lcd_putc,\"\\f ileri gidiyor\");set_pwm1_duty(veri[0]);set_pwm2_duty(veri[0]);set_timer1(25500);ileri(); break;
            case  \'b\':  printf(lcd_putc,\"\\f geri  gidiyor\");set_pwm1_duty(veri[0]);set_pwm2_duty(veri[0]);set_timer1(25500);geri(); break;
            case  \'r\':  printf(lcd_putc,\"\\f saga  gidiyor\");set_pwm1_duty(veri[0]);set_pwm2_duty(veri[0]);set_timer1(25500);sag(); break;
            case  \'l\':  printf(lcd_putc,\"\\f sola  gidiyor\");set_pwm1_duty(veri[0]);set_pwm2_duty(veri[0]);set_timer1(25500);sol(); break;
            case  \'s\':  printf(lcd_putc,\"\\f durdu\");dur();break;
            default  :  printf(lcd_putc,\"\\f\\rYanlis Karakter\\n\");break;
         }// end of switch
      delay_ms(20);
      rxDone=0;
      }//end of if rxDone check
   }//end of while
} //end of main class

MIrchhh

aynen bu şekilde ileri geri sağa sola gidiş fakat sağa sola gidişleri motorun tekini durdurarak değilde yavaşlatarak yapmak istiyorum uzaktan kumandalı bir araba yapmak istiyorum ama tek teker dönüp diğeri durarak dönsün istemiyorum:/

justice_for_all

set_pwm_duty( 0 ile 255 arasinda deger)  bu komutla yavaslatip hizlandirabilirsin motoru tamam mi..
ornegin   void sag()
  {
      output_low(pin_c0);
      output_high(pin_c3);
      output_low(pin_c4);
      output_low(pin_c5);
  }

bu kod satirinin yerine bu olur


ornegin   void sag()
  {
set_pwm_duty( 0 ile 255 arasinda deger) ;
      output_low(pin_c0);
      output_high(pin_c3);
      output_low(pin_c4);
      output_low(pin_c5);
  }

MIrchhh

yalnız bu kod yine bir motoru yavaşlatıp diğerini durdurarak çalışıyor bence benim istediğim ikiside dönsün diğeri daha az dönsün bu şekilde yön verilsin durarak değil:/

justice_for_all

15 Ağustos 2010, 02:01:02 #9 Son düzenlenme: 17 Ağustos 2010, 00:58:49 justice_for_all
arkadasim 16f628a da bi tane pwm var istedigin gibi yapmak istiyosan iki pwmli bi picle yapmak zorundasin.

kullanimi su sekilde:

ornegin   void sag()
  {
      set_pwm_duty0( 150) ;
      set_pwm_duty1( 50) ;
      output_low(pin_c0);//birinci motor
      output_high(pin_c3);//birinci motor
      output_high(pin_c4);//ikinci motor
      output_low(pin_c5);//ikinci motor
  }