1
0
Fork 0
mirror of https://github.com/betaflight/betaflight.git synced 2025-07-17 13:25:30 +03:00

Merge pull request #4879 from MotoLab/rtc6705_power_fixes

Fix power control for RTC6705 VTXs
This commit is contained in:
Michael Keller 2018-01-08 23:45:50 +13:00 committed by GitHub
commit 152f2ad762
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
10 changed files with 46 additions and 56 deletions

View file

@ -21,7 +21,7 @@
#include "platform.h" #include "platform.h"
#if defined(USE_CMS) #if defined(USE_CMS) && defined(VTX_RTC6705)
#include "common/printf.h" #include "common/printf.h"
#include "common/utils.h" #include "common/utils.h"

View file

@ -74,7 +74,7 @@ void vtxCommonSetBandAndChannel(uint8_t band, uint8_t channel)
// index is zero origin, zero = power off completely // index is zero origin, zero = power off completely
void vtxCommonSetPowerByIndex(uint8_t index) void vtxCommonSetPowerByIndex(uint8_t index)
{ {
if (vtxDevice && (index <= vtxDevice->capability.powerCount)) { if (vtxDevice && (index < vtxDevice->capability.powerCount)) {
if (vtxDevice->vTable->setPowerByIndex) { if (vtxDevice->vTable->setPowerByIndex) {
vtxDevice->vTable->setPowerByIndex(index); vtxDevice->vTable->setPowerByIndex(index);
} }

View file

@ -41,6 +41,12 @@
#define VTX_SETTINGS_MAX_FREQUENCY_MHZ 5999 //max freq (in MHz) for 'vtx_freq' setting #define VTX_SETTINGS_MAX_FREQUENCY_MHZ 5999 //max freq (in MHz) for 'vtx_freq' setting
#if defined(VTX_RTC6705)
#include "drivers/vtx_rtc6705.h"
#endif
#if defined(VTX_SMARTAUDIO) || defined(VTX_TRAMP) #if defined(VTX_SMARTAUDIO) || defined(VTX_TRAMP)
#define VTX_SETTINGS_POWER_COUNT 5 #define VTX_SETTINGS_POWER_COUNT 5
@ -52,8 +58,6 @@
#elif defined(VTX_RTC6705) #elif defined(VTX_RTC6705)
#include "io/vtx_rtc6705.h"
#define VTX_SETTINGS_POWER_COUNT VTX_RTC6705_POWER_COUNT #define VTX_SETTINGS_POWER_COUNT VTX_RTC6705_POWER_COUNT
#define VTX_SETTINGS_DEFAULT_POWER VTX_RTC6705_DEFAULT_POWER #define VTX_SETTINGS_DEFAULT_POWER VTX_RTC6705_DEFAULT_POWER
#define VTX_SETTINGS_MIN_POWER VTX_RTC6705_MIN_POWER #define VTX_SETTINGS_MIN_POWER VTX_RTC6705_MIN_POWER

View file

@ -117,7 +117,7 @@ static IO_t vtxCLKPin = IO_NONE;
// Define variables // Define variables
static const uint32_t channelArray[RTC6705_BAND_COUNT][RTC6705_CHANNEL_COUNT] = { static const uint32_t channelArray[VTX_RTC6705_BAND_COUNT][VTX_RTC6705_CHANNEL_COUNT] = {
{ RTC6705_SET_A1, RTC6705_SET_A2, RTC6705_SET_A3, RTC6705_SET_A4, RTC6705_SET_A5, RTC6705_SET_A6, RTC6705_SET_A7, RTC6705_SET_A8 }, { RTC6705_SET_A1, RTC6705_SET_A2, RTC6705_SET_A3, RTC6705_SET_A4, RTC6705_SET_A5, RTC6705_SET_A6, RTC6705_SET_A7, RTC6705_SET_A8 },
{ RTC6705_SET_B1, RTC6705_SET_B2, RTC6705_SET_B3, RTC6705_SET_B4, RTC6705_SET_B5, RTC6705_SET_B6, RTC6705_SET_B7, RTC6705_SET_B8 }, { RTC6705_SET_B1, RTC6705_SET_B2, RTC6705_SET_B3, RTC6705_SET_B4, RTC6705_SET_B5, RTC6705_SET_B6, RTC6705_SET_B7, RTC6705_SET_B8 },
{ RTC6705_SET_E1, RTC6705_SET_E2, RTC6705_SET_E3, RTC6705_SET_E4, RTC6705_SET_E5, RTC6705_SET_E6, RTC6705_SET_E7, RTC6705_SET_E8 }, { RTC6705_SET_E1, RTC6705_SET_E2, RTC6705_SET_E3, RTC6705_SET_E4, RTC6705_SET_E5, RTC6705_SET_E6, RTC6705_SET_E7, RTC6705_SET_E8 },
@ -196,8 +196,8 @@ static void rtc6705Transfer(uint32_t command)
*/ */
void rtc6705SetBandAndChannel(uint8_t band, uint8_t channel) void rtc6705SetBandAndChannel(uint8_t band, uint8_t channel)
{ {
band = constrain(band, 0, RTC6705_BAND_COUNT - 1); band = constrain(band, 0, VTX_RTC6705_BAND_COUNT - 1);
channel = constrain(channel, 0, RTC6705_CHANNEL_COUNT - 1); channel = constrain(channel, 0, VTX_RTC6705_CHANNEL_COUNT - 1);
spiSetDivisor(RTC6705_SPI_INSTANCE, SPI_CLOCK_SLOW); spiSetDivisor(RTC6705_SPI_INSTANCE, SPI_CLOCK_SLOW);
@ -211,7 +211,7 @@ void rtc6705SetBandAndChannel(uint8_t band, uint8_t channel)
*/ */
void rtc6705SetFreq(uint16_t frequency) void rtc6705SetFreq(uint16_t frequency)
{ {
frequency = constrain(frequency, RTC6705_FREQ_MIN, RTC6705_FREQ_MAX); frequency = constrain(frequency, VTX_RTC6705_FREQ_MIN, VTX_RTC6705_FREQ_MAX);
const uint32_t val_a = ((((uint64_t)frequency*(uint64_t)RTC6705_SET_DIVMULT*(uint64_t)RTC6705_SET_R)/(uint64_t)RTC6705_SET_DIVMULT) % RTC6705_SET_FDIV) / RTC6705_SET_NDIV; //Casts required to make sure correct math (large numbers) const uint32_t val_a = ((((uint64_t)frequency*(uint64_t)RTC6705_SET_DIVMULT*(uint64_t)RTC6705_SET_R)/(uint64_t)RTC6705_SET_DIVMULT) % RTC6705_SET_FDIV) / RTC6705_SET_NDIV; //Casts required to make sure correct math (large numbers)
const uint32_t val_n = (((uint64_t)frequency*(uint64_t)RTC6705_SET_DIVMULT*(uint64_t)RTC6705_SET_R)/(uint64_t)RTC6705_SET_DIVMULT) / RTC6705_SET_FDIV; //Casts required to make sure correct math (large numbers) const uint32_t val_n = (((uint64_t)frequency*(uint64_t)RTC6705_SET_DIVMULT*(uint64_t)RTC6705_SET_R)/(uint64_t)RTC6705_SET_DIVMULT) / RTC6705_SET_FDIV; //Casts required to make sure correct math (large numbers)
@ -229,13 +229,13 @@ void rtc6705SetFreq(uint16_t frequency)
void rtc6705SetRFPower(uint8_t rf_power) void rtc6705SetRFPower(uint8_t rf_power)
{ {
rf_power = constrain(rf_power, 0, RTC6705_RF_POWER_COUNT - 1); rf_power = constrain(rf_power, VTX_RTC6705_MIN_POWER, VTX_RTC6705_POWER_COUNT - 1);
spiSetDivisor(RTC6705_SPI_INSTANCE, SPI_CLOCK_SLOW); spiSetDivisor(RTC6705_SPI_INSTANCE, SPI_CLOCK_SLOW);
uint32_t val_hex = RTC6705_RW_CONTROL_BIT; // write uint32_t val_hex = RTC6705_RW_CONTROL_BIT; // write
val_hex |= RTC6705_ADDRESS; // address val_hex |= RTC6705_ADDRESS; // address
const uint32_t data = rf_power == 0 ? (PA_CONTROL_DEFAULT | PD_Q5G_MASK) & (~(PA5G_PW_MASK | PA5G_BS_MASK)) : PA_CONTROL_DEFAULT; const uint32_t data = rf_power > 1 ? PA_CONTROL_DEFAULT : (PA_CONTROL_DEFAULT | PD_Q5G_MASK) & (~(PA5G_PW_MASK | PA5G_BS_MASK));
val_hex |= data << 5; // 4 address bits and 1 rw bit. val_hex |= data << 5; // 4 address bits and 1 rw bit.
rtc6705Transfer(val_hex); rtc6705Transfer(val_hex);

View file

@ -26,14 +26,21 @@
#include <stdint.h> #include <stdint.h>
#define RTC6705_BAND_COUNT 5 #define VTX_RTC6705_BAND_COUNT 5
#define RTC6705_CHANNEL_COUNT 8 #define VTX_RTC6705_CHANNEL_COUNT 8
#define RTC6705_RF_POWER_COUNT 2 #define VTX_RTC6705_POWER_COUNT 3
#define VTX_RTC6705_DEFAULT_POWER 1
#define RTC6705_FREQ_MIN 5600 #if defined(RTC6705_POWER_PIN)
#define RTC6705_FREQ_MAX 5950 #define VTX_RTC6705_MIN_POWER 0
#else
#define VTX_RTC6705_MIN_POWER 1
#endif
#define RTC6705_BOOT_DELAY 350 // milliseconds #define VTX_RTC6705_FREQ_MIN 5600
#define VTX_RTC6705_FREQ_MAX 5950
#define VTX_RTC6705_BOOT_DELAY 350 // milliseconds
void rtc6705IOInit(void); void rtc6705IOInit(void);
void rtc6705SetBandAndChannel(uint8_t band, uint8_t channel); void rtc6705SetBandAndChannel(uint8_t band, uint8_t channel);

View file

@ -125,7 +125,7 @@ void rtc6705SetFreq(uint16_t channel_freq)
void rtc6705SetBandAndChannel(uint8_t band, uint8_t channel) void rtc6705SetBandAndChannel(uint8_t band, uint8_t channel)
{ {
const uint8_t freqIndex = (band * RTC6705_CHANNEL_COUNT) + channel; const uint8_t freqIndex = (band * VTX_RTC6705_CHANNEL_COUNT) + channel;
const uint16_t freq = vtx_freq[freqIndex]; const uint16_t freq = vtx_freq[freqIndex];
rtc6705SetFreq(freq); rtc6705SetFreq(freq);
@ -133,7 +133,7 @@ void rtc6705SetBandAndChannel(uint8_t band, uint8_t channel)
void rtc6705SetRFPower(uint8_t rf_power) void rtc6705SetRFPower(uint8_t rf_power)
{ {
rtc6705_write_register(7, (rf_power ? PA_CONTROL_DEFAULT : (PA_CONTROL_DEFAULT | PD_Q5G_MASK) & (~(PA5G_PW_MASK | PA5G_BS_MASK)))); rtc6705_write_register(7, (rf_power > 1 ? PA_CONTROL_DEFAULT : (PA_CONTROL_DEFAULT | PD_Q5G_MASK) & (~(PA5G_PW_MASK | PA5G_BS_MASK))));
} }
void rtc6705Disable(void) void rtc6705Disable(void)

View file

@ -787,9 +787,9 @@ const clivalue_t valueTable[] = {
// PG_VTX_CONFIG // PG_VTX_CONFIG
#ifdef VTX_COMMON #ifdef VTX_COMMON
{ "vtx_band", VAR_UINT8 | MASTER_VALUE, .config.minmax = { 0, VTX_SETTINGS_MAX_BAND }, PG_VTX_SETTINGS_CONFIG, offsetof(vtxSettingsConfig_t, band) }, { "vtx_band", VAR_UINT8 | MASTER_VALUE, .config.minmax = { VTX_SETTINGS_MIN_BAND, VTX_SETTINGS_MAX_BAND }, PG_VTX_SETTINGS_CONFIG, offsetof(vtxSettingsConfig_t, band) },
{ "vtx_channel", VAR_UINT8 | MASTER_VALUE, .config.minmax = { VTX_SETTINGS_MIN_CHANNEL, VTX_SETTINGS_MAX_CHANNEL }, PG_VTX_SETTINGS_CONFIG, offsetof(vtxSettingsConfig_t, channel) }, { "vtx_channel", VAR_UINT8 | MASTER_VALUE, .config.minmax = { VTX_SETTINGS_MIN_CHANNEL, VTX_SETTINGS_MAX_CHANNEL }, PG_VTX_SETTINGS_CONFIG, offsetof(vtxSettingsConfig_t, channel) },
{ "vtx_power", VAR_UINT8 | MASTER_VALUE, .config.minmax = { VTX_SETTINGS_MIN_POWER, VTX_SETTINGS_POWER_COUNT }, PG_VTX_SETTINGS_CONFIG, offsetof(vtxSettingsConfig_t, power) }, { "vtx_power", VAR_UINT8 | MASTER_VALUE, .config.minmax = { VTX_SETTINGS_MIN_POWER, VTX_SETTINGS_POWER_COUNT-1 }, PG_VTX_SETTINGS_CONFIG, offsetof(vtxSettingsConfig_t, power) },
{ "vtx_low_power_disarm", VAR_UINT8 | MASTER_VALUE | MODE_LOOKUP, .config.lookup = { TABLE_OFF_ON }, PG_VTX_SETTINGS_CONFIG, offsetof(vtxSettingsConfig_t, lowPowerDisarm) }, { "vtx_low_power_disarm", VAR_UINT8 | MASTER_VALUE | MODE_LOOKUP, .config.lookup = { TABLE_OFF_ON }, PG_VTX_SETTINGS_CONFIG, offsetof(vtxSettingsConfig_t, lowPowerDisarm) },
#ifdef VTX_SETTINGS_FREQCMD #ifdef VTX_SETTINGS_FREQCMD
{ "vtx_freq", VAR_UINT16 | MASTER_VALUE, .config.minmax = { 0, VTX_SETTINGS_MAX_FREQUENCY_MHZ }, PG_VTX_SETTINGS_CONFIG, offsetof(vtxSettingsConfig_t, freq) }, { "vtx_freq", VAR_UINT16 | MASTER_VALUE, .config.minmax = { 0, VTX_SETTINGS_MAX_FREQUENCY_MHZ }, PG_VTX_SETTINGS_CONFIG, offsetof(vtxSettingsConfig_t, freq) },

View file

@ -52,27 +52,17 @@ PG_RESET_TEMPLATE(vtxSettingsConfig_t, vtxSettingsConfig,
#define VTX_PARAM_CYCLE_TIME_US 100000 // 10Hz #define VTX_PARAM_CYCLE_TIME_US 100000 // 10Hz
typedef enum { typedef enum {
VTX_PARAM_BANDCHAN = 0, VTX_PARAM_POWER = 0,
VTX_PARAM_POWER, VTX_PARAM_BANDCHAN,
VTX_PARAM_PITMODE, VTX_PARAM_PITMODE,
VTX_PARAM_CONFIRM, VTX_PARAM_CONFIRM,
VTX_PARAM_COUNT VTX_PARAM_COUNT
} vtxScheduleParams_e; } vtxScheduleParams_e;
static uint8_t vtxParamScheduleCount;
static uint8_t vtxParamSchedule[VTX_PARAM_COUNT];
void vtxInit(void) void vtxInit(void)
{ {
uint8_t index = 0;
bool settingsUpdated = false; bool settingsUpdated = false;
vtxParamSchedule[index++] = VTX_PARAM_BANDCHAN;
vtxParamSchedule[index++] = VTX_PARAM_POWER;
vtxParamSchedule[index++] = VTX_PARAM_PITMODE;
vtxParamSchedule[index++] = VTX_PARAM_CONFIRM;
vtxParamScheduleCount = index;
// sync frequency in parameter group when band/channel are specified // sync frequency in parameter group when band/channel are specified
const uint16_t freq = vtx58_Bandchan2Freq(vtxSettingsConfig()->band, vtxSettingsConfig()->channel); const uint16_t freq = vtx58_Bandchan2Freq(vtxSettingsConfig()->band, vtxSettingsConfig()->channel);
if (vtxSettingsConfig()->band && freq != vtxSettingsConfig()->freq) { if (vtxSettingsConfig()->band && freq != vtxSettingsConfig()->freq) {
@ -209,15 +199,17 @@ static bool vtxProcessStateUpdate(void) {
void vtxProcessSchedule(timeUs_t currentTimeUs) void vtxProcessSchedule(timeUs_t currentTimeUs)
{ {
static timeUs_t lastCycleTimeUs; static timeUs_t lastCycleTimeUs;
static uint8_t scheduleIndex; static uint8_t currentSchedule = 0;
bool vtxUpdatePending = false; bool vtxUpdatePending = false;
if (vtxCommonDeviceRegistered()) { if (vtxCommonDeviceRegistered()) {
const uint8_t currentSchedule = vtxParamSchedule[scheduleIndex];
const vtxSettingsConfig_t settings = vtxGetSettings(); const vtxSettingsConfig_t settings = vtxGetSettings();
// Process VTX changes from the parameter group at 10Hz // Process VTX changes from the parameter group at 10Hz
if (currentTimeUs > lastCycleTimeUs + VTX_PARAM_CYCLE_TIME_US) { if (currentTimeUs > lastCycleTimeUs + VTX_PARAM_CYCLE_TIME_US) {
switch (currentSchedule) { switch (currentSchedule) {
case VTX_PARAM_POWER:
vtxUpdatePending = vtxProcessPower();
break;
case VTX_PARAM_BANDCHAN: case VTX_PARAM_BANDCHAN:
if (settings.band) { if (settings.band) {
vtxUpdatePending = vtxProcessBandAndChannel(); vtxUpdatePending = vtxProcessBandAndChannel();
@ -227,9 +219,6 @@ void vtxProcessSchedule(timeUs_t currentTimeUs)
#endif #endif
} }
break; break;
case VTX_PARAM_POWER:
vtxUpdatePending = vtxProcessPower();
break;
case VTX_PARAM_PITMODE: case VTX_PARAM_PITMODE:
vtxUpdatePending = vtxProcessPitMode(); vtxUpdatePending = vtxProcessPitMode();
break; break;
@ -240,7 +229,7 @@ void vtxProcessSchedule(timeUs_t currentTimeUs)
break; break;
} }
lastCycleTimeUs = currentTimeUs; lastCycleTimeUs = currentTimeUs;
scheduleIndex = (scheduleIndex + 1) % vtxParamScheduleCount; currentSchedule = (currentSchedule + 1) % VTX_PARAM_COUNT;
} }
if (!ARMING_FLAG(ARMED) || vtxUpdatePending) { if (!ARMING_FLAG(ARMED) || vtxUpdatePending) {
vtxCommonProcess(currentTimeUs); vtxCommonProcess(currentTimeUs);

View file

@ -52,8 +52,8 @@
#include "io/vtx_string.h" #include "io/vtx_string.h"
#if defined(USE_CMS) || defined(VTX_COMMON) #if defined(USE_CMS) || defined(VTX_COMMON)
const char * const rtc6705PowerNames[VTX_RTC6705_POWER_COUNT] = { const char * const rtc6705PowerNames[] = {
"---", "25 ", "200", "OFF", "MIN", "MAX"
}; };
#endif #endif
@ -79,7 +79,7 @@ bool vtxRTC6705Init(void)
void vtxRTC6705Configure(void) void vtxRTC6705Configure(void)
{ {
rtc6705SetRFPower(vtxRTC6705.powerIndex - 1); rtc6705SetRFPower(vtxRTC6705.powerIndex);
rtc6705SetBandAndChannel(vtxRTC6705.band - 1, vtxRTC6705.channel - 1); rtc6705SetBandAndChannel(vtxRTC6705.band - 1, vtxRTC6705.channel - 1);
} }
@ -100,7 +100,7 @@ static void vtxRTC6705EnableAndConfigure(void)
rtc6705Enable(); rtc6705Enable();
delay(RTC6705_BOOT_DELAY); delay(VTX_RTC6705_BOOT_DELAY);
vtxRTC6705Configure(); vtxRTC6705Configure();
} }
@ -131,10 +131,10 @@ void vtxRTC6705SetBandAndChannel(uint8_t band, uint8_t channel)
if (band && channel) { if (band && channel) {
if (vtxRTC6705.powerIndex > 0) { if (vtxRTC6705.powerIndex > 0) {
rtc6705SetBandAndChannel(band - 1, channel - 1); rtc6705SetBandAndChannel(band - 1, channel - 1);
}
vtxRTC6705.band = band; vtxRTC6705.band = band;
vtxRTC6705.channel = channel; vtxRTC6705.channel = channel;
}
} }
} }

View file

@ -22,17 +22,7 @@
#include "platform.h" #include "platform.h"
extern const char * const rtc6705PowerNames[];
#define VTX_RTC6705_POWER_COUNT 3
#define VTX_RTC6705_DEFAULT_POWER 1
#if defined(RTC6705_POWER_PIN)
#define VTX_RTC6705_MIN_POWER 0
#else
#define VTX_RTC6705_MIN_POWER 1
#endif
extern const char * const rtc6705PowerNames[VTX_RTC6705_POWER_COUNT];
void vtxRTC6705Configure(void); void vtxRTC6705Configure(void);
bool vtxRTC6705CanUpdate(void); bool vtxRTC6705CanUpdate(void);