findecano
Üye
- Katılım
- 7 Tem 2010
- Mesajlar
- 8
- Puanları
- 1
- Yaş
- 38
herkese iyi çalışmalar;
pic16f877A ile bir servo motor sürme devresi kurdum. devrenin çalışması şu şekilde;
potansiyometre ile analog giriş alıyorum bu girişin değişimine göre servo motorun konumu değişiyor. 0V da -90 derecede 5V da +90 derecede duruyor.
proteusta devreyi oluşturdum CCS C de de kodları yazdım gayet istediğim gibi çalışıyor, fakat gerçekte kurdum aynı kodları yükledim istediğim gibi çalışmadı, tek bir pulse değeri görünüyor potansiyometrenin değişimine cevap vermiyor. sorun ne olabilir kodlarda yada donanımda eksik olan ne olabilir. devre ve kodlar aşağıda bulunmaktadır. yardımcı olabilicek arkadaşlara şimdiden teşekkür ederim ...
kodlar;
pic16f877A ile bir servo motor sürme devresi kurdum. devrenin çalışması şu şekilde;
potansiyometre ile analog giriş alıyorum bu girişin değişimine göre servo motorun konumu değişiyor. 0V da -90 derecede 5V da +90 derecede duruyor.
proteusta devreyi oluşturdum CCS C de de kodları yazdım gayet istediğim gibi çalışıyor, fakat gerçekte kurdum aynı kodları yükledim istediğim gibi çalışmadı, tek bir pulse değeri görünüyor potansiyometrenin değişimine cevap vermiyor. sorun ne olabilir kodlarda yada donanımda eksik olan ne olabilir. devre ve kodlar aşağıda bulunmaktadır. yardımcı olabilicek arkadaşlara şimdiden teşekkür ederim ...
kodlar;
Kod:
#include <16f877.h>
#device ADC=10
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay (clock=4000000)
#use fast_io(a)
#use fast_io(c)
#define use_portb_lcd TRUE
#include <lcd.c>
#byte ADRESH = 0x1E
#byte ADRESL = 0x9E
#byte ADCON0 = 0x1F
#byte ADCON1 = 0x9F
unsigned long int digdata;
int pwm=0;
int duty=0;
#int_timer0
void kesme()
{
set_timer0(227);
if (pwm==0) output_high(pin_c3);
if (pwm>=duty) output_low(pin_c3);
pwm++;
output_high(pin_c2);
if (pwm>=140) pwm=0;
}
#int_AD
void ADC_kesme()
{
output_high(pin_c1);
}
//****MAIN PROGRAM******
void main()
{
setup_psp(PSP_DISABLED);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_CCP1(CCP_OFF);
setup_CCP2(CCP_OFF);
set_tris_a(0b11111111);
set_tris_c(0b00000000);
ADCON0=0b00001101;
ADCON1=0b00000000;
setup_adc(ADC_CLOCK_INTERNAL);
setup_adc_ports(ALL_ANALOG);
setup_timer_0(RTCC_INTERNAL | RTCC_DIV_4);
set_timer0(227);
enable_interrupts(int_timer0);
enable_interrupts(int_AD);
enable_interrupts(global);
output_c(0b00000000);
lcd_init();
while(1)
{
set_adc_channel(1);
delay_us(20);
digdata=read_adc();
if ((digdata>=0) && (digdata<=93)) duty=5;
if ((digdata>=94) && (digdata<=187)) duty=6;
if ((digdata>=188) && (digdata<=281)) duty=7;
if ((digdata>=282) && (digdata<=375)) duty=8;
if ((digdata>=376) && (digdata<=469)) duty=9;
if ((digdata>=470) && (digdata<=563)) duty=10;
if ((digdata>=564) && (digdata<=657)) duty=11;
if ((digdata>=658) && (digdata<=752)) duty=12;
if ((digdata>=753) && (digdata<=846)) duty=13;
if ((digdata>=847) && (digdata<=940)) duty=14;
if ((digdata>=941) && (digdata<=1023)) duty=15;
printf(lcd_putc,"\fDigData=%lu",digdata);
delay_ms(50);
}
}