Автор Тема: Серво контрол  (Прочетена 30635 пъти)

sv_shady

  • Administrator
  • *****
  • Публикации: 636
    • Профил
Серво контрол
« Отговор #15 -: Ноември 20, 2009, 04:08:37 pm »
Ами да може би е по-правилно се нарече продължителност, за да не се бърка с термина "период". Хубавото е поне, че от диаграмата са се изчистили неяснотите. Ако трябва да бъдем най-точни трябва да говорим за коефициент на запълване, но тогава има разни сметки и ако го видиш за първи път далеч няма да ти е ясно.
Imagination is the only limit.......

Светлин Пенков
София / Рединг, Великобритания

IbT

  • Зомбиран Роботостроител
  • *****
  • Публикации: 156
    • Профил
Серво контрол
« Отговор #16 -: Ноември 20, 2009, 06:42:37 pm »
Съгласен съм с теб, че най-точно е да се каже коефициент на запълване, но ако наистина не разбираш от тези неща ще се чудиш за какво става върпос :)

Alternative

  • Вече знае какво е робот!
  • *****
  • Публикации: 48
    • Профил
Серво контрол
« Отговор #17 -: Ноември 24, 2009, 07:04:34 pm »
Ето и един код (отново на CCS) за управляването на серво чрез adc модула на микроконтролера


#device adc=8 // ako adc=10, то долу трябва да е разделено на 1024
#define min_pulse 500
#define max_pulse 2400

void main(){
int i;
/*
code
*/
set_adc_channel(0); // PIN_A0

for (;;)
     for (i=0;i<50;i++){
          k=read_adc();
          pulse_width=min_pulse + (max_pulse-min_pulse)/256*k;
          output_bit(PIN_A1,1);  //Servo pin High - Pulse Start
          delay_us(pulse_width);
          output_bit(PIN_A1,0); //Servo pin Low - Pulse End
          delay_us(20000-pulse_width);
      }  
}


Но имам въпрос- Когато искам да изпратя от друг микроконтролер на къде да се върти, се получава така, че сервото всъщност не реагира на промяната на тримера и "държи" в първоначалната позиция.

Кодът на получаващият микроконтролер :

unsigned char k;
for(;;){
       for(i=0;i<50;i++){
          k=getc();
          pulse_width=min_pulse + (max_pulse-min_pulse)/256*((int)k);
       
          output_bit(PIN_A1,1);
          delay_us(pulse_width);
          output_bit(PIN_A1,0);
          delay_us(20000-pulse_width);
      }  
   
  }


Кодът на изпращащият микроконтролер :

set_adc_channel(0);
for(;;){
      data=read_adc();
      putc(data);
      delay_ms(20); //да изчака др. микроконтролер да бъде готов
   }



RS-232 работи до колкото знам добре (тествах го да изпраща 'A' или 'B' и другият обработваше информацията така, като трябва).
Даниел Ангелов, гр. София