beyler, 5 tane servo motor aldım. Bunları pot ile sürmem gerek ancak programını yazamadım.5 ini aynı anda kontrol etmeden önce ilk olarak RB0 pinindekini kontrol etmeyi deniyorum ama olmuyor. Forumda da aradım ancak CCS C dilinde yazılmışını bulamadım, yardımcı olabilecek varmı?
(http://i.hizliresim.com/MYJLkk.jpg)
KODLAR;
#include <16f877A.h> // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.
#device ADC=10 // 10 bitlik ADC kullanılacağı belirtiliyor.
#use delay (clock=4000000) // Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor.
#define fast_io_a
#define fast_io_b
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD,STVREN
int i;
int a,potvalue;
void main ( )
{
setup_spi(SPI_SS_DISABLED);
setup_timer_1(T1_DISABLED);
setup_ccp1(CCP_PWM);
setup_timer_2(T2_DIV_BY_16,124,1); // Timer2 ayarları yapılıyor
enable_interrupts(GLOBAL); // Tüm kesmeler aktif
set_pwm1_duty(50); // PWM1 çıkışı görev saykılı belirleniyor
set_tris_a(0xFF);
set_tris_b(0x00);
output_b(0x00);
while(true)
{
set_adc_channel(0);
delay_us(20);
potvalue=read_adc();
a=potvalue*10+600;
if (a>2600) {
a=2650; }
for (i=0;i<50;i++)
{
output_high(pin_a0);
delay_us(a);
output_low(pin_a0);
delay_us(20000-a);
}
}
}
set_adc_channel(0);
ilk olarak bu kısımda hata var. pin A0 ı adc okumak için kullanıyor burası
setup_adc_ports(AN0_AN1_AN2_AN3_AN4); olarak değiştirmelisin
cevabın için teşekkürler,denedim ama olmadı :/
Alıntı yapılan: SK - 01 Mayıs 2014, 20:52:21
cevabın için teşekkürler,denedim ama olmadı :/
Osiloskopla istediğin dalga şekli çıkıyormu bakarmısın.
Aldığınız servolar R/c mi digital mi ? ayrıca ilk defa 2600 ms palsi gördüm. ben pot ile çok defa kullandım.2 ms olarak . analog değeri 5/1024 ile çarparak voltaj değeri oluşturun bunu 400 ile çarpın . yada 200 ile çarpıp 1000 ekleme yapın(TAmamen hassasyet amaçlı. ) Ve R/c servolarda delay_ms değeri low için 20ms dir. değişmez. digital ise yaptığınız gibi. pic ile motoru farklı kaynaklardan besleyin. İyi çalışmalar.
adlığım servo motorlar http://www.hobbyking.com/hobbyking/store/__16269__hk15138_standard_analog_servo_38g_4_3kg_0_17s.html (http://www.hobbyking.com/hobbyking/store/__16269__hk15138_standard_analog_servo_38g_4_3kg_0_17s.html)
bugün başka bi program yazıp denedim ama biraz sorun var, sorun da şu şekilde;
Potansiyometre ile PWM üretme (konum sorunu) (http://www.youtube.com/watch?v=54gpS82Y8O4#)
programı ve devresi de şu şekilde;
#include <16F877A.h>
#device adc=8
#fuses XT,NOWDT,NOPROTECT,BROWNOUT,PUT,NOLVP
#use delay(clock=4000000)
//================================
void main()
{
int8 value;
setup_ccp1(CCP_PWM);
setup_timer_2(T2_DIV_BY_16, 255, 1);
setup_port_a(AN0);
setup_adc(ADC_CLOCK_DIV_8);
set_adc_channel(0);
delay_us(20);
while(1)
{
value = read_adc();
set_pwm1_duty(value);
}
}
devresi;
http://i.hizliresim.com/qq5Y0q.jpg (http://i.hizliresim.com/qq5Y0q.jpg)
yardımcı olabilecek arkadaşlar varsa 4 gozle bekliyorum.
ADC ile okuduğun değeri 3 bölüme ayır örnek, 0-75 , 76-150, 151-255 gibi.
BU aralıklardan birincisi için motor sola döndürme görevi ver.
Ve pwm ile gerekli sinyali üret.
ikinci kısma motor orta konumda durma görevi ona göre bir pwm sinyal üret.
üçüncüsü için sağa dönme ile ilgili pwm değeri ürettir.
Böylelikle kararsız çalışma alanı bırakmamış olursun.
Kullandığın servo'nun gerekli pwm değerlerini araştırmanı tavsiye ederim.
takıldığım yer şurası;
Alıntı yapılan: salih - 29 Haziran 2014, 13:27:35
BU aralıklardan birincisi için motor sola döndürme görevi ver.
Ve pwm ile gerekli sinyali üret.
adc ile okunan değeri 3 aralığa ayırmayı ve ona göre pwm üretmeyi şu şekilde yapabiliriz;
while(1)
{
value = read_adc();
if (0<value<=75){
set_pwm1_duty(value);}
if (76<value<=150) {
set_pwm1_duty(value); }
if (150<value<=255) {
set_pwm1_duty(value); }
}
kolay ancak sola döndürme emrini nasıl vereceğim?
eğer senin servo çok farklı değilse sağa, sola dönme ve sabit durma pwm'nin on olma süresine bağlıdır.
Aşağıda örnek bir sinyal var, senin servoya uyarmı bilmem. Ama bir fikrin olsun diye veriyorum.
(http://pamungkas99.files.wordpress.com/2010/02/servo2.jpg)
gecikmeli cevabım için kusura bakmayın, dediğnizi anladım ama çözünürlüğü programsal olarak nasıl halledebilirim?
Neyin çözünürlüğü?
bi başka forumda aynı sorun için çözümün pwm çözünürlüğünden kaynaklandığını, artırılması gerektiğini okumuştum.
Alıntı yapılan: SK - 03 Temmuz 2014, 00:43:04
bi başka forumda aynı sorun için çözümün pwm çözünürlüğünden kaynaklandığını, artırılması gerektiğini okumuştum.
Kullandığın servo'ların pwm özelliklerini öğrendin mi?
Eğer öğrendi isen ona göre çözüm bulalım.
bulabildiğim tüm özellikleri bunlar;
Spec.
Torque: 3.8kg @ 4.8v, 4.3kg @ 6v
Weight: 38g
Speed: 0.21 / 60deg @4.8v, 0.17 / 60deg @ 6v
Voltage:4.8v~6v
Plug: JR Style
Torque: 3.8kg @ 4.8v, 4.3kg @ 6v
Weight: 38g
Speed: 0.21 / 60deg @4.8v, 0.17 / 60deg @ 6v
Spec.Torque: 3.8kg@ 4.8v, 4.3kg @ 6vWeight
Speed: 0.21/ 60deg @4.8v, 0.17 / 60deg @ 6vVoltage
Serdar Çiçek Hocanın kitabın da verdiği RC Servo örneğini veriyorum.
Aşağıdaki link den indirebilirsin.
https://dl.dropboxusercontent.com/u/20087162/Pic_Program/R_C%20Servo%20Motor%20Uygulamas%C4%B1.rar (https://dl.dropboxusercontent.com/u/20087162/Pic_Program/R_C%20Servo%20Motor%20Uygulamas%C4%B1.rar)
pic 16F887 kullanarak potansiyometre ile 4 tane servo motoru kontrol ettirmek istiyorum. CCS C dilinde.
yardımcı olabilecek var mı?