28 Haziran 2014 Cumartesi
Fototransistör ve Ir ledli uygulama
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.
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;
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;
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
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;
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
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);
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.
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
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.
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);
}
}
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);
}
}
Kaydol:
Kayıtlar (Atom)