MPU6050
|
|
доцент2 |
Дата: Пн, 24.04.2017, 21:11 | Сообщение # 1 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
292
Замечания:
±
На сайте с 13.09.2011
Статус:
Offline
|
Запустил MPU6050 с pic18f252. Получаю показания гироскопа, акселерометра и температуры. Пока все без обработки результатов. В этом как раз и проблема!!! Датчик неподвижен, а показания скачут "шумят". В инете полно ссылок (для ардуино) на фильтр Залмана и т.д., но как реально им воспользоваться мне не совсем понятно. Нужна помощь!
|
|
|
|
anatol |
Дата: Вт, 25.04.2017, 00:13 | Сообщение # 2 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
471
Замечания:
±
На сайте с 10.02.2010
Статус:
Offline
|
Цитата доцент2 ( ) Залмана Не залмана а калмана... https://ru.wikipedia.org/wiki....D%D0%B0 ликбез https://habrahabr.ru/post/166693/ Может проще https://ru.wikipedia.org/wiki....D%D0%BE Цитата Y0:=(K*X0+(Tf/SAMPLE_T*Y1))/((Tf/SAMPLE_T)+1); Y1:=Y0; где Tf - постоянная времени фильтра, SAMPLE_T - время квантования (период измерения). должен быть в одной размерности Tf. К-коэффициент звена. для фильтра =1. X0 - входное значение. Y0 - Выходное значение. Y1- Выходное значение в предыдущий период квантования.
|
|
|
|
доцент2 |
Дата: Вт, 25.04.2017, 16:36 | Сообщение # 3 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
292
Замечания:
±
На сайте с 13.09.2011
Статус:
Offline
|
Цитата anatol ( ) Не залмана а калмана... Извиняюсь, психанул. В инете полно теории с кучей производных, систем и т.д.в общем для серьезных математиков. В примерах к ардуино идут одни ссылки на подключение библиотек, а что в них остается догадываться.
Цитата anatol ( ) Y0:=(K*X0+(Tf/SAMPLE_T*Y1))/((Tf/SAMPLE_T)+1); Y1:=Y0; данный пример доходчив и понятен. Но есть вопросы (возможно и глупые):
Цитата anatol ( ) Tf - постоянная времени фильтра,SAMPLE_T - время квантования (период измерения). должен быть в одной размерности Tf. Какие значения имеют данные составляющие (где их взять)? В настройках 6050 вроде не нашел. Подойдет ли такая формула для стабилизации показаний hmc5883l?Добавлено (25.04.2017, 16:36) --------------------------------------------- Anatol у Вас есть наработки по данном датчику?
|
|
|
|
dimvad |
Дата: Вт, 25.04.2017, 17:34 | Сообщение # 4 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
80
Замечания:
±
На сайте с 20.07.2012
Статус:
Offline
|
Вот в этой ветке фильтр Калмана обсуждался. Там и рабочий код на Протоне есть.
|
|
|
|
anatol |
Дата: Вт, 25.04.2017, 19:12 | Сообщение # 5 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
471
Замечания:
±
На сайте с 10.02.2010
Статус:
Offline
|
Цитата доцент2 ( ) у Вас есть наработки по данном датчику? Наработок не имею, так как небыло необходимости.
|
|
|
|
доцент2 |
Дата: Вт, 25.04.2017, 22:38 | Сообщение # 6 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
292
Замечания:
±
На сайте с 13.09.2011
Статус:
Offline
|
Цитата dimvad ( ) Вот в этой ветке фильтр Калмана обсуждался. Там и рабочий код на Протоне есть. Мне не совсем понятно, что там фильтруется. На входе и выходе сигнал одинаковый. Отличие только на цепочке RC, но это и без программы понятно. Например с датчика (не важно какого) должно приходить постоянное значение, а по факту оно постоянно меняется 100, 120, 98, 105 и т.д. Вот как программно это отфильтровать мне не совсем понятно.
|
|
|
|
dimvad |
Дата: Вт, 25.04.2017, 23:22 | Сообщение # 7 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
80
Замечания:
±
На сайте с 20.07.2012
Статус:
Offline
|
Цитата Мне не совсем понятно, что там фильтруется. На входе и выходе сигнал одинаковый. Как раз и не одинаковый. На вход подается меандр (синий канал), на выходе сигнал пропущенный через фильтр Калмана (желтый), и сигнал пропущенный через аналоговый RC-фильтр(красный), ну для сравнения. Видно, что оба выходных сигнала совпадают, т. е. фильтр Калмана является цифровым аналогом интегрирующего RC-фильтра. Если через эту систему пропустить постоянный зашумленный сигнал, то на выходе получим усредненный постоянный сигнал. Шумов будет тем меньше, чем больше постоянная времени фильтра, но и быстродействие системы снизится.
|
|
|
|
доцент2 |
Дата: Ср, 26.04.2017, 08:55 | Сообщение # 8 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
292
Замечания:
±
На сайте с 13.09.2011
Статус:
Offline
|
Теперь боле менее понятно. Но к сожалению такой пример мне подходит. Стабильность показаний получше, но при расчете углов выскакивают "ненужные " минусы. Кроме того при нечастом опросе датчика проявляется инертность. Т.е. контроллер должен фактически заниматься только этим датчиком. Чем чаще опрос, тем лучше показания. Странно, что производитель этих датчиков не включил блок по обработке результатов в сам датчик. Может я и не прав?
|
|
|
|
dimvad |
Дата: Ср, 26.04.2017, 10:43 | Сообщение # 9 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
80
Замечания:
±
На сайте с 20.07.2012
Статус:
Offline
|
Цитата Стабильность показаний получше, но при расчете углов выскакивают "ненужные " минусы. Возможно переменная BUF у Вас переполняется, сделайте ее DWord и наверняка все заработает. Чтобы снизить инертность и добиться одновременно хорошего сглаживания, напишите фильтр 2-го порядка, ну два одинаковых подряд. Мне таким способом удавалось достичь желаемого.
|
|
|
|
доцент2 |
Дата: Ср, 26.04.2017, 15:55 | Сообщение # 10 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
292
Замечания:
±
На сайте с 13.09.2011
Статус:
Offline
|
Пока особо не разобрался, поэтому возможно не правильно составил фильтр или принял некоторые значения: Dim READ_Alfa As Float 'угол на входе фильтра Dim Alfa_BUF As Float ' Dim READ_Alfa_Out As Float 'угол на выходе фильтра Dim K As Float ' Dim t_step As Byte 'период дискредитации Dim Tf As Byte 'постоянная времени фильтра
t_step = 1 'период дискредитации Tf = 10 'постоянная времени фильтра K = (Tf + 1)/t_step
Alfa_BUF = Alfa_BUF + READ_Alfa - READ_Alfa_Out READ_Alfa_Out = Alfa_BUF/K
If Katet2>=0 And Katet1>=0 Then READ_Alfa_Out=READ_Alfa_Out 'первая четверть If Katet2<0 And Katet1>=0 Then READ_Alfa_Out=180+READ_Alfa_Out 'вторая четверть If Katet2<0 And Katet1<0 Then READ_Alfa_Out=180+READ_Alfa_Out 'третья четверть If Katet2>0 And Katet1<0 Then READ_Alfa_Out=360+READ_Alfa_Out 'четвертая четверть Значения периода дискредитации и постоянной времени фильтра тупо взял из примера.
|
|
|
|
dimvad |
Дата: Ср, 26.04.2017, 18:13 | Сообщение # 11 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
80
Замечания:
±
На сайте с 20.07.2012
Статус:
Offline
|
Ну, вроде все правильно написано. В даташите на MPU650 написано, что там есть цифровой фильтр.
|
|
|
|
доцент2 |
Дата: Ср, 26.04.2017, 20:34 | Сообщение # 12 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
292
Замечания:
±
На сайте с 13.09.2011
Статус:
Offline
|
Цитата dimvad ( ) В даташите на MPU650 написано, что там есть цифровой фильтр. Вопрос как его использовать?
|
|
|
|
dimvad |
Дата: Ср, 26.04.2017, 21:03 | Сообщение # 13 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
80
Замечания:
±
На сайте с 20.07.2012
Статус:
Offline
|
Ну попробовать в DLPF_CFG чего-нибудь записать.
|
|
|
|
доцент2 |
Дата: Пн, 01.05.2017, 20:29 | Сообщение # 14 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
292
Замечания:
±
На сайте с 13.09.2011
Статус:
Offline
|
Цитата dimvad ( ) Ну попробовать в DLPF_CFG чего-нибудь записать. Пробовал, визуально ничего не поменялось. Может кто-то работал с этим датчиком?
Добавлено (01.05.2017, 16:19) --------------------------------------------- Фильтр заработал. Проверил его на hmc5883l, теперь надо попробовать с mpu6050.
Добавлено (01.05.2017, 20:29) --------------------------------------------- Подскажите, как правильно рассчитать углы наклона используя данные гироскопа и акселерометра. В инете материала полно, но вся инфа какая то не полная и в основном на Си. Попался вот такой вариант, но есть вопросы: ;/// масштабирование quanternion /////// Это данные с гироскопа? qw = w / 16384 W и 16384 это что? qx = x / 16384 qy = y / 16384 qz = Z / 16384
;/////// Gravity Vactor ////////// gx = 2 * ((qx * qz) - (qw * qy)); gy = 2 * ((qw * qx) + (qy * qz)); gz = (qw * qw )- (qx * qx) - (qy * qy) + (qz * qz); ;/////// YPR /////////////// 'yaw = atan2 ((2*qx*qy - 2*qw*qz),( 2*qw*qw + 2*qx*qx - 1)) * 180 / M_PI; отклонение от курса 'pitch = atan (gx / sqr(gy*gy + gz*gz)) ;* 180 / M_PI; тангаж 'roll = atan (gy / sqr(gx*gx + gz*gz)) ;* 180 / M_PI; крен
Pitch = Sqr(gy *gy + gz * gz) 'тангаж Pitch = gx / Pitch Pitch = ATan (Pitch) Pitch = Pitch * (180 / M_PI)
Roll = Sqr(gx * gx + gz * gz) 'крен Roll = gy /Roll Roll = ATan (Roll) Roll = Roll * (180 / M_PI)
Сообщение отредактировал
доцент2 - Пн, 01.05.2017, 20:40
|
|
|
|
dimvad |
Дата: Вт, 02.05.2017, 20:13 | Сообщение # 15 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
80
Замечания:
±
На сайте с 20.07.2012
Статус:
Offline
|
Цитата Фильтр заработал. Проверил его на hmc5883l, теперь надо попробовать с mpu6050. А у Вас какой фильтр заработал, программный или тот что на борту микросхемы ?
|
|
|
|