1
0
Fork 0
mirror of https://github.com/betaflight/betaflight.git synced 2025-07-26 09:45:37 +03:00

Fix out of order PPM ISR // Fix PPM for SPRACINGF3EVO

This commit is contained in:
borisbstyle 2016-05-04 23:39:19 +02:00
parent e9963f454b
commit 771f2c61eb
2 changed files with 79 additions and 14 deletions

View file

@ -403,7 +403,7 @@ static void resetConf(void)
masterConfig.dcm_ki = 0; // 0.003 * 10000 masterConfig.dcm_ki = 0; // 0.003 * 10000
masterConfig.gyro_lpf = 0; // 256HZ default masterConfig.gyro_lpf = 0; // 256HZ default
masterConfig.gyro_sync_denom = 4; masterConfig.gyro_sync_denom = 4;
masterConfig.gyro_soft_lpf_hz = 85; masterConfig.gyro_soft_lpf_hz = 90;
masterConfig.pid_process_denom = 2; masterConfig.pid_process_denom = 2;

View file

@ -20,8 +20,9 @@
#include <stdlib.h> #include <stdlib.h>
#include "platform.h" #include <platform.h>
#include "build_config.h" #include "build_config.h"
#include "debug.h"
#include "common/utils.h" #include "common/utils.h"
@ -35,16 +36,18 @@
#include "pwm_rx.h" #include "pwm_rx.h"
#define DEBUG_PPM_ISR
#define PPM_CAPTURE_COUNT 12 #define PPM_CAPTURE_COUNT 12
#define PWM_INPUT_PORT_COUNT 8 #define PWM_INPUT_PORT_COUNT 8
#if PPM_CAPTURE_COUNT > MAX_PWM_INPUT_PORTS #if PPM_CAPTURE_COUNT > PWM_INPUT_PORT_COUNT
#define PWM_PORTS_OR_PPM_CAPTURE_COUNT PPM_CAPTURE_COUNT #define PWM_PORTS_OR_PPM_CAPTURE_COUNT PPM_CAPTURE_COUNT
#else #else
#define PWM_PORTS_OR_PPM_CAPTURE_COUNT PWM_INPUT_PORT_COUNT #define PWM_PORTS_OR_PPM_CAPTURE_COUNT PWM_INPUT_PORT_COUNT
#endif #endif
// TODO - change to timer cloks ticks // TODO - change to timer clocks ticks
#define INPUT_FILTER_TO_HELP_WITH_NOISE_FROM_OPENLRS_TELEMETRY_RX 0x03 #define INPUT_FILTER_TO_HELP_WITH_NOISE_FROM_OPENLRS_TELEMETRY_RX 0x03
static inputFilteringMode_e inputFilteringMode; static inputFilteringMode_e inputFilteringMode;
@ -85,7 +88,8 @@ static uint8_t ppmCountShift = 0;
typedef struct ppmDevice_s { typedef struct ppmDevice_s {
uint8_t pulseIndex; uint8_t pulseIndex;
uint32_t previousTime; //uint32_t previousTime;
uint32_t currentCapture;
uint32_t currentTime; uint32_t currentTime;
uint32_t deltaTime; uint32_t deltaTime;
uint32_t captures[PWM_PORTS_OR_PPM_CAPTURE_COUNT]; uint32_t captures[PWM_PORTS_OR_PPM_CAPTURE_COUNT];
@ -95,6 +99,7 @@ typedef struct ppmDevice_s {
uint8_t stableFramesSeenCount; uint8_t stableFramesSeenCount;
bool tracking; bool tracking;
bool overflowed;
} ppmDevice_t; } ppmDevice_t;
ppmDevice_t ppmDev; ppmDevice_t ppmDev;
@ -125,10 +130,35 @@ void pwmRxInit(inputFilteringMode_e initialInputFilteringMode)
inputFilteringMode = initialInputFilteringMode; inputFilteringMode = initialInputFilteringMode;
} }
#ifdef DEBUG_PPM_ISR
typedef enum {
SOURCE_OVERFLOW = 0,
SOURCE_EDGE = 1
} eventSource_e;
typedef struct ppmISREvent_s {
eventSource_e source;
uint32_t capture;
} ppmISREvent_t;
static ppmISREvent_t ppmEvents[20];
static uint8_t ppmEventIndex = 0;
void ppmISREvent(eventSource_e source, uint32_t capture)
{
ppmEventIndex = (ppmEventIndex + 1) % (sizeof(ppmEvents) / sizeof(ppmEvents[0]));
ppmEvents[ppmEventIndex].source = source;
ppmEvents[ppmEventIndex].capture = capture;
}
#else
void ppmISREvent(eventSource_e source, uint32_t capture) {}
#endif
static void ppmInit(void) static void ppmInit(void)
{ {
ppmDev.pulseIndex = 0; ppmDev.pulseIndex = 0;
ppmDev.previousTime = 0; ppmDev.currentCapture = 0;
ppmDev.currentTime = 0; ppmDev.currentTime = 0;
ppmDev.deltaTime = 0; ppmDev.deltaTime = 0;
ppmDev.largeCounter = 0; ppmDev.largeCounter = 0;
@ -136,42 +166,77 @@ static void ppmInit(void)
ppmDev.numChannelsPrevFrame = -1; ppmDev.numChannelsPrevFrame = -1;
ppmDev.stableFramesSeenCount = 0; ppmDev.stableFramesSeenCount = 0;
ppmDev.tracking = false; ppmDev.tracking = false;
ppmDev.overflowed = false;
} }
static void ppmOverflowCallback(timerOvrHandlerRec_t* cbRec, captureCompare_t capture) static void ppmOverflowCallback(timerOvrHandlerRec_t* cbRec, captureCompare_t capture)
{ {
UNUSED(cbRec); UNUSED(cbRec);
ppmISREvent(SOURCE_OVERFLOW, capture);
ppmDev.largeCounter += capture + 1; ppmDev.largeCounter += capture + 1;
if (capture == PPM_TIMER_PERIOD - 1) {
ppmDev.overflowed = true;
}
} }
static void ppmEdgeCallback(timerCCHandlerRec_t* cbRec, captureCompare_t capture) static void ppmEdgeCallback(timerCCHandlerRec_t* cbRec, captureCompare_t capture)
{ {
UNUSED(cbRec); UNUSED(cbRec);
ppmISREvent(SOURCE_EDGE, capture);
int32_t i; int32_t i;
/* Shift the last measurement out */ uint32_t previousTime = ppmDev.currentTime;
ppmDev.previousTime = ppmDev.currentTime; uint32_t previousCapture = ppmDev.currentCapture;
/* Grab the new count */ /* Grab the new count */
ppmDev.currentTime = capture; uint32_t currentTime = capture;
/* Convert to 32-bit timer result */ /* Convert to 32-bit timer result */
ppmDev.currentTime += ppmDev.largeCounter; currentTime += ppmDev.largeCounter;
if (capture < previousCapture) {
if (ppmDev.overflowed) {
currentTime += PPM_TIMER_PERIOD;
}
}
// Divide by 8 if Oneshot125 is active and this is a CC3D board // Divide by 8 if Oneshot125 is active and this is a CC3D board
ppmDev.currentTime = ppmDev.currentTime >> ppmCountShift; currentTime = currentTime >> ppmCountShift;
/* Capture computation */ /* Capture computation */
ppmDev.deltaTime = ppmDev.currentTime - ppmDev.previousTime; if (currentTime > previousTime) {
ppmDev.deltaTime = currentTime - (previousTime + (ppmDev.overflowed ? (PPM_TIMER_PERIOD >> ppmCountShift) : 0));
} else {
ppmDev.deltaTime = (PPM_TIMER_PERIOD >> ppmCountShift) + currentTime - previousTime;
}
ppmDev.previousTime = ppmDev.currentTime; ppmDev.overflowed = false;
#if 0
/* Store the current measurement */
ppmDev.currentTime = currentTime;
ppmDev.currentCapture = capture;
#if 1
static uint32_t deltaTimes[20]; static uint32_t deltaTimes[20];
static uint8_t deltaIndex = 0; static uint8_t deltaIndex = 0;
deltaIndex = (deltaIndex + 1) % 20; deltaIndex = (deltaIndex + 1) % 20;
deltaTimes[deltaIndex] = ppmDev.deltaTime; deltaTimes[deltaIndex] = ppmDev.deltaTime;
UNUSED(deltaTimes);
#endif
#if 1
static uint32_t captureTimes[20];
static uint8_t captureIndex = 0;
captureIndex = (captureIndex + 1) % 20;
captureTimes[captureIndex] = capture;
UNUSED(captureTimes);
#endif #endif
/* Sync pulse detection */ /* Sync pulse detection */