Помогите пожалуйста разобраться с кодом

Нет ответов
Flight
Offline
Зарегистрирован: 02.10.2013

Нашел вот такой код для управления бесколлекторными двигателями, но я его не понимаю. Совсем не понимаю, что там и за что отвечает. Если кто то может помочь то распишите комментариями к строкам прямо в коде, что за что отвечает и делает. Помогите пожалуйста!

/*
PPM Mixer V7 Simplo
 ferrara [ar] libero.it
 */
#define MAXCHANIN 5
#define MAXCHANOUT 4

int channelIn[MAXCHANIN];
int channelOut[MAXCHANOUT];

void mixer()
{
  channelOut[0]=channelIn[0];
  channelOut[1]=channelIn[1];
  channelOut[2]=channelIn[2];
  channelOut[3]=channelIn[3];
}

/** RX Section **/
//***********************************************************************************************************************
#define CENTER 1520 // in microseconds
int rawIn[5];

void setupRx()
{
  pinMode(2, INPUT); // 3 is used for esc
  pinMode(4, INPUT);
  pinMode(5, INPUT);
  pinMode(6, INPUT);
  pinMode(7, INPUT);
  // interrupt on pin change PCINT
  PCICR |= (1 << PCIE2);

  PCMSK2 = (1 << PCINT18) | // pin2
  (1 << PCINT20) | // pin4
  (1 << PCINT21) | // pin5
  (1 << PCINT22) | // pin6
  (1 << PCINT23) ; // pin7 // not need if you don't use RXDIRECT
}

#define MASKPCINT0 (1<<2)
#define MASKPCINT1 (1<<4)
#define MASKPCINT2 (1<<5)
#define MASKPCINT3 (1<<6)
#define MASKPCINT4 (1<<7)
ISR(PCINT2_vect)
{
  static byte newbit,oldbit,changed;
  static unsigned long startIn[5];
  static unsigned long time;
  time=micros(); 

  newbit=PIND;

  // This is a new VERY VERY VERY fast method 
  // 1 xor operation 


  changed=newbit^oldbit;

  if (changed&MASKPCINT0)
    if (newbit&MASKPCINT0) startIn[0]=time;
    else rawIn[0]=time-startIn[0];

  if (changed&MASKPCINT1)
    if (newbit&MASKPCINT1) startIn[1]=time;
    else rawIn[1]=time-startIn[1];

  if (changed&MASKPCINT2)
    if (newbit&MASKPCINT2) startIn[2]=time;
    else rawIn[2]=time-startIn[2];

  if (changed&MASKPCINT3)
    if (newbit&MASKPCINT3) startIn[3]=time;
    else rawIn[3]=time-startIn[3];

  if (changed&MASKPCINT4)
    if (newbit&MASKPCINT4) startIn[4]=time;
    else rawIn[4]=time-startIn[4];

  oldbit=newbit;
}

void updateRx()
{
  for(int i=0;i<MAXCHANIN;i++)
    if (rawIn[i]>800 && rawIn[i]<2200)
      channelIn[i]=rawIn[i]-CENTER;

}

/****************** ESC *************************/
void setupEsc()
{
  pinMode(9, OUTPUT); // OSC1A
  pinMode(10, OUTPUT); // OSC1B

  pinMode(3,OUTPUT); // OSC2A
  pinMode(11,OUTPUT); // OSC2B
}

void updateEsc()
{
  unsigned int period;

  period=CENTER+channelOut[0];
  period=limit(1000,period,2000);
  analogWrite(9,period>>3); 

  period=CENTER+channelOut[1];
  period=limit(1000,period,2000);
  analogWrite(10,period>>3); 

  period=CENTER+channelOut[2];
  period=limit(1000,period,2000);
  analogWrite(3,period>>3); 

  period=CENTER+channelOut[3];
  period=limit(1000,period,2000);
  analogWrite(11,period>>3); 
}

int limit(int mn,int in,int mx) 
{
  int out;

  if (in<mn) out=mn;
  else if (in>mx) out=mx;
  else out=in;

  return out;
}

/**************************************************************************************************/

void setup()
{
  setupEsc();
  setupRx();
}

void loop()
{
  updateRx();
  mixer();
  updateEsc();
}