Ich muss mich hier doch nochmal melden.
Diese Methode ist leider zu ungenau.
Ich hab mit pulseIn() beispielsweise diese Werte hier für ein "statisches" Signal empfangen:
min 989
max 996
Differenz: 7
Diese Methode hier, mit Interrupts, funktioniert zwar, aber ich bekomme für das selbe Signal diese Werte:
min 964
max 1016
Differenz: 52
Das ist leider zu ungenau.
Die Differenz darf auf gar keinen Fall größer als 30 sein - besser im bereich von maximal 20, damit es sicherer ist - noch kleiner ist noch besser.
Der Code:
//----- Config -----//
// "PWM" input pins
uint8_t PWM_Channel_1_Pin = 2;
uint8_t PWM_Channel_2_Pin = 3;
uint8_t PWM_Channel_3_Pin = 4;
uint8_t PWM_Channel_4_Pin = 5;
uint8_t PWM_Channel_5_Pin = 6;
uint8_t PWM_Channel_6_Pin = 7;
uint8_t PWM_Channel_7_Pin = 8;
uint8_t PWM_Channel_8_Pin = 9;
//----- Config end-----//
// time counter for sending the SBUS packet not too often
unsigned long previousMillis = 0;
// ----- Interrupts for PWM captureing -----//
#include <PinChangeInt.h>
// storage for PWM values and time
volatile uint16_t PWM_Channel_1_Value = 0;
volatile uint16_t PWM_Channel_1_prev_time = 0;
volatile uint16_t PWM_Channel_2_Value = 0;
volatile uint16_t PWM_Channel_2_prev_time = 0;
volatile uint16_t PWM_Channel_3_Value = 0;
volatile uint16_t PWM_Channel_3_prev_time = 0;
volatile uint16_t PWM_Channel_4_Value = 0;
volatile uint16_t PWM_Channel_4_prev_time = 0;
volatile uint16_t PWM_Channel_5_Value = 0;
volatile uint16_t PWM_Channel_5_prev_time = 0;
volatile uint16_t PWM_Channel_6_Value = 0;
volatile uint16_t PWM_Channel_6_prev_time = 0;
volatile uint16_t PWM_Channel_7_Value = 0;
volatile uint16_t PWM_Channel_7_prev_time = 0;
volatile uint16_t PWM_Channel_8_Value = 0;
volatile uint16_t PWM_Channel_8_prev_time = 0;
uint8_t latest_interrupted_pin;
//Interrupt functions
void PWM_1_rising()
{
latest_interrupted_pin=PCintPort::arduinoPin;
PCintPort::attachInterrupt(latest_interrupted_pin, &PWM_1_falling, FALLING);
PWM_Channel_1_prev_time = micros();
}
void PWM_1_falling() {
latest_interrupted_pin=PCintPort::arduinoPin;
PCintPort::attachInterrupt(latest_interrupted_pin, &PWM_1_rising, RISING);
PWM_Channel_1_Value = micros()-PWM_Channel_1_prev_time;
}
void PWM_2_rising()
{
latest_interrupted_pin=PCintPort::arduinoPin;
PCintPort::attachInterrupt(latest_interrupted_pin, &PWM_2_falling, FALLING);
PWM_Channel_2_prev_time = micros();
}
void PWM_2_falling() {
latest_interrupted_pin=PCintPort::arduinoPin;
PCintPort::attachInterrupt(latest_interrupted_pin, &PWM_2_rising, RISING);
PWM_Channel_2_Value = micros()-PWM_Channel_2_prev_time;
}
void PWM_3_rising()
{
latest_interrupted_pin=PCintPort::arduinoPin;
PCintPort::attachInterrupt(latest_interrupted_pin, &PWM_3_falling, FALLING);
PWM_Channel_3_prev_time = micros();
}
void PWM_3_falling() {
latest_interrupted_pin=PCintPort::arduinoPin;
PCintPort::attachInterrupt(latest_interrupted_pin, &PWM_3_rising, RISING);
PWM_Channel_3_Value = micros()-PWM_Channel_3_prev_time;
}
void PWM_4_rising()
{
latest_interrupted_pin=PCintPort::arduinoPin;
PCintPort::attachInterrupt(latest_interrupted_pin, &PWM_4_falling, FALLING);
PWM_Channel_4_prev_time = micros();
}
void PWM_4_falling() {
latest_interrupted_pin=PCintPort::arduinoPin;
PCintPort::attachInterrupt(latest_interrupted_pin, &PWM_4_rising, RISING);
PWM_Channel_4_Value = micros()-PWM_Channel_4_prev_time;
}
void PWM_5_rising()
{
latest_interrupted_pin=PCintPort::arduinoPin;
PCintPort::attachInterrupt(latest_interrupted_pin, &PWM_5_falling, FALLING);
PWM_Channel_5_prev_time = micros();
}
void PWM_5_falling() {
latest_interrupted_pin=PCintPort::arduinoPin;
PCintPort::attachInterrupt(latest_interrupted_pin, &PWM_5_rising, RISING);
PWM_Channel_5_Value = micros()-PWM_Channel_5_prev_time;
}
void PWM_6_rising()
{
latest_interrupted_pin=PCintPort::arduinoPin;
PCintPort::attachInterrupt(latest_interrupted_pin, &PWM_6_falling, FALLING);
PWM_Channel_6_prev_time = micros();
}
void PWM_6_falling() {
latest_interrupted_pin=PCintPort::arduinoPin;
PCintPort::attachInterrupt(latest_interrupted_pin, &PWM_6_rising, RISING);
PWM_Channel_6_Value = micros()-PWM_Channel_6_prev_time;
}
void PWM_7_rising()
{
latest_interrupted_pin=PCintPort::arduinoPin;
PCintPort::attachInterrupt(latest_interrupted_pin, &PWM_7_falling, FALLING);
PWM_Channel_7_prev_time = micros();
}
void PWM_7_falling() {
latest_interrupted_pin=PCintPort::arduinoPin;
PCintPort::attachInterrupt(latest_interrupted_pin, &PWM_7_rising, RISING);
PWM_Channel_7_Value = micros()-PWM_Channel_7_prev_time;
}
void PWM_8_rising()
{
latest_interrupted_pin=PCintPort::arduinoPin;
PCintPort::attachInterrupt(latest_interrupted_pin, &PWM_8_falling, FALLING);
PWM_Channel_8_prev_time = micros();
}
void PWM_8_falling() {
latest_interrupted_pin=PCintPort::arduinoPin;
PCintPort::attachInterrupt(latest_interrupted_pin, &PWM_8_rising, RISING);
PWM_Channel_8_Value = micros()-PWM_Channel_8_prev_time;
}
int minimum = 0;
int maximum = 0;
int differenz = 0;
void print_debug()
{
if (minimum == 0 || PWM_Channel_6_Value < minimum)
{
minimum = PWM_Channel_6_Value;
}
if (maximum == 0 || PWM_Channel_6_Value > maximum)
{
maximum = PWM_Channel_6_Value;
}
differenz = maximum-minimum;
Serial.print("Minimum: ");
Serial.print(minimum);
Serial.print(" Maximum: ");
Serial.print(maximum);
Serial.print(" Differenz: ");
Serial.print(differenz);
Serial.print(" Aktuell: ");
Serial.println(PWM_Channel_6_Value);
}
void setup()
{
pinMode(PWM_Channel_1_Pin, INPUT); digitalWrite(PWM_Channel_1_Pin, HIGH);
pinMode(PWM_Channel_2_Pin, INPUT); digitalWrite(PWM_Channel_2_Pin, HIGH);
pinMode(PWM_Channel_3_Pin, INPUT); digitalWrite(PWM_Channel_3_Pin, HIGH);
pinMode(PWM_Channel_4_Pin, INPUT); digitalWrite(PWM_Channel_4_Pin, HIGH);
pinMode(PWM_Channel_5_Pin, INPUT); digitalWrite(PWM_Channel_5_Pin, HIGH);
pinMode(PWM_Channel_6_Pin, INPUT); digitalWrite(PWM_Channel_6_Pin, HIGH);
pinMode(PWM_Channel_7_Pin, INPUT); digitalWrite(PWM_Channel_7_Pin, HIGH);
pinMode(PWM_Channel_8_Pin, INPUT); digitalWrite(PWM_Channel_8_Pin, HIGH);
PCintPort::attachInterrupt(PWM_Channel_1_Pin, &PWM_1_rising, RISING);
PCintPort::attachInterrupt(PWM_Channel_2_Pin, &PWM_2_rising, RISING);
PCintPort::attachInterrupt(PWM_Channel_3_Pin, &PWM_3_rising, RISING);
PCintPort::attachInterrupt(PWM_Channel_4_Pin, &PWM_4_rising, RISING);
PCintPort::attachInterrupt(PWM_Channel_5_Pin, &PWM_5_rising, RISING);
PCintPort::attachInterrupt(PWM_Channel_6_Pin, &PWM_6_rising, RISING);
PCintPort::attachInterrupt(PWM_Channel_7_Pin, &PWM_7_rising, RISING);
PCintPort::attachInterrupt(PWM_Channel_8_Pin, &PWM_8_rising, RISING);
Serial.begin(115200);
}
void loop()
{
print_debug();
}