By_Makinist
Üye
- Katılım
- 26 Ocak 2010
- Mesajlar
- 7
- Puanları
- 1
- Yaş
- 29
Merhabalar,
Rc servo motor kullanarak bir robot kolu tasarladım.18f4550 kullanmaktayım.Serdar ÇİÇEK'in paylaşmış olduğu timer0 kesmeli servo motor kontrol programı kullanmaktayım.Gayet güzel çalışıyor.Fakat önceden 20MHZ kristal kullanıyordum.Usb kontrolü kullandığım için PLL kullanarak Kristalimi 48MHZ olarak kullanıyorum.
Bu nedenle 20 MHZ deki set_timer0(113) değeri olmuyor.set_timer değerini hesaplama konusunda yardımcı olursanız sevinirim.
Bu program 20MHZ kullanınca sorunsuz çalışıyor.Fakat PLL ile 48 MHZ kullanınca bütün hesaplar karışıyor :/
Rc servo motor kullanarak bir robot kolu tasarladım.18f4550 kullanmaktayım.Serdar ÇİÇEK'in paylaşmış olduğu timer0 kesmeli servo motor kontrol programı kullanmaktayım.Gayet güzel çalışıyor.Fakat önceden 20MHZ kristal kullanıyordum.Usb kontrolü kullandığım için PLL kullanarak Kristalimi 48MHZ olarak kullanıyorum.
Bu nedenle 20 MHZ deki set_timer0(113) değeri olmuyor.set_timer değerini hesaplama konusunda yardımcı olursanız sevinirim.
Bu program 20MHZ kullanınca sorunsuz çalışıyor.Fakat PLL ile 48 MHZ kullanınca bütün hesaplar karışıyor :/
Kod:
#include <18F4550.h>
#device ADC=10
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,NOBROWNOUT
#use delay(clock=48000000)
#use fast_io(b)
#use fast_io(d)
int pwm=0,duty_0=0,duty_1=0,duty_2=0,duty_3=0,duty_4,duty_5=0,duty_6=0;
int16 zaman=0;
#int_timer0 // Timer0 taşma kesmesi
void kesme ()
{
set_timer0(113); // TMR0 kaydedicisine 113 değeri yükleniyor
if (pwm==0) // Eğer PWM değişkeni 0 ise
{
output_high(pin_b0); // RB0 çıkışı lojik-1
output_high(pin_b1); // RB1 çıkışı lojik-1
output_high(pin_b2); // RB2 çıkışı lojik-1
output_high(pin_b3); // RB3 çıkışı lojik-1
output_high(pin_b4); // RB4 çıkışı lojik-1
output_high(pin_b5); // RB5 çıkışı lojik-1
output_high(pin_b6); // RB6 çıkışı lojik-1
}
if (pwm>=duty_0) output_low(pin_b0);
if (pwm>=duty_1) output_low(pin_b1);
if (pwm>=duty_2) output_low(pin_b2);
if (pwm>=duty_3) output_low(pin_b3);
if (pwm>=duty_4) output_low(pin_b4);
if (pwm>=duty_5) output_low(pin_b5);
if (pwm>=duty_6) output_low(pin_b6);
zaman++;
// Servo motor dönüş adımları arası bekleme süresi için
if (zaman>17350) // 17350x114,4µsn=1.984.840µsn, yaklaşık 2msn
{
zaman=0;
}
pwm++;
if (pwm>=173)
pwm=0;
}
void main(void)
{
setup_timer_0(RTCC_INTERNAL | RTCC_DIV_4);
set_timer0(113);
enable_interrupts(int_timer0);
enable_interrupts(global);
output_b(0x00);
while(1) {
duty_0=9;
}
}