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();
}
}
#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();
}
}