Pot ile servo motor sürmek istiyorum. 16f877a ve ccs diliyle.
denediğim kod aşağıdadır.
#include<16f877a.h>
#device adc=8
#use delay(clock=4m)
#fuses XT
int8 i,data;
int deger;
#int_timer0
void timer0()
{
i++;
if(i==0)
output_high(pin_c1);
if(i==data)
output_low(pin_c1);
SET_TIMER0(238);
}
void main()
{
setup_timer_0(RTCC_INTERNAL | RTCC_DIV_4);
SET_TIMER0(238);
enable_interrupts(INT_TIMER0);
enable_interrupts(GLOBAL);
SETUP_ADC(ADC_CLOCK_INTERNAL);
SETUP_ADC_PORTS(ALL_ANALOG);
output_low(pin_c1);
data=0;
while(true)
{
SET_ADC_CHANNEL(0);
delay_us(20);
deger=read_adc();
data=30.0*deger/255.0;
}
}
pottan değeri okuyup timer0 ile pwm üretiyorum, fakat her açı değerini elde edemiyorum.
yardımcı olabilecek var mıdır ?
neden yazılımsal pwm üretiyorsun ki 877de pwm çıkışı var onları kullanman daha iyi olmaz mı?
Daha önce kullanmadım araştırayım, elinizde örnek varsa paylaşabilir misiniz?
servo motor kullanımı için 50Hz lik pwm sinyal gereklidir. Bu 50 Hz sinyalin peryodu da 20ms yapar. Bu 20ms peryodun da duty si 1ms ile 2ms arasında olmalıdırki servo çalışsın. sizin timer kesmesi ile oluşturduğunuz pwm in çözünürlüğü az olduğundan her açıyı yakalayamamanız normal. picin donanımsal olarak 50Hz lik sinyal oluşturabilmeniz için kristal değerini 1MHz in altında kullanmanız gerekir.
Pwm çıkışını ayrı kullanabiliyorum, pottan aldığım analog veriyi ayrı okuyabiliyorum. Fakat ikisini birleştiremedim. Analog veriyi okuyup pwm olarak servoya iletme konusunda yetersizim.
set_pwm_duty1(değer); // adc den geler "değer"
Alıntı yapılan: ertuğrul54 - 21 Ekim 2021, 15:22:59set_pwm_duty1(değer); // adc den geler "değer"
Ama yinede hassas sekilde hareket etmiyor. +90 -90 +36 -73 gibi degerlerde hareket ediyor.
Alıntı yapılan: Atima - 22 Ekim 2021, 09:39:43Ama yinede hassas sekilde hareket etmiyor. +90 -90 +36 -73 gibi degerlerde hareket ediyor.
?
Potdan gelen ADC bilgisi 10 bit yani 0-1024 arası. Pwm 8 bit yani 0-255 arası. Potdan okunan değeri 4e bölüp yazmayı deneyin