mirror of
https://github.com/betaflight/betaflight.git
synced 2025-07-26 01:35:41 +03:00
Fix PWM failsafe by monitoring for missing pwm rise/fall signal events.
This commit is contained in:
parent
aa719dfe4f
commit
c0a349ed60
2 changed files with 26 additions and 2 deletions
|
@ -58,6 +58,7 @@ typedef struct {
|
||||||
captureCompare_t rise;
|
captureCompare_t rise;
|
||||||
captureCompare_t fall;
|
captureCompare_t fall;
|
||||||
captureCompare_t capture;
|
captureCompare_t capture;
|
||||||
|
uint32_t largeCounter;
|
||||||
|
|
||||||
const timerHardware_t *timerHardware;
|
const timerHardware_t *timerHardware;
|
||||||
} pwmInputPort_t;
|
} pwmInputPort_t;
|
||||||
|
@ -212,6 +213,25 @@ static void ppmEdgeCallback(uint8_t port, captureCompare_t capture)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static uint8_t pwmChannelsReceived = 0;
|
||||||
|
|
||||||
|
#define MAX_MISSED_PWM_EVENTS 10
|
||||||
|
#define MAX_MISSED_PWM_EVENT_COUNTER (MAX_MISSED_PWM_EVENTS * PWM_TIMER_PERIOD)
|
||||||
|
|
||||||
|
extern uint16_t debug[4];
|
||||||
|
static void pwmOverflowCallback(uint8_t port, captureCompare_t capture)
|
||||||
|
{
|
||||||
|
pwmInputPort_t *pwmInputPort = &pwmInputPorts[port];
|
||||||
|
|
||||||
|
pwmInputPort->largeCounter += capture;
|
||||||
|
if (pwmInputPort->largeCounter > MAX_MISSED_PWM_EVENT_COUNTER) {
|
||||||
|
if (pwmInputPort->state == 0) {
|
||||||
|
captures[pwmInputPort->channel] = PPM_RCVR_TIMEOUT;
|
||||||
|
}
|
||||||
|
pwmInputPort->largeCounter = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void pwmEdgeCallback(uint8_t port, captureCompare_t capture)
|
static void pwmEdgeCallback(uint8_t port, captureCompare_t capture)
|
||||||
{
|
{
|
||||||
pwmInputPort_t *pwmInputPort = &pwmInputPorts[port];
|
pwmInputPort_t *pwmInputPort = &pwmInputPorts[port];
|
||||||
|
@ -231,6 +251,8 @@ static void pwmEdgeCallback(uint8_t port, captureCompare_t capture)
|
||||||
// switch state
|
// switch state
|
||||||
pwmInputPort->state = 0;
|
pwmInputPort->state = 0;
|
||||||
pwmICConfig(timerHardwarePtr->tim, timerHardwarePtr->channel, TIM_ICPolarity_Rising);
|
pwmICConfig(timerHardwarePtr->tim, timerHardwarePtr->channel, TIM_ICPolarity_Rising);
|
||||||
|
pwmChannelsReceived |= (1 << pwmInputPort->channel);
|
||||||
|
pwmInputPort->largeCounter = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -267,6 +289,8 @@ void pwmInConfig(const timerHardware_t *timerHardwarePtr, uint8_t channel)
|
||||||
{
|
{
|
||||||
pwmInputPort_t *p = &pwmInputPorts[channel];
|
pwmInputPort_t *p = &pwmInputPorts[channel];
|
||||||
|
|
||||||
|
p->state = 0;
|
||||||
|
p->largeCounter = 0;
|
||||||
p->channel = channel;
|
p->channel = channel;
|
||||||
p->mode = INPUT_MODE_PWM;
|
p->mode = INPUT_MODE_PWM;
|
||||||
p->timerHardware = timerHardwarePtr;
|
p->timerHardware = timerHardwarePtr;
|
||||||
|
@ -275,7 +299,7 @@ void pwmInConfig(const timerHardware_t *timerHardwarePtr, uint8_t channel)
|
||||||
pwmICConfig(timerHardwarePtr->tim, timerHardwarePtr->channel, TIM_ICPolarity_Rising);
|
pwmICConfig(timerHardwarePtr->tim, timerHardwarePtr->channel, TIM_ICPolarity_Rising);
|
||||||
|
|
||||||
timerConfigure(timerHardwarePtr, PWM_TIMER_PERIOD, PWM_TIMER_MHZ);
|
timerConfigure(timerHardwarePtr, PWM_TIMER_PERIOD, PWM_TIMER_MHZ);
|
||||||
configureTimerCaptureCompareInterrupt(timerHardwarePtr, channel, pwmEdgeCallback, NULL);
|
configureTimerCaptureCompareInterrupt(timerHardwarePtr, channel, pwmEdgeCallback, pwmOverflowCallback);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define UNUSED_PPM_TIMER_REFERENCE 0
|
#define UNUSED_PPM_TIMER_REFERENCE 0
|
||||||
|
|
|
@ -242,7 +242,7 @@ void processRxChannels(void)
|
||||||
|
|
||||||
bool shouldCheckPulse = true;
|
bool shouldCheckPulse = true;
|
||||||
|
|
||||||
if (feature(FEATURE_FAILSAFE | FEATURE_RX_PPM)) {
|
if (feature(FEATURE_FAILSAFE) && feature(FEATURE_RX_PPM)) {
|
||||||
shouldCheckPulse = isPPMDataBeingReceived();
|
shouldCheckPulse = isPPMDataBeingReceived();
|
||||||
resetPPMDataReceivedState();
|
resetPPMDataReceivedState();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue