Paso 12: Arduino Demo: entrada PWM
También he adjuntado una captura de pantalla de analizador de lógica para mostrar como ven las señales de mis receptores de radio RC. Cada uno de esos pulsos tienen un ancho de pulso entre 1000 y 2000 microsegundos, el período es cerca de 20 milisegundos.
Para obtener más información, de investigación:
- PWM
- Señales de servo
- ISRs en AVR (rutina de servicio de interrupción)
- Interrumpir el PCINT, cambio de Pin
- temporizadores de 16 bits en AVR
Aquí está el código:
void setup(){
DDR = 0; pines como entrada
permiten PCINT 18 a 23
PCICR | = (1 << PCIE2);
PCMSK2 = 0XFC;
Serial.Begin(115200);
}
typedef struct {}
borde de bytes;
Tiempo largo sin firmar;
fallTime largo sin firmar;
unsigned int lastGoodWidth;
} tPinTimingData;
tPinTimingData estático volátil pinData [6 + 1];
estática volátil uint8_t PCintLast;
ISR(PCINT2_vect)
{
uint8_t poco;
curr uint8_t;
máscara de uint8_t;
currentTime uint32_t;
tiempo de uint32_t;
obtener los Estados de pin en el puerto indicado.
curr = PINC & 0xFC;
máscara = curr ^ PCintLast;
PCintLast = curr;
currentTime = micros();
la máscara es pcint pins que han cambiado.
para (uint8_t i = 0; i < 6; i ++) {}
bit = 0 x 04 <<.
Si {} (bit & máscara)
para cada pin cambiado, tiempo de cambio de registro
Si (bit & PCintLast) {}
tiempo = currentTime - pinData [i] .fallTime;
pinData [i] .riseTime = currentTime;
Si ((tiempo > = 10000) & & (tiempo < = 26000))
.edge pinData [i] = 1;
otra cosa
.edge pinData [i] = 0; flanco ascendente no válido detectado
}
Else {}
tiempo = currentTime - pinData [i] .riseTime;
pinData [i] .fallTime = currentTime;
Si ((tiempo > = 800) & & (tiempo < = 2200) & & (.edge pinData [i] == 1)) {}
pinData [i] .lastGoodWidth = tiempo;
.edge pinData [i] = 0;
}
}
}
}
}
void loop()
{
Serial.println();
para (byte i = 0; i < 6; i ++) {}
Serial.Print("C");
Serial.Print ((int) i + 1);
Serial.Print(":");
Serial.Print(pinData[i].lastGoodWidth);
Serial.Print (",");
}
Delay(500);
}