Actualmente estoy codificando un controlador de vuelo desde cero y actualmente estoy trabajando en el módulo para decodificar la señal PPM entrante. Teniendo en cuenta que este es un ISR, solo he limitado su funcionalidad para leer los valores del canal de mi receptor. Está funcionando totalmente bien, pero quería algunos comentarios y mejoras en el mismo (si es posible). El ISR es el siguiente:
void measureChannel(){
int elapsedTime = t.read_us();
//if any pulse shorter than 1000us, discard as garbage
if(elapsedTime < 900){
t.reset();
return;
}
else{
//if start/stop sequence, then set currentChannel = 1 and begin to read
if(elapsedTime > 2100) {
currentChannel = 1;
t.reset();
return;
}
//read channel value
else if(elapsedTime >= 1000 && elapsedTime <= 2000){
if(currentChannel == 1){
channelVal[0] = elapsedTime;
currentChannel = 2;
t.reset();
return;
}
else if(currentChannel == 2){
channelVal[1] = elapsedTime;
currentChannel = 3;
t.reset();
return;
}
else if(currentChannel == 3){
channelVal[2] = elapsedTime;
currentChannel = 4;
t.reset();
return;
}
else if(currentChannel == 4){
channelVal[3] = elapsedTime;
currentChannel = 5;
t.reset();
return;
}
else if(currentChannel == 5){
channelVal[4] = elapsedTime;
currentChannel = 6;
t.reset();
return;
}
else if(currentChannel == 6){
channelVal[5] = elapsedTime;
currentChannel = 0;
t.reset();
return;
}
}
}
}
Las variables globales relevantes y varias instancias se inicializan de la siguiente manera:
Timer t;
InterruptIn ppmPin(PB_5);
uint16_t channelVal[6];
uint8_t currentChannel = 1;