Помогите пожалуйста разобраться с кодом
- Войдите на сайт для отправки комментариев
Ср, 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(); }