Помогите пожалуйста разобраться с кодом
- Войдите на сайт для отправки комментариев
Ср, 28/05/2014 - 17:56
Нашел вот такой код для управления бесколлекторными двигателями, но я его не понимаю. Совсем не понимаю, что там и за что отвечает. Если кто то может помочь то распишите комментариями к строкам прямо в коде, что за что отвечает и делает. Помогите пожалуйста!
/*
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();
}