Stap 12: Arduino Demo: PWM Input
Ik heb ook een logic analyzer screenshot om u te tonen hoe de signalen van mijn RC radioontvangers eruit toegevoegd. Elke één van deze peulvruchten hebben een pulsbreedte tussen 1000 en 2000 microseconden, de periode is ongeveer 20 milliseconden.
Voor meer informatie, onderzoek:
- PWM
- Servo-signalen
- ISRs in AVR (Interrupt Service Routine)
- PCINT, verandering van de Pin onderbreken
- 16-bits timers in AVR
Hier is de code:
VOID Setup{
DDRC = 0; pinnen als input
inschakelen van PCINT 18 tot en met 23
PCICR | = (1 << PCIE2);
PCMSK2 = 0XFC;
Serial.begin(115200);
}
typedef struct {}
byte rand;
unsigned long riseTime;
unsigned long fallTime;
unsigned int lastGoodWidth;
} tPinTimingData;
vluchtige statische tPinTimingData pinData [6 + 1];
vluchtige statische uint8_t PCintLast;
ISR(PCINT2_vect)
{
uint8_t bit;
uint8_t huidige;
uint8_t mask;
uint32_t currentTime;
uint32_t tijd;
de pin-Staten krijgen voor de aangegeven poort.
huidige = PINC & 0xFC;
masker = huidige ^ PCintLast;
PCintLast = huidige;
currentTime = micros();
masker is pcint pinnen die zijn gewijzigd.
voor (uint8_t ik = 0; ik < 6; i ++) {}
bits = 0x04 << i;
Als (bits & masker) {}
voor elke pin veranderd, de tijd van het wereldverslag van verandering
Als (bits & PCintLast) {}
tijd = currentTime - pinData [i] .fallTime;
pinData [i] .riseTime = currentTime;
Als ((tijd > = 10000) & & (tijd < = 26000))
pinData [i] .edge = 1;
anders
pinData [i] .edge = 0; Ongeldige stijgende rand gedetecteerd
}
else {}
tijd = currentTime - pinData [i] .riseTime;
pinData [i] .fallTime = currentTime;
Als ((tijd > = 800) & & (tijd < = 2200) & & (pinData [i] .edge == 1)) {}
pinData [i] .lastGoodWidth = tijd;
pinData [i] .edge = 0;
}
}
}
}
}
void loop
{
Serial.println();
voor (byte ik = 0; ik < 6; i ++) {}
Serial.Print("C");
Serial.Print ((int) i + 1);
Serial.Print(":");
Serial.Print(pinData[i].lastGoodWidth);
Serial.Print (",");
}
delay(500);
}