Регистрация | Вход

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Модератор форума: demanik, ivan_fd  
Форум Picbasic.ru » Программирование МК » Proton PicBasic » MPU6050 ("шумит")
MPU6050
доцент2 Дата: Пн, 24.04.2017, 21:11  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 287
Репутация: 10   ±
Замечания:   ±
На сайте с 13.09.2011

Статус: Offline

Запустил MPU6050 с pic18f252.
Получаю показания гироскопа, акселерометра и температуры.
Пока все без обработки результатов.
В этом как раз и проблема!!! Датчик неподвижен, а показания скачут "шумят".
В инете полно ссылок (для ардуино) на фильтр Залмана и т.д., но как реально им воспользоваться мне не совсем понятно.
Нужна помощь!
ЯНДЕКС Дата: 24.04.2017
anatol Дата: Вт, 25.04.2017, 00:13  |                                                                                                                Сообщение # 2
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 472
Репутация: 32   ±
Замечания:   ±
На сайте с 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
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 287
Репутация: 10   ±
Замечания:   ±
На сайте с 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
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 79
Репутация: 54   ±
Замечания:   ±
На сайте с 20.07.2012

Статус: Offline

Вот в этой ветке фильтр Калмана обсуждался. Там и рабочий код на Протоне есть.
anatol Дата: Вт, 25.04.2017, 19:12  |                                                                                                                Сообщение # 5
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 472
Репутация: 32   ±
Замечания:   ±
На сайте с 10.02.2010

Статус: Offline

Цитата доцент2 ()
у Вас есть наработки по данном датчику?
Наработок не имею, так как небыло необходимости.
доцент2 Дата: Вт, 25.04.2017, 22:38  |                                                                                                                Сообщение # 6
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 287
Репутация: 10   ±
Замечания:   ±
На сайте с 13.09.2011

Статус: Offline

Цитата dimvad ()
Вот в этой ветке фильтр Калмана обсуждался. Там и рабочий код на Протоне есть.
Мне не совсем понятно, что там фильтруется. На входе и выходе сигнал одинаковый. Отличие только на цепочке RC, но это и без программы понятно.
Например с датчика (не важно какого) должно приходить постоянное значение, а по факту оно постоянно меняется 100, 120, 98, 105 и т.д.
Вот как программно это отфильтровать мне не совсем понятно.
dimvad Дата: Вт, 25.04.2017, 23:22  |                                                                                                                Сообщение # 7
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 79
Репутация: 54   ±
Замечания:   ±
На сайте с 20.07.2012

Статус: Offline

Цитата
Мне не совсем понятно, что там фильтруется. На входе и выходе сигнал одинаковый.
Как раз и не одинаковый. На вход подается меандр (синий канал), на выходе сигнал пропущенный  через фильтр Калмана (желтый), и сигнал пропущенный через аналоговый RC-фильтр(красный), ну для сравнения. Видно, что оба выходных сигнала совпадают, т. е. фильтр Калмана является цифровым аналогом интегрирующего RC-фильтра. Если через эту систему пропустить постоянный зашумленный сигнал, то на выходе получим усредненный постоянный сигнал. Шумов будет тем меньше, чем больше постоянная времени фильтра, но и быстродействие системы снизится.
доцент2 Дата: Ср, 26.04.2017, 08:55  |                                                                                                                Сообщение # 8
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 287
Репутация: 10   ±
Замечания:   ±
На сайте с 13.09.2011

Статус: Offline

Теперь боле менее понятно.
Но к сожалению такой пример мне подходит.
Стабильность показаний получше, но при расчете углов выскакивают "ненужные " минусы.
Кроме того при нечастом опросе датчика проявляется инертность. Т.е. контроллер должен фактически заниматься только этим датчиком. Чем чаще опрос, тем лучше показания.
Странно, что производитель этих датчиков не включил блок по обработке результатов в сам датчик.
Может я и не прав?
dimvad Дата: Ср, 26.04.2017, 10:43  |                                                                                                                Сообщение # 9
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 79
Репутация: 54   ±
Замечания:   ±
На сайте с 20.07.2012

Статус: Offline


Цитата
Стабильность показаний получше, но при расчете углов выскакивают "ненужные " минусы.
 Возможно переменная BUF у Вас переполняется, сделайте ее DWord и наверняка все заработает.
Чтобы снизить инертность и добиться одновременно хорошего сглаживания, напишите фильтр 2-го порядка, ну два одинаковых подряд. Мне таким способом удавалось достичь желаемого.
доцент2 Дата: Ср, 26.04.2017, 15:55  |                                                                                                                Сообщение # 10
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 287
Репутация: 10   ±
Замечания:   ±
На сайте с 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
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 79
Репутация: 54   ±
Замечания:   ±
На сайте с 20.07.2012

Статус: Offline

Ну, вроде все правильно написано. В даташите на MPU650 написано, что там есть цифровой фильтр.
Прикрепления: 7796531.gif (27.1 Kb)
ЯНДЕКС Дата: 26.04.2017
доцент2 Дата: Ср, 26.04.2017, 20:34  |                                                                                                                Сообщение # 12
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 287
Репутация: 10   ±
Замечания:   ±
На сайте с 13.09.2011

Статус: Offline

Цитата dimvad ()
В даташите на MPU650 написано, что там есть цифровой фильтр.
Вопрос как его использовать?
dimvad Дата: Ср, 26.04.2017, 21:03  |                                                                                                                Сообщение # 13
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 79
Репутация: 54   ±
Замечания:   ±
На сайте с 20.07.2012

Статус: Offline

Ну попробовать в DLPF_CFG  чего-нибудь записать.
Прикрепления: 8536830.gif (53.3 Kb)
доцент2 Дата: Пн, 01.05.2017, 20:29  |                                                                                                                Сообщение # 14
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 287
Репутация: 10   ±
Замечания:   ±
На сайте с 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
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 79
Репутация: 54   ±
Замечания:   ±
На сайте с 20.07.2012

Статус: Offline


Цитата
Фильтр заработал. Проверил его на hmc5883l, теперь надо попробовать с mpu6050.

А у Вас какой фильтр заработал, программный или тот что на борту микросхемы ?
Форум Picbasic.ru » Программирование МК » Proton PicBasic » MPU6050 ("шумит")
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск: