CCS C 'de LDR ile DC motor kontrolü sorun??

abttr23

Üye
Katılım
3 Haz 2014
Mesajlar
7
Puanları
1
Öncelikle yapmak istediğim işi şöyle özetleyeyim. pic 16f877 ye bağlı kullanım açısından farklı konumlandırılmış 2 adet ldr den gelen analog bilgileri alıp, ldr ler arasındaki farka göre dc motoru sağa ya da sola döndürmek istiyorum. Ayrıca dc motorun başlangıç noktasına göre konumunu encoder kullanarak öğrenmek istiyorum. Devrenin şeması ve programı yazdım ama anlamadığım bir yerde hata yapıyorum. Devre programa göre çalışmıyor. Yardımcı olabilecek arkadaşlar var mı? Devre şeması ve program aşağıdaki gibidir;

#include <16f877.h>

#device ADC=10 // 10 bitlik ADC kullanılacak

#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD

#use delay (clock=4000000) // 4 MHz yeterli...

#use rs232 (baud=9600, xmit=pin_c6 , rcv=pin_c7 , parity=N)

#define use_portd_lcd TRUE // LCD D portuna bağlı

#include <lcd.c> // lcd.c dosyası tanıtılıyor


unsigned int ldr1;
unsigned int ldr2;

void LDR_GirdiOku()
{
delay_us(20);
set_adc_channel(0);
ldr1 = read_adc();

printf(lcd_putc,"\fLDR1=%d",ldr1);// 0. kanaldan okunan değeri lcd ye yaz
delay_ms(1500);

set_adc_channel(1);
ldr2 = read_adc();

printf(lcd_putc,"\fLDR2=%d",ldr2);// 1. kanaldan okunan değeri lcd ye yaz
delay_ms(1500);

}

void SolaMotorAdimla()
{

set_pwm2_duty(250);
output_high(pin_c3);
output_low(pin_c4);
}

void SagaMotorAdimla()
{
set_pwm2_duty(250);
output_high(pin_c4);
output_low(pin_c3);
}

void MotorYonlendir()
{
if(ldr1 > ldr2)
{
if((ldr1 - ldr2) > 10)
SolaMotorAdimla();
}
else if((ldr2 - ldr1) > 10)
SagaMotorAdimla();

}
// C dilinde program ana ( main ) fonksiyonundan başlar.

void main ( )
{
setup_psp(PSP_DISABLED); // PSP donanımı kapalı
setup_timer_1(T1_DISABLED); // 1 nolu sayıcı (Timer) kapalı
setup_timer_2(T2_DIV_BY_16,250,1);
setup_CCP1(CCP_OFF); // CCP ( yakala-karşılaştır-pwm ) modülü 1 kapalı
setup_CCP2(CCP_PWM);

output_a(0x00);
set_tris_a(0xff); // A portu tümüyle çıkış olarak yönlendiriliyor
output_a(0x00); // A portu çıkışları sıfırlanıyor
set_tris_c(0x00); // C portu tümüyle çıkış olarak yönlendiriliyor
output_c(0x00); // C portu çıkışları sıfırlanıyor
set_tris_e(0xf0); // E portu tümüyle çıkış olarak yönlendiriliyor
output_e(0x00); // E portu çıkışları sıfırlanıyor,
set_tris_b(0xff); // B portu tümüyle çıkış olarak yönlendiriliyor
output_b(0xff); // B portu çıkışları sıfırlanıyor
set_tris_d(0xff); // D portu tümüyle çıkış olarak yönlendiriliyor
output_d(0xff); // D portu çıkışları sıfırlanıyor


setup_adc(adc_clock_div_32); // Bu kod ADC çevrimi için frekansı belirliyor.
// ADC Saati için sistem saati 32 ye bölünecek -> 4.000.000 / 32 = 125 kHz yaklaşık.Bizim için yeterli

setup_adc_ports(ALL_ANALOG); // Pinlerde AN ile başlayan tüm pinler analog giriş olacak

lcd_init(); // LCD hazır hale getiriliyor

printf(lcd_putc,"\f LDR DEĞERLERİ "); // LCD'ye yazı yazdırılıyor
delay_ms(1500);

while(1)
{
LDR_GirdiOku();
MotorYonlendir();
}
}


devre.jpg
devre.jpg
 
ısıs dosyasını ekleyebilir misin..
 
Lcd baglantin yanlis olmus ayrica ldr yerine pot baglayarak dene programda da mantiksal hatalar var gibi mesela ldr lerin degerleri ayni oldugunda motor ne olacak durmayacak mi birde motor surucu entegresinin enable ucunu direk 5v a bagla. Gun icinde duzeltip gondermeye calisicam.
 
Değişiklikleri yaptım inceleyebilirsin.
 

Ekli dosyalar

  • devre.rar
    30 KB · Görüntüleme: 44
"Elkgazi" öncelikle ilgilendiğiniz için çok sağolun. Dediğiniz gibi ldr lerde mantık hatası vardı. ancak benim asıl problemim ldr ya da pot arasında fark olsa bile motorum hiç hareket etmiyor. Motoru hareket ettirebilsem gerisini az çok anlayabilirim. Ayrıca enable b yi 5v a bağlarsam pwm sinyali gönderemem.. Başka bir sorun olabilir mi acaba?
 
Devreyi kurdunuz ve gerçek ortamda mı motorunuz hareket etmiyor yoksa simülasyonda mı hareket ettiremediniz. Gönderdiğim simülasyonda motor hareket ediyor. Enable ucunu +5V a bağlarsanız mak. devirle enable ucunu pwm çıkışına bağlarsanız pwm oranınıza göre bir devirle motorunuz dönüyor. Her iki durumu da simülasyonda denedim.
 
Siz ISIS simülasyonunda bir değişiklik yaptınız mı yoksa benim gönderdiğim üzerinden mi çalıştırdınız?? Çünkü sizin gönderdiğiniz rar dosyası içerisinde isis dosyası yok..
 
Sizin gönderdiğinizin üzerinde ufak tefek değişiklikler yaptım. Gönderdiğim rar ın içinde .DBK uzantılı olan bir dosya göremediniz mi? Tekrar indirip kontrol ettim rar içinde dosya mevcut. Benim sürüm 7.7 SP2
 
Tamam şimdi farkettim. Bir de benim bu devreyi Ldr ile yapmam lazım. Pot ile çalışırken ldr ile neden olmuyor? ya ldr bağlantısını yanlış yapıyorum, ya da ldr den gelen analog değerler belirtilenden daha farklı? bu konuda bir fikriniz var mı?
 

Forum istatistikleri

Konular
128,119
Mesajlar
915,169
Kullanıcılar
449,824
Son üye
Lecterer

Yeni konular

Geri
Üst