Создание собственной системы стабилизации

oleg70

Вот “матбаза”: Temperature sensor output change vs.temperature -1 °C/digit
Temperature data (1LSB/deg - 8-bit resolution). The value is expressed as two’s complement.
Пишу в коде: int8_t temper=(int8_t)data[…];
Где ошибка?

SergDoc

смотри как в mpu3050 сделано

static void mpu3050ReadTemp(int16_t *tempData)
{
    uint8_t buf[2];
    i2cRead(MPU3050_ADDRESS, MPU3050_TEMP_OUT, 2, buf);


    *tempData = 35 + ((int32_t)(buf[0] << 8 | buf[1]) + 13200) / 280;
}
oleg70
SergDoc:

char

не помогло… (то же самое)

SergDoc

буду дома покопаюсь может найду чего…

SergDoc

вот что есть по l3g20:

STemp := Read_1B(OUT_TEMP)
  ESTemp := 25 - STemp
  ESTemp := ESTemp + 25 - 4           'Deg C the -4 is my correction yours may be different
  ESTemp := ESTemp * 9 / 5 +32     'Deg F
VitaliyRU
oleg70:

Не мог не поделиться…: Решил сделать компенсацию дрейфа “0” гиры от встроенного датчика температуры.

Меня не покидает ощущение, что гирик лучше всего калибровать по акселю… Причем наверно с тем же периодом адаптации, что и правим интерированный гирик акселем. - что бы врали в ногу, а не в разнобой.

oleg70
SergDoc:

вот что есть

Какой простой выход из положения (спасибо). Вопрос только: о чем думали разработчики чипа вынуждая делать математические “приемы”…

VitaliyRU:

лучше всего калибровать по акселю

по аккселю он калибруется на “выходе” ИМУ и устраняет ошибку угла отклонения, а вот смещение нулевой точки желательно устранять до подачи в ИМУ (даже более важно чем устранение шума)…

VitaliyRU
oleg70:

по аккселю он калибруется на “выходе” ИМУ и устраняет ошибку угла отклонения, а вот смещение нулевой точки желательно устранять до подачи в ИМУ (даже более важно чем устранение шума)…

Я свежее вия 1.9 ничего не курил(но раз речь идет про угол, значит мы все же о разном), может что-то и сделано.
Я именно про ВХод а не ВЫход. Берем два соседних угла от акселя(arctg(z/x) вся фигня), делим на время - получаем угловую скорость от дачика акселерометр - АДОВО щумящую, но это пофиг. Через AB фильтр накапливаем поправку на гирик, гирик всегда читаем с этой поправкой. т.е. Если арктангенс двух соседних ускорений 500 итераций пляшет +3*/-3* поправка=0, если пляшет +3*/-2* значит по акселю мы получаем 1*/сек - пишем это в поправку гирика. врятли понятно, но просто решаем обратную задачу. Правим акселем гирик.

Другими словами, ща все сделано в размерности угол(это выход). Я предлагаю в размерность вход(это скорость). Тогда аксель перестанет догонять гирик(от чего адово унитазит) а жить они будут синхронно.
Или мерим угловую скорость акселем и дружим их на уровне скорости.
сори за сумбурность.

oleg70
SergDoc:

ESTemp := ESTemp + 25 - 4

Немного допилил и получился хорошо рабочий алгоритм (держит “0”):
float kt;
kt=(float)g_temper*0.04f;
GX=(GYR[3]<<8|GYR[2])+10-ceil(kt);
GY=(GYR[5]<<8|GYR[4])+10-ceil(kt);
GZ=(GYR[7]<<8|GYR[6])+10-ceil(kt);

VitaliyRU:

Правим акселем гирик

Все правильно, неважно каким методом (я например freeimu мучаю), аксель подгоняет под свою статику показания гиры, но как правило коэф. воздействия на выходной угол с ИМУ у гиры больше (в динамике) и наличие смещения нуля означает постоянную “паразитную” угловую скорость, которую аксель будет “упираться” убрать,
согласитесь, что лучше от нее избавиться заранее… (хотябы минимизировать)

VitaliyRU
oleg70:

Все правильно, неважно каким методом (я например freeimu мучаю), аксель подгоняет под свою статику показания гиры, но как правило коэф. воздействия на выходной угол с ИМУ у гиры больше (в динамике) и наличие смещения нуля означает постоянную “паразитную” угловую скорость, которую аксель будет “упираться” убрать,
согласитесь, что лучше от нее избавиться заранее… (хотябы минимизировать)

конечно соглашусь, вообще это тема для отдельных исследований

oleg70:

Все правильно, неважно каким методом (я например freeimu мучаю), аксель подгоняет под свою статику показания гиры, но как правило коэф. воздействия на выходной угол с ИМУ у гиры больше (в динамике) и наличие смещения нуля означает постоянную “паразитную” угловую скорость, которую аксель будет “упираться” убрать,

О чем я выше и писал - отстал от жизни 😦 Как то это уже реализованно.

SergDoc

интересно только, на сколько линейна зависимость, ну и так к слову, аксель от температуры (повышающейся) тоже “плывёт” на MPU как-то не заметил, а вот на LSM довольно сильно…

VitaliyRU
SergDoc:

интересно только, на сколько линейна зависимость, ну и так к слову, аксель от температуры (повышающейся) тоже “плывёт”

А пофиг, пылвет же “угол”, скорость плывет безобразно медленно.(врнье гирика при приведении, это скорость дерйфа акселя. Ну градус в час или около того)

oleg70

Провел кучу разных экспериментов и хочу поделиться мнением:
1.выполнять цикл по прерываниям гиры не целесообразно, и вообще всякие навороты с DMA, усреднением показаний (делал аж по 32м точкам), ощутимого результата не дают…(только усложнение алгоритма). Минимум что нужно сделать для гиры, это компенсацию “0” по температуре.
2.Смещение показаний акселя LSM от температуры почти не наблюдается (при шкале 4G), значит коррекция нафиг не нужна…
3.А вот магнитометр желательно калибровать на линейность +/- по осям (сделал программную калибровку при старте, правда придется каждый раз крутить аппарат вокруг всех осей - немного неудобно).

Это чисто мое мнение, критика приветствуется…

SergDoc

ну тут не совсем, если цикл сам по себе, то либо мы лишний раз читаем одинаковые данные, либо можем пропустить что-нибудь интересное?

oleg70
SergDoc:

если цикл сам по себе

Я хотел сказать, что прерывания на запуск цикла видимо лучше брать с самого медленного датчика: акселя или мага (в зависимости от модели), тогда есть гарантия того что у гиры данные уже доступны, и отпадает еще необходимость проверять их готовнось, к тому же, даже при вычислительной “мощи” stm, при частоте прерывания 760 Гц (как у L3gd20) мало чего успеешь посчитать… (какой тогда смысл “частить”).

SergDoc

если у меня внутренний фильтр гиры включен на 42Гц, то по идее и готовить данные она будет с такой же частотой, а не с частотой опроса самих датчиков? смысл мне её тогда читать 100 раз например… проблема тогда в другом если я сброшу фильтр, с 42 на 20Гц то и цикл замедлится что приведёт к непонять чему с ПИД ?

oleg70
SergDoc:

приведёт к непонять чему с ПИД

Да, при экспериментах, видимо нужно что то сделать константой, например запускать цикл от прерываний таймера (тогда ПИД у нас не пострадает + фиксированная Dt для гиро), а уж фильтры на сенсорах крутить как угодно, хотя все больше и больше убеждаюсь что “крутить” на этих бюджетных сенсорах особо нечего…
Если уж задаться целью сделать что то отличное от ширпотреба, надо смотреть в сторону другого железа… (например “аналог”).

SergDoc

ну от MPU я пока только балдею 😃
аналоговые датчики - это в первую очередь внешнее АЦП - минимум 24бит желательно ещё и настраиваемое, а потом танцы с бубном вокруг холодильника как в автокваде 😃 да и для одной единицы ой как не бюджетно…