1
0
Fork 0
mirror of https://github.com/betaflight/betaflight.git synced 2025-07-19 14:25:20 +03:00

Add inverted option (#4577)

This commit is contained in:
jflyper 2018-03-20 10:05:55 +09:00 committed by Michael Keller
parent 2ba0f74f5f
commit e3c258d65f
3 changed files with 31 additions and 7 deletions

View file

@ -67,7 +67,8 @@ PG_RESET_TEMPLATE(cameraControlConfig_t, cameraControlConfig,
.refVoltage = 330, .refVoltage = 330,
.keyDelayMs = 180, .keyDelayMs = 180,
.internalResistance = 470, .internalResistance = 470,
.ioTag = IO_TAG(CAMERA_CONTROL_PIN) .ioTag = IO_TAG(CAMERA_CONTROL_PIN),
.inverted = 0, // Output is inverted externally
); );
static struct { static struct {
@ -75,21 +76,40 @@ static struct {
IO_t io; IO_t io;
timerChannel_t channel; timerChannel_t channel;
uint32_t period; uint32_t period;
uint8_t inverted;
} cameraControlRuntime; } cameraControlRuntime;
static uint32_t endTimeMillis; static uint32_t endTimeMillis;
#ifdef CAMERA_CONTROL_SOFTWARE_PWM_AVAILABLE #ifdef CAMERA_CONTROL_SOFTWARE_PWM_AVAILABLE
static void cameraControlHi(void)
{
if (cameraControlRuntime.inverted) {
IOLo(cameraControlRuntime.io);
} else {
IOHi(cameraControlRuntime.io);
}
}
static void cameraControlLo(void)
{
if (cameraControlRuntime.inverted) {
IOHi(cameraControlRuntime.io);
} else {
IOLo(cameraControlRuntime.io);
}
}
void TIM6_DAC_IRQHandler(void) void TIM6_DAC_IRQHandler(void)
{ {
IOHi(cameraControlRuntime.io); cameraControlHi();
TIM6->SR = 0; TIM6->SR = 0;
} }
void TIM7_IRQHandler(void) void TIM7_IRQHandler(void)
{ {
IOLo(cameraControlRuntime.io); cameraControlLo();
TIM7->SR = 0; TIM7->SR = 0;
} }
@ -100,6 +120,7 @@ void cameraControlInit(void)
if (cameraControlConfig()->ioTag == IO_TAG_NONE) if (cameraControlConfig()->ioTag == IO_TAG_NONE)
return; return;
cameraControlRuntime.inverted = cameraControlConfig()->inverted;
cameraControlRuntime.io = IOGetByTag(cameraControlConfig()->ioTag); cameraControlRuntime.io = IOGetByTag(cameraControlConfig()->ioTag);
IOInit(cameraControlRuntime.io, OWNER_CAMERA_CONTROL, 0); IOInit(cameraControlRuntime.io, OWNER_CAMERA_CONTROL, 0);
@ -117,7 +138,7 @@ void cameraControlInit(void)
IOConfigGPIOAF(cameraControlRuntime.io, IOCFG_AF_PP, timerHardware->alternateFunction); IOConfigGPIOAF(cameraControlRuntime.io, IOCFG_AF_PP, timerHardware->alternateFunction);
#endif #endif
pwmOutConfig(&cameraControlRuntime.channel, timerHardware, CAMERA_CONTROL_TIMER_HZ, CAMERA_CONTROL_PWM_RESOLUTION, 0, 0); pwmOutConfig(&cameraControlRuntime.channel, timerHardware, CAMERA_CONTROL_TIMER_HZ, CAMERA_CONTROL_PWM_RESOLUTION, 0, cameraControlRuntime.inverted);
cameraControlRuntime.period = CAMERA_CONTROL_PWM_RESOLUTION; cameraControlRuntime.period = CAMERA_CONTROL_PWM_RESOLUTION;
*cameraControlRuntime.channel.ccr = cameraControlRuntime.period; *cameraControlRuntime.channel.ccr = cameraControlRuntime.period;
@ -125,8 +146,9 @@ void cameraControlInit(void)
#endif #endif
} else if (CAMERA_CONTROL_MODE_SOFTWARE_PWM == cameraControlConfig()->mode) { } else if (CAMERA_CONTROL_MODE_SOFTWARE_PWM == cameraControlConfig()->mode) {
#ifdef CAMERA_CONTROL_SOFTWARE_PWM_AVAILABLE #ifdef CAMERA_CONTROL_SOFTWARE_PWM_AVAILABLE
IOConfigGPIO(cameraControlRuntime.io, IOCFG_OUT_PP); IOConfigGPIO(cameraControlRuntime.io, IOCFG_OUT_PP);
IOHi(cameraControlRuntime.io); cameraControlHi();
cameraControlRuntime.period = CAMERA_CONTROL_SOFT_PWM_RESOLUTION; cameraControlRuntime.period = CAMERA_CONTROL_SOFT_PWM_RESOLUTION;
cameraControlRuntime.enabled = true; cameraControlRuntime.enabled = true;
@ -208,9 +230,9 @@ void cameraControlKeyPress(cameraControlKey_e key, uint32_t holdDurationMs)
const uint32_t hiTime = lrintf(dutyCycle * cameraControlRuntime.period); const uint32_t hiTime = lrintf(dutyCycle * cameraControlRuntime.period);
if (0 == hiTime) { if (0 == hiTime) {
IOLo(cameraControlRuntime.io); cameraControlLo();
delay(cameraControlConfig()->keyDelayMs + holdDurationMs); delay(cameraControlConfig()->keyDelayMs + holdDurationMs);
IOHi(cameraControlRuntime.io); cameraControlHi();
} else { } else {
TIM6->CNT = hiTime; TIM6->CNT = hiTime;
TIM6->ARR = cameraControlRuntime.period; TIM6->ARR = cameraControlRuntime.period;

View file

@ -45,6 +45,7 @@ typedef struct cameraControlConfig_s {
uint16_t internalResistance; uint16_t internalResistance;
ioTag_t ioTag; ioTag_t ioTag;
uint8_t inverted;
} cameraControlConfig_t; } cameraControlConfig_t;
PG_DECLARE(cameraControlConfig_t, cameraControlConfig); PG_DECLARE(cameraControlConfig_t, cameraControlConfig);

View file

@ -901,6 +901,7 @@ const clivalue_t valueTable[] = {
{ "camera_control_ref_voltage", VAR_UINT16 | MASTER_VALUE, .config.minmax = { 200, 400 }, PG_CAMERA_CONTROL_CONFIG, offsetof(cameraControlConfig_t, refVoltage) }, { "camera_control_ref_voltage", VAR_UINT16 | MASTER_VALUE, .config.minmax = { 200, 400 }, PG_CAMERA_CONTROL_CONFIG, offsetof(cameraControlConfig_t, refVoltage) },
{ "camera_control_key_delay", VAR_UINT16 | MASTER_VALUE, .config.minmax = { 100, 500 }, PG_CAMERA_CONTROL_CONFIG, offsetof(cameraControlConfig_t, keyDelayMs) }, { "camera_control_key_delay", VAR_UINT16 | MASTER_VALUE, .config.minmax = { 100, 500 }, PG_CAMERA_CONTROL_CONFIG, offsetof(cameraControlConfig_t, keyDelayMs) },
{ "camera_control_internal_resistance", VAR_UINT16 | MASTER_VALUE, .config.minmax = { 10, 1000 }, PG_CAMERA_CONTROL_CONFIG, offsetof(cameraControlConfig_t, internalResistance) }, { "camera_control_internal_resistance", VAR_UINT16 | MASTER_VALUE, .config.minmax = { 10, 1000 }, PG_CAMERA_CONTROL_CONFIG, offsetof(cameraControlConfig_t, internalResistance) },
{ "camera_control_inverted", VAR_UINT8 | MASTER_VALUE | MODE_LOOKUP, .config.lookup = { TABLE_OFF_ON }, PG_CAMERA_CONTROL_CONFIG, offsetof(cameraControlConfig_t, inverted) },
#endif #endif
// PG_RANGEFINDER_CONFIG // PG_RANGEFINDER_CONFIG