Создание собственной системы стабилизации
Вот “матбаза”: 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[…];
Где ошибка?
смотри как в 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;
}
char
не помогло… (то же самое)
как датчик обзывается?
L3GD20 (от дискавери F3)
буду дома покопаюсь может найду чего…
вот что есть по 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
Не мог не поделиться…: Решил сделать компенсацию дрейфа “0” гиры от встроенного датчика температуры.
Меня не покидает ощущение, что гирик лучше всего калибровать по акселю… Причем наверно с тем же периодом адаптации, что и правим интерированный гирик акселем. - что бы врали в ногу, а не в разнобой.
вот что есть
Какой простой выход из положения (спасибо). Вопрос только: о чем думали разработчики чипа вынуждая делать математические “приемы”…
лучше всего калибровать по акселю
по аккселю он калибруется на “выходе” ИМУ и устраняет ошибку угла отклонения, а вот смещение нулевой точки желательно устранять до подачи в ИМУ (даже более важно чем устранение шума)…
по аккселю он калибруется на “выходе” ИМУ и устраняет ошибку угла отклонения, а вот смещение нулевой точки желательно устранять до подачи в ИМУ (даже более важно чем устранение шума)…
Я свежее вия 1.9 ничего не курил(но раз речь идет про угол, значит мы все же о разном), может что-то и сделано.
Я именно про ВХод а не ВЫход. Берем два соседних угла от акселя(arctg(z/x) вся фигня), делим на время - получаем угловую скорость от дачика акселерометр - АДОВО щумящую, но это пофиг. Через AB фильтр накапливаем поправку на гирик, гирик всегда читаем с этой поправкой. т.е. Если арктангенс двух соседних ускорений 500 итераций пляшет +3*/-3* поправка=0, если пляшет +3*/-2* значит по акселю мы получаем 1*/сек - пишем это в поправку гирика. врятли понятно, но просто решаем обратную задачу. Правим акселем гирик.
Другими словами, ща все сделано в размерности угол(это выход). Я предлагаю в размерность вход(это скорость). Тогда аксель перестанет догонять гирик(от чего адово унитазит) а жить они будут синхронно.
Или мерим угловую скорость акселем и дружим их на уровне скорости.
сори за сумбурность.
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);
Правим акселем гирик
Все правильно, неважно каким методом (я например freeimu мучаю), аксель подгоняет под свою статику показания гиры, но как правило коэф. воздействия на выходной угол с ИМУ у гиры больше (в динамике) и наличие смещения нуля означает постоянную “паразитную” угловую скорость, которую аксель будет “упираться” убрать,
согласитесь, что лучше от нее избавиться заранее… (хотябы минимизировать)
Все правильно, неважно каким методом (я например freeimu мучаю), аксель подгоняет под свою статику показания гиры, но как правило коэф. воздействия на выходной угол с ИМУ у гиры больше (в динамике) и наличие смещения нуля означает постоянную “паразитную” угловую скорость, которую аксель будет “упираться” убрать,
согласитесь, что лучше от нее избавиться заранее… (хотябы минимизировать)
конечно соглашусь, вообще это тема для отдельных исследований
Все правильно, неважно каким методом (я например freeimu мучаю), аксель подгоняет под свою статику показания гиры, но как правило коэф. воздействия на выходной угол с ИМУ у гиры больше (в динамике) и наличие смещения нуля означает постоянную “паразитную” угловую скорость, которую аксель будет “упираться” убрать,
О чем я выше и писал - отстал от жизни 😦 Как то это уже реализованно.
интересно только, на сколько линейна зависимость, ну и так к слову, аксель от температуры (повышающейся) тоже “плывёт” на MPU как-то не заметил, а вот на LSM довольно сильно…
интересно только, на сколько линейна зависимость, ну и так к слову, аксель от температуры (повышающейся) тоже “плывёт”
А пофиг, пылвет же “угол”, скорость плывет безобразно медленно.(врнье гирика при приведении, это скорость дерйфа акселя. Ну градус в час или около того)
Провел кучу разных экспериментов и хочу поделиться мнением:
1.выполнять цикл по прерываниям гиры не целесообразно, и вообще всякие навороты с DMA, усреднением показаний (делал аж по 32м точкам), ощутимого результата не дают…(только усложнение алгоритма). Минимум что нужно сделать для гиры, это компенсацию “0” по температуре.
2.Смещение показаний акселя LSM от температуры почти не наблюдается (при шкале 4G), значит коррекция нафиг не нужна…
3.А вот магнитометр желательно калибровать на линейность +/- по осям (сделал программную калибровку при старте, правда придется каждый раз крутить аппарат вокруг всех осей - немного неудобно).
Это чисто мое мнение, критика приветствуется…
ну тут не совсем, если цикл сам по себе, то либо мы лишний раз читаем одинаковые данные, либо можем пропустить что-нибудь интересное?
если цикл сам по себе
Я хотел сказать, что прерывания на запуск цикла видимо лучше брать с самого медленного датчика: акселя или мага (в зависимости от модели), тогда есть гарантия того что у гиры данные уже доступны, и отпадает еще необходимость проверять их готовнось, к тому же, даже при вычислительной “мощи” stm, при частоте прерывания 760 Гц (как у L3gd20) мало чего успеешь посчитать… (какой тогда смысл “частить”).
если у меня внутренний фильтр гиры включен на 42Гц, то по идее и готовить данные она будет с такой же частотой, а не с частотой опроса самих датчиков? смысл мне её тогда читать 100 раз например… проблема тогда в другом если я сброшу фильтр, с 42 на 20Гц то и цикл замедлится что приведёт к непонять чему с ПИД ?
приведёт к непонять чему с ПИД
Да, при экспериментах, видимо нужно что то сделать константой, например запускать цикл от прерываний таймера (тогда ПИД у нас не пострадает + фиксированная Dt для гиро), а уж фильтры на сенсорах крутить как угодно, хотя все больше и больше убеждаюсь что “крутить” на этих бюджетных сенсорах особо нечего…
Если уж задаться целью сделать что то отличное от ширпотреба, надо смотреть в сторону другого железа… (например “аналог”).
ну от MPU я пока только балдею 😃
аналоговые датчики - это в первую очередь внешнее АЦП - минимум 24бит желательно ещё и настраиваемое, а потом танцы с бубном вокруг холодильника как в автокваде 😃 да и для одной единицы ой как не бюджетно…
это в первую очередь внешнее АЦП
А меня радовали гиры от murata, по моему они хорошо служат и по сей день, только вот большие и много их надо 😃, и 24 бита не нужно для гиры, а уж аксель MMA7455 (по 80 р) у меня работал с шкалой +/- 64 единицы!, …
Тут на четко расставить акценты: “чего мы хотим” простоты, качества, дешевизны…
Мне вот хочется добиться максимальной простоты изготовления самой платы, минимума деталей, с адекватными характеристиками, поэтому щас подумываю о LSM333…