Activity
кстати скорее всего воспользуюсь вашим кодом, решение оч даже понравилось
Будет интересно 😃 Просьба отписаться потом, а то я все еще никак не взлечу, из-за проблемы с акселерометром.
А про нелинейность я имел в виду другое.
Этим кодом восстанавливается линейная зависимость между углов наклона стика и значением полученным multiwii.
Хотя тут еще важна линейность резистора в аппе.
да… еще один минус данного способа - 8 операций умножения/деления в прерывании - не очень хорошо (но имеет право на жизнь в вие - не так критично)
Так я же говорю - код плохой - он сделан макросом, и разворачивается 4 раза.
А по поводу деления и умножения, то во первых там целые 32-значные во-вторых компилятор должен выражение с константами упростить., либо можно принудительно упростить через переопределение промежуточных констант.
ваше решение на мой счет оч даже оригинальное и имеющее право на жизнь для владельцев дешевых апп, единственно появляется небольшая нелинейность относительно центра.
Спасибо за ответ… (Если полечу, то попробую на своем коде)
Только мой как раз убирает нелинейность, так как нормализация идет не по всему диапазону а по двум половинам.
Центр всегда в центре края всегда на краю диапазона 1000-2000. И настраивается в разы проще.
А MINTHROTTLE и MAXTHROTTLE я баловался - ничего хорошего не получилось 😦
Добрый день!
Собственно, собираю потихоньку MultiWii…
Еще не летаю, борюсь со свякими проблемами.
Одна из них это HK-T6A V2
Даже при увеличении расходов не могу покрыть весь диапазон
регулировок. Постоянно приходится крутить тримы.
И к тому же центр не в центре диапазона.
Примерно так.
#define RX_THROTTLE_MIN 1155
#define RX_THROTTLE_CENTER 1575
#define RX_THROTTLE_MAX 1992
1155 1575 1992
±-------------±--------+
Min Centr Max
Короче, мне это надоело и я сделал изменения в коде rx.ino для V2.1
Код написан по-быстрому для проверки.
Мне он не нравиться, но сейчас это неважно…
/**************************************************************************************/
/*************** Standard RX Pins reading ********************/
/**************************************************************************************/
#if defined(STANDARD_RX)
// predefined PC pin block (thanks to lianj)
#define RX_PIN_CHECK(pin_pos, rc_value_pos) \
if (mask & PCInt_RX_Pins[pin_pos]) { \
if (!(pin & PCInt_RX_Pins[pin_pos])) { \
dTime = cTime-edgeTime[pin_pos]; \
if (900<dTime && dTime<2200) { \
if(RX_NORMALISE){ \
int32_t ss = dTime; \
if(rc_value_pos == THROTTLEPIN){ \
if(dTime > RX_THROTTLE_CENTER) ss = (ss - RX_THROTTLE_CENTER) * 500 / (RX_THROTTLE_MAX - RX_THROTTLE_CENTER) + 1500; \
else ss = (ss - RX_THROTTLE_MIN) * 500 / (RX_THROTTLE_CENTER - RX_THROTTLE_MIN) + 1000; \
rcValue[THROTTLEPIN] = uint16_t(ss); \
} \
else if(rc_value_pos == YAWPIN){ \
if(dTime > RX_YAW_CENTER) ss = (ss - RX_YAW_CENTER) * 500 / (RX_YAW_MAX - RX_YAW_CENTER) + 1500; \
else ss = (ss - RX_YAW_MIN) * 500 / (RX_YAW_CENTER - RX_YAW_MIN) + 1000; \
rcValue[YAWPIN] = uint16_t(ss); \
debug[2] = dTime; \
debug[3] = rcValue[YAWPIN]; \
} \
else if(rc_value_pos == ROLLPIN){ \
if(dTime > RX_ROLL_CENTER) ss = (ss - RX_ROLL_CENTER) * 500 / (RX_ROLL_MAX - RX_ROLL_CENTER) + 1500; \
else ss = (ss - RX_ROLL_MIN) * 500 / (RX_ROLL_CENTER - RX_ROLL_MIN) + 1000; \
rcValue[ROLLPIN] = uint16_t(ss); \
} \
else if(rc_value_pos == PITCHPIN){ \
if(dTime > RX_PITCH_CENTER) ss = (ss - RX_PITCH_CENTER) * 500 / (RX_PITCH_MAX - RX_PITCH_CENTER) + 1500; \
else ss = (ss - RX_PITCH_MIN) * 500 / (RX_PITCH_CENTER - RX_PITCH_MIN) + 1000; \
rcValue[PITCHPIN] = uint16_t(ss); \
} \
else rcValue[rc_value_pos] = dTime; \
} \
else rcValue[rc_value_pos] = dTime; \
} \
} else edgeTime[pin_pos] = cTime; \
}
// port change Interrupt
и добавил в config.ino констранты
/*************************************************************************************************/
/***************** ***************/
/**************** SECTION 0 - RX normalisation *******/
/***************** ***************/
/*************************************************************************************************/
#define RX_NORMALISE 1
#define RX_THROTTLE_MIN 1155
#define RX_THROTTLE_CENTER 1575
#define RX_THROTTLE_MAX 1992
#define RX_PITCH_MIN 1145
#define RX_PITCH_CENTER 1587
#define RX_PITCH_MAX 2000
#define RX_ROLL_MIN 1084
#define RX_ROLL_CENTER 1556
#define RX_ROLL_MAX 2034
#define RX_YAW_MIN 1087
#define RX_YAW_CENTER 1583
#define RX_YAW_MAX 2034
#define RX_AUX1_MIN 1000
#define RX_AUX1_CENTER 1600
#define RX_AUX1_MAX 2000
#define RX_AUX2_MIN 1000
#define RX_AUX2_CENTER 1600
#define RX_AUX2_MAX 2000
При RX_NORMALISE = 0 код работает как и раньше
При RX_NORMALISE = 1 включается нормализация
Выключаю нормализицию.
Выставляю тримы по центру (хотя можно в любых положениях сделать нормализацию),
записываю крайние и центральное значения всех каналов.
Записываю константы в config.ino.
Включаю нормализацию.
Теперь у меня диапазон регилировок в MultiWii Config от 1000 до 2000.
Центр в 1500.
Значения, конечно, плавают ±3-5 единиц но я думаю это непринципиально.
В моей реализации мне нравиться то, что я могу без настройки расходов настроить
правильную регулировку для MultiWii.
Скажите, я вообще не велосипед случаем изобрел?