28 Haziran 2014 Cumartesi

Fototransistör ve Ir ledli uygulama


 
Bu çalışmam da yukarıda görülen uygulamayı yaptım. Bu devrenin çalışma prensibi Ir led gözle görülmeyecek sinyal yayar fakat bu sinyali kamera yardımıyla görebiliriz ve bu sinyal eğer siyah yüzeye çarparsa yansıma yapmaz fakat beyaz yüzeye çarparsa bir yansıma yapar direk fototransitör'ün üzerine veya Ir led direk foto transistör'ün üzerine tutarsak fototransistör'ün beyz'ine tetikleme göndeririz sonra fototransistör'ün kollectöründen emiterine bir akım geçişi olur ve burada 2N3904'ün beyzini tetikleyerek 2N3904'ün kollektöründen emiterine bir akım geçişi olur burada 470 ohmluk direnç üzerinde potansiyel fark oluşur buda yaklaşık 5 volt civarın da ve buna bağlı devre bir sinyal göndermiş olursunuz bu devre ya sadece bir mikrodenetliyici ile yapılmış hırsız alarm devresin de veya farklı devrelerde yada sadece bir role koyarak daha büyük gerilimler de çalıştırabilirsiniz.
 

Pot ile Motor kontrol

 Bu çalışmamda bir önceki çalışmamda yaptığım devreye ek olarak pot ve butonlar eklenip hem motor hızını kontrol ve hem de motor yön seçimi yapılmıştır. Motor hızını kontrol etmek için 18f4550 serili pic mikrodenetliyici'nin için de  var olan 10-bitlik ADC modülü kullanıalarak yapılmıştır.

Devre şeması bir öncekinin aynısı tek fark pot eklendi.
 
Kod;
 
 
sbit LCD_RS at RC6_bit;
sbit LCD_EN at RC7_bit;
sbit LCD_D7 at RD4_bit;
sbit LCD_D6 at RD3_bit;
sbit LCD_D5 at RD2_bit;
sbit LCD_D4 at RD1_bit;
// Pin direction
sbit LCD_RS_Direction at TRISC6_bit;
sbit LCD_EN_Direction at TRISC7_bit;
sbit LCD_D7_Direction at TRISD4_bit;
sbit LCD_D6_Direction at TRISD3_bit;
sbit LCD_D5_Direction at TRISD2_bit;
sbit LCD_D4_Direction at TRISD1_bit;
void init_ayarlar(){
     TRISC.RC2=0;  // FULL-BRIDGE CIKISLARI ICIN  AYARLAMALAR
     PORTC.RC2=0;
     TRISD.RD5=0;
     TRISD.RD6=0;
     TRISD.RD7=0;
     PORTD.RD5=0;
     TRISD.RD6=0;
     TRISD.RD7=0;
    
     TRISB.RB5=1;
     PORTB.RB5=0;
     TRISB.RB6=1;
     PORTB.RB6=0;
     TRISB.RB7=0;
     PORTB.RB7=1;
    
     PR2 =    0b11111001 ;
     T2CON =  0b00000101 ;
     CCPR1L = 0b00000000;
     CCP1CON= 0b11011100;  // Full Bridge Forward; P1A, P1C active-high; P1B, P1D active-high
     ECCP1AS.ECCPAS2=0;
     ECCP1AS.ECCPAS1=0;
     ECCP1AS.ECCPAS0=0;
    
     trisa.rb0=1;
     Lcd_Init();                        // Initialize LCD
     Lcd_Cmd(_LCD_CLEAR);               // Clear display
     Lcd_Cmd(_LCD_CURSOR_OFF);          // Cursor off
    
     /* Init ADC */
     ADCON0=0X00;   // Select Left justify result. ADC port channel 0
     ADCON1 &=0xfE;   // Select the FRC for 8 MHz
     ADON_bit=1;                     // Turn on the ADC conversion module
}
unsigned int ipwm=0;
unsigned char txt[4];
unsigned int duty;
unsigned int dutyy;
char txt1[7];
void main() {
       init_ayarlar();
       while(1){
              if (portb.rb5){
                CCPR1L = 0b0000000;
                delay_ms(100);
                P1M1_BIT=0;
                P1M0_BIT=1;
                PORTB.RB7=0;
                while(portb.rb5);
               }
               if (portb.rb6){
                CCPR1L = 0b0000000;
                delay_ms(100);
                P1M1_BIT=1;
                P1M0_BIT=1;
                PORTB.RB7=1;
                while(portb.rb6);
               }    
              
               GO_DONE_bit=1;                 // initiate conversion on the channel 0
               while(GO_DONE_bit) continue;  // Wait conversion done
               ipwm = ADRESH;           // Get the highest 8 bit MSB result, ignore the 2 bit LSB
               if(ipwm>248) ipwm=248;    // sinir değer bunu aşarsa donma oluyor.
               if(ipwm<=0) ipwm=0;
              
               CCPR1L=ipwm;             // Set the Duty Cycle base on the ADC result
               duty=ipwm*100/248;
              
               dutyy=ipwm<<2;
               dutyy+=ADRESL>>6;
               inttostr(dutyy,txt1);
               LCD_OUT(1,1,"CCPR1L+CCP1CON:");
               LCD_OUT(2,1,txt1);
              
               inttostr(ipwm,txt);
               LCD_OUT(1,1,txt);  
       }
 
Sonuç
 
 

18F4550 kullanarak motor kontrol

Pic 18f4550 içinde bir çok modül barındırır. Ben bu çalışmamda 18f4550 içindeki ECCP modülünü kullanarak bir önceki çalışmamda kullandığım H-Bridge ile Motor kontrol yapılacak. Buradaki amaç 18f4550 çıkışından 5Khz frekans üretilir yaklaşık 200us içinde. Bu zaman içinde duty cycle değiştirilerek yani çıkış da ne kadar 1 kalacak ne kadar 0 kalacak ayarlanarak transistörlerin beyz girişine uygulanır.


 
  Yukarıda da anlaşılacağı gibi duty cycle yani ne kadar 1 kalacak anlatılmıştır. Aşağıda devre şeması verilmiştir. Burada var olan P1A, P1B, P1C, P1D bir önceki çalışmamda yapmış olduğum devrenin girişlerine bağlanır.
 
 Devrede kullanılan kod MikroC ile yazılmıştır;

void init_ayarlar(){

     TRISC.RC2=0;  // FULL-BRIDGE CIKISLARI ICIN  AYARLAMALAR
     PORTC.RC2=0;
     TRISD.RD5=0;
     TRISD.RD6=0;
     TRISD.RD7=0;
     PORTD.RD5=0;
     TRISD.RD6=0;
     TRISD.RD7=0;
    
     TRISB.RB5=1;
     PORTB.RB5=0;
     TRISB.RB6=1;
     PORTB.RB6=0;
     TRISB.RB7=0;
     PORTB.RB7=1;
    
     PR2 =    0b11111001 ;
     T2CON =  0b00000101 ;
     CCPR1L = 0b00000000;
     CCP1CON= 0b11011100;  // Full Bridge Forward; P1A, P1C active-high; P1B, P1D active-high
                                            
     ECCP1AS.ECCPAS2=0;
     ECCP1AS.ECCPAS1=0;
     ECCP1AS.ECCPAS0=0;
    
     trisa.rb0=1;
}
unsigned int ipwm=0;
void main() {
       init_ayarlar();
       while(1){  
              ipwm=0;
               while (ipwm < 248) {
                CCPR1L=++ipwm;
                delay_ms(5);     // Delay 5 millisecond
               }
               ipwm=248;
               while (ipwm > 0) {
                CCPR1L=--ipwm;
                delay_ms(5);     // Delay 5 millisecond
               }
       }
}

Devrede kullanılan malzemeler;
3  x adet buton
1  x adet led
1  x adet 18f4550
1  x adet 20Mhz kristal
2  x adet 22pf
3  x adet 10k
1  x adet 2k2
1  x adet Pot 10k

 
 Neden malzemelerin için de pot yazdığımı merak ederseniz eğer bir sonraki yapacağım çalışmamda anlaşılacaktır.

 
 Gerekli bağlantılar yapılır.

 
 Sonuç
 
Kaynak
MikroC ve PI18F4550 kitabı

H-Bridge ile Motor kontrol

Bu devre 4 adet BC639, 4 adet 2K2, 4 adet 1N4148 ve 100nf oluşmaktadır. Bu devre asıl önemli olan transistörlerin bazıları aktif ve bazıları pasif yaparak sağ ve sola dönüş yaptırabiliriz. Not: Vcc= +5v

Devre şeması aşağıdadır;
 


 Devre kurulduğunda gerekli besleme devre şemasında görüldüğü gibi yapıldıktan sonra eğer sağa döndürülecek ise önce A=+5V ve D=+5V yapılarak motor sağa döner o esnada C ve B toprağa bağlanmalıdır. Eğer sola döndürme yapılacak ise B=+5V ve C=+5V yapılır o esnada sağa döndürmede olduğu gibi diğer girişler yani A ve D toprağa bağlanır.


27 Haziran 2014 Cuma

18F4550 ile yapılan saat devresi

18f4550 ile oluşturulan saat devresi.

Detaylar sonra eklenecektir...

Kod mikroc ile yazılmıştır;
// Lcd pinout settings
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D7 at RB3_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D4 at RB0_bit;
// Pin direction
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D7_Direction at TRISB3_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D4_Direction at TRISB0_bit;
char dak=0;
char sn=0;
char saat;
int say=0;
char k_d[4];
char k_sn[4];
char k_s[4];
void interrupt(){
     if (PIR1.TMR2IF){
        say++;
        TMR2=6;
        PIR1.TMR2IF=0;
     }
}
void init(){
     ADCON1 |=0X0F;
     CMCON  |=7;
     T2CON=0X05;
     TMR2=6; // ön deger
     INTCON.GIE=1;
     INTCON.PEIE=1;
     PIE1.TMR2IE=1;
     Lcd_Init();
     Lcd_cmd(_lcd_clear);
     lcd_cmd(_lcd_cursor_off);
}
void main() {
     init();
     while(1){
      if(say>=1000){
        sn++;
         if (sn>59){
            sn=0;
            dak++ ;
           if(dak>59){
             saat++;
             dak=0;
               if (saat=24){
                   saat=0;
               }
           }
         }
        say=0;
      }
      bytetostr(dak,k_d);
      bytetostr(sn,k_sn);
      bytetostr(saat,k_s);
      lcd_out(1,1,k_s);
      lcd_out(1,4,":");
      lcd_out(1,5,k_d);
      lcd_out(1,8,":");
      lcd_out(1,9,k_sn);
     }
}