Создание собственной системы стабилизации
Теперь осознаю, что всеж надо было вибрации на платформе пофиксить сперва… иначе похоже никак. Для оси Z с инерциалкой попроще, т.к. для компенсации интеграторов используется быстрый и относительно точный (по сравнению с гпс) барометр. А вот для X,Y осей картинка другая, т.к. для повышения точности нужно больше доверия полагать на аксель (из-за того что гпс врет в большом диапазоне + тормозит по координатам на 1-2 сек), а тут уже вибрации выводят интеграторы из состояния равновесия…
полностью согласен
ну и да, для инерциалки по X,Y нужно калибровку шкал акселя по всем осям добавлять, что в арду 3.0.х и сделали на сколько помню… по Z необязательно, т.к. можно больше веры полагать на баро в компл. фильтре… т.е. баро устаканивает Z интегратор и по вибрациям и по нелинейностям шкалы акселя…
Не знаю как в вие, но у меня допустим надо обязательно калибровку по всем осям, т.к. суммарный вектор ускорения по мировым Х,У легко может иметь не хилую проекцию на Z-ось акселя.
а что за I2C драйвер использовал для F3? на сколько помню драйвер от F4 не подходит (хотя и то и то Cortex-M4) и там нужен какой то изврат или стороннюю либу пользовать…
Использовал штатный СТшный драйвер от ЛСМ303 для настройки (т.е. записи в МПУ), и свой обработчик для чтения по прерываниям. Переписал нутексовый драйвер МПУ в Стшном стиле 😃
void Accel_Config(void)
{
MPU6000_InitTypeDef MPU6000_InitStruct;
LSM303DLHCAcc_InitTypeDef LSM303DLHCAcc_InitStructure;
/* необходимо для настройки интерфейса i2c */
LSM303DLHC_AccInit(&LSM303DLHCAcc_InitStructure);
/* настройка MPU6050 */
MPU6000_InitStruct.Reset = MPU6000_H_RESET;
MPU6000_InitStruct.PowerConf = MPU6000_CLK_SEL_PLLGYROZ;
MPU6000_InitStruct.StandbyConf = MPU6000_NO_STANDBY;
MPU6000_InitStruct.UserConf = MPU6000_NO_USER_CFG;
MPU6000_InitStruct.DataOutputRate = 50;
MPU6000_InitStruct.GyroFullScale = MPU6000_FS_2000DPS;
MPU6000_InitStruct.GyroLPFConf = MPU6000_DLPF_CFG_98HZ;
MPU6000_InitStruct.AccFullScale = MPU6000_AFS_8G;
MPU6000_InitStruct.AccHPFConf = MPU6000_NO_ACC_HPF_CNG;
MPU6000_InitStruct.InterruptConf = MPU6000_RAW_RDY_EN;
MPU6000_InitStruct.InterruptPinConf = MPU6000_INT_ANYRD_2CLEAR;
MPU6000_Init(&MPU6000_InitStruct);
}
вот тело читалки и2ц (Александр mahowik, я тебе вроде весь проект по Ф3 отправлял? там есть)
/* обработчик прерывания по событиям и буферу и2ц ИНС
внутренний адрес размещаем в buf[0]*/
void I2C_INS_ISR(void)
{
switch(i2c_sts) /* конечный автомат и2ц*/
{
case pustoy:
#ifdef MPU60x0_ACC
NVIC_EnableIRQ(MPU60x0_I2C_INT_EXTI_IRQn);
#else
NVIC_EnableIRQ(LSM303DLHC_I2C_INT1_EXTI_IRQn);
#endif
break;
case Sp: /* Stop */
/* Clear STOPF flag */
if (I2C_GetFlagStatus(LSM303DLHC_I2C, I2C_ISR_STOPF) == SET){
/*сбросим флаги запросов прерываний */
I2C_ClearITPendingBit(LSM303DLHC_I2C,I2C_IT_STOPI);
I2C_ClearFlag(LSM303DLHC_I2C, I2C_ICR_STOPCF);
i2c_sts = pustoy;
/* здесь вызов метода-заполнителя данных объекта ИНС */
switch(i2c_DeviceAddr){
case MPU_I2C_ADDRESS:
case ACC_I2C_ADDRESS: AccDataRdy(); break;
/* чтение магнитометра */
case MAG_I2C_ADDRESS: MagmDataRdy(); break;
}
}
#ifdef MPU60x0_ACC
NVIC_EnableIRQ(MPU60x0_I2C_INT_EXTI_IRQn);
#else
NVIC_EnableIRQ(LSM303DLHC_I2C_INT1_EXTI_IRQn);
#endif
break;
case Ra: /* Start */
if (I2C_GetFlagStatus(LSM303DLHC_I2C, I2C_ISR_TXIS) == RESET) break;
if(NumByteToRead>1)
i2c_RegAddr |= 0x80;
/* Send Register address */
I2C_SendData(LSM303DLHC_I2C, (uint8_t)i2c_RegAddr);
i2c_sts = Rs;
break;
case Rs: /* ожидание передачи адреса регистра для чтения */
if (I2C_GetFlagStatus(LSM303DLHC_I2C, I2C_ISR_TC) == RESET) break;
/* формируем повторный старт*/
I2C_TransferHandling(LSM303DLHC_I2C, i2c_DeviceAddr, NumByteToRead, I2C_AutoEnd_Mode, I2C_Generate_Start_Read);
i2c_sts = Rd;
break;
case Rd: /* Чтение очередного байта */
if (I2C_GetFlagStatus(LSM303DLHC_I2C, I2C_ISR_RXNE) == RESET) break;
if (NumByteToRead) {
AccMag_buf[AccMag_buf_inx++] = I2C_ReceiveData(LSM303DLHC_I2C);
if (--NumByteToRead==0) i2c_sts = Sp;
} else
i2c_sts = Sp;
break;
default: /* не понятное состояние = ошибка интерфейса */
/*сбросим интерфейс */
I2C_SoftwareResetCmd(LSM303DLHC_I2C);
/*сбросим флаги запросов прерываний */
I2C_ClearITPendingBit(LSM303DLHC_I2C, I2C_IT_TCI|I2C_IT_STOPI|I2C_IT_RXI|I2C_IT_TXI);
i2c_sts = pustoy;
break;
}
/* проверим выход указателя за пределы буфера */
if (AccMag_buf_inx > sizeof AccMag_buf)
AccMag_buf_inx = sizeof AccMag_buf;
/*сбросим флаги запросов прерываний */
I2C_ClearITPendingBit(LSM303DLHC_I2C, I2C_IT_TCI|I2C_IT_STOPI|I2C_IT_RXI|I2C_IT_TXI);
}
драйвера МПУ в архиве.
не i2c практически одинаковы, есть мелкие нюансы, сводящиеся к настройке портов, по моему я больше ничего не переделывал, а на сколько понимаю то периферия в f3 больше похожа на f1 чем на f4?
Нее, Сергей, Ф1 и Ф3 сильно разные. Как раз у Ф3 периферия, я думаю, наиболее продвинутая. А конкретно i2c интерфейс у Ф1 и Ф4 совершенно одинаковый, сам выполняет только отдельные операции на шине, т.е. Start, Stop и передача/приём байта, “пока не пнёшь не полетит” ). У Ф3 всё интересней, он сам поддерживает полный цикл обмена, от Start до Stop, в прерываниях только запрашивает, либо получает данные. Вот штатная функция от Ф3Дисковери:
/**
* @brief Writes one byte to the LSM303DLHC.
* @param DeviceAddr : specifies the slave address to be programmed.
* @param RegAddr : specifies the LSM303DLHC register to be written.
* @param pBuffer : pointer to the buffer containing the data to be written to the LSM303DLH.
* @retval LSM303DLHC Status
*/
uint16_t LSM303DLHC_Write(uint8_t DeviceAddr, uint8_t RegAddr, uint8_t* pBuffer)
{
/* Test on BUSY Flag */
LSM303DLHC_Timeout = LSM303DLHC_LONG_TIMEOUT;
while(I2C_GetFlagStatus(LSM303DLHC_I2C, I2C_ISR_BUSY) != RESET)
{
if((LSM303DLHC_Timeout--) == 0) return LSM303DLHC_TIMEOUT_UserCallback();
}
/* Configure slave address, nbytes, reload, end mode and start or stop generation */
I2C_TransferHandling(LSM303DLHC_I2C, DeviceAddr, 1, I2C_Reload_Mode, I2C_Generate_Start_Write);
/* Wait until TXIS flag is set */
LSM303DLHC_Timeout = LSM303DLHC_LONG_TIMEOUT;
while(I2C_GetFlagStatus(LSM303DLHC_I2C, I2C_ISR_TXIS) == RESET)
{
if((LSM303DLHC_Timeout--) == 0) return LSM303DLHC_TIMEOUT_UserCallback();
}
/* Send Register address */
I2C_SendData(LSM303DLHC_I2C, (uint8_t) RegAddr);
/* Wait until TCR flag is set */
LSM303DLHC_Timeout = LSM303DLHC_LONG_TIMEOUT;
while(I2C_GetFlagStatus(LSM303DLHC_I2C, I2C_ISR_TCR) == RESET)
{
if((LSM303DLHC_Timeout--) == 0) return LSM303DLHC_TIMEOUT_UserCallback();
}
/* Configure slave address, nbytes, reload, end mode and start or stop generation */
I2C_TransferHandling(LSM303DLHC_I2C, DeviceAddr, 1, I2C_AutoEnd_Mode, I2C_No_StartStop);
/* Wait until TXIS flag is set */
LSM303DLHC_Timeout = LSM303DLHC_LONG_TIMEOUT;
while(I2C_GetFlagStatus(LSM303DLHC_I2C, I2C_ISR_TXIS) == RESET)
{
if((LSM303DLHC_Timeout--) == 0) return LSM303DLHC_TIMEOUT_UserCallback();
}
/* Write data to TXDR */
I2C_SendData(LSM303DLHC_I2C, *pBuffer);
/* Wait until STOPF flag is set */
LSM303DLHC_Timeout = LSM303DLHC_LONG_TIMEOUT;
while(I2C_GetFlagStatus(LSM303DLHC_I2C, I2C_ISR_STOPF) == RESET)
{
if((LSM303DLHC_Timeout--) == 0) return LSM303DLHC_TIMEOUT_UserCallback();
}
/* Clear STOPF flag */
I2C_ClearFlag(LSM303DLHC_I2C, I2C_ICR_STOPCF);
return LSM303DLHC_OK;
}
т.е надо только вызвать функцию подготовки интерфейса I2C_TransferHandling(LSM303DLHC_I2C, DeviceAddr, 1, I2C_Reload_Mode, I2C_Generate_Start_Write), а дальше по флагу освобождения регистра передатчика I2C_ISR_TXIS подталкивать данные.
Так что у мистера Drinkera есть ещё время для создания нормальной темы про iris
Какая связь между твоими потугами полететь и темой про ирис? Ну хотел по-быстрому для затравки тему создать, ну не получилось, попозжа создам как просят с картинками и кеном… Не все ведь сидят целыми днями у компа и паяльника. 😃
Мы так и не услышали начальника транспортного цеха пока нет никаких данных не по iris не по его контроллеру pixhawk
Выше написано
Штоп не было ненужных мыслей, вот что попытался с телефона прицепить - коропка и опись содержимого. Терпения господа. Дайте добраться до дела.
А никто не гадит в чужой теме чисто трёпом, давайте факты!!! а я взлетел, ибо как вы выразились “дешевка”…
Кстати я разгадал тайный замысел 3D Robotix 😃 они просто ушли таким способом с i2c… мы кстати можем тоже невзначай, но чуть попозже, когда mpu-шки с компасом появятся… или заложить всё spi сразу? но смысл?компас и баро - датчики не срочные, да и как говорилось выше будет дополнительный выносной компас кому надо…
драйвера МПУ в архиве.
только фильтр на гиру поставь 42 или вообще 20… не надо ей много знать 😃 98 - перебор…
а я взлетел, ибо как вы выразились “дешевка”…
Сергей, нервы надо беречь. Взлетел ну и взлетел, поздравляю. С чего я про ирис начал, а с того что, выше у кого-то не получилось подружиться с лсм. Я в свою очередь вставился, мол есть на лсм хорошо летающее изделие. Вот и все.
давайте факты!!!
а я взлетел
Это конечно мегафакт.
Если есть конкретные вопросы, то с удовольствием отвечу. Пока не понимаю какие факты. Летает все начиная от 15 баксов.
Мне нужны данные по LSM которая стоит в PIXHAWK, ибо я не понимаю - у меня например на мелкоплате был офигенный разброс по осям датчика!!!
а на MPU всё супер, так лучше я дороже датчик куплю и поставлю его в “дешевку” чем непонятную хрень за 200 долырей с двумя процами при этом общающимися по i2c и дешевыми датчиками! вот о чём я твержу…
Летает все начиная от 15 баксов.
Летает и ёжик если его пнуть основательно 😃 вопрос как 😃
А мне и на мою “дешевку” надо копить несколько месяцев 😦
чем непонятную хрень
Думаю “там” не идиоты сидят. Да и вообще какая разница и2с там или спи, лсм или мпу. Железо сбито с алгоритмами и получен результат. Чего еще надо?
у меня например на мелкоплате был офигенный разброс по осям датчика
Можно подробнее? че за лсм?
LSM330DL если память не изменяет, и резонанс акселя ровно на середине газа…
LSM330DL если память не изменяет, и резонанс акселя ровно на середине газа…
Придется видимо доставать с полки один из своих быдлопилотов с лсм для проверки теории. Завтра прям с утра и приступим к исследованиям.
с такой LSM303DLHC
Да, Андрей, вам тоже надо сказать спасибо, если бы вы не задели меня своим Iris, я бы ещё долго телепался 😃
Туман рассеивается - солнышко проглянуло, и если жена не подведёт, ибо я сегодня с дочкой сижу, то попробую удержание позиции и высоты 😃
Мне нужны данные по LSM которая стоит в PIXHAWK
Сергей,собственно я их и выкладывал,правда Мультивийное ГУИ не самый точный измеритель,но как говориться с чем смог разобраться)))
Как я подозреваю,у Вас ЛСМка которая гира аксель в корпусе 5Х7мм? Если так,то у меня на ней тоже ничего не полетело из-за слишком большой боязни вибрации. А так,все коптёры что у меня были,летали исключительно на СТМовских датчиках без всяких проблем,насчет вибрации и балансировки пропов особо и не заморачивался никогда.Честно говоря разници в полете между МПУ и СТМ датчикаи вообще не замечал.
Так что большенство пользователей наверное и не поймут-оценят всей прелести того или иного датчика,а тем более интерфейса по которому он подключен,пользователю главное что? Чтоб летало,снимало и управлялось щупальцами)))
Значит, это будет вопрос религии 😃 Но я как-то не горю желанием пересаживаться с MPU 😃
Далее на новой плате можно испытать не менее 4-х проектов, в принципе в этом и нежелание выкладывать её в открытый доступ - зачем кому-то переходить дорогу, скажем так, есть довольно стабильная и дешевая альтернатива и все желающие могут её получить 😃
Как я подозреваю,у Вас ЛСМка которая гира аксель в корпусе 5Х7мм?
да она:
А что если действительно сделать плату не все в одном,а по типу компьютерной материнки)))Вроде такое же предложение уже звучало.
Из плюсов,сразу имеем выносной компас )))На плате датчиков можно уместить и ЖПС,один фиг если делать по уму,то плата получается минимум 50Х50 мм для антенны 35Х35мм.Т.е получается.на одной стороне антенна,а на другой датчики и ЖПС модуль.К контроллеру будет идти 8пиновый разъем СПИ+УАРТ,или 10 пиновый в случае СПИ+УАРТ+И2Ц.Один фиг если выносить компас+ЖПС нужно не менее 6 ти пинового разъема.По цене они не сильно отличаются друг от друга.
А что если действительно сделать плату не все в одном,а по типу компьютерной материнки)))Вроде такое же предложение уже звучало.
Обычным пользователям это не надо. А тем кто сам колупается, либо сами могут спаять, либо собрать на коленке из EVAL KIT’ов.
Был такой проект, под одноименным названием ОпенПилот, с поддержкой кучи датчиков и т.д. да чёт не пошел… появился CC, потом CC3D, теперь Revo и думается мне незачем распыляться на разное железо (GPS передатчики… не в счёт), а чётко отработать стабилизацию и ИНС на одних (достойных естественно), а дальше уже пойдёт как по маслу из проца в проц если надо будет…
либо собрать на коленке
На картонке!
они просто ушли таким способом с i2c… мы кстати можем тоже невзначай, но чуть попозже, когда mpu-шки с компасом появятся… или заложить всё spi сразу? но смысл?компас и баро - датчики не срочные, да и как говорилось выше будет дополнительный выносной компас кому надо…
компас с СПИ можно уже и сейчас ставить… а баро вроде и так СПИ имеет
и при стоимости изготовления одной пустой платы, ну как-то огород городить…
компас с СПИ можно уже и сейчас ставить… а баро вроде и так СПИ имеет
датчики - как и говорил, не срочные и городить их на spi и в 3-4 раза увеличивать стоимость пустой платы?
Обычным пользователям это не надо.
Пожалуй да.Обычным пользователям идеально будет коробочка формата спичечного коробка с входами с одной стороны и выходами с другой)))
Ну и пожалуй еще парой разъемов для подключения “продвинутых” примочек.
Короче я платы заказываю, и надеюсь сегодня вылечю - у нас небо чистое 😃
датчики - как и говорил, не срочные и городить их на spi и в 3-4 раза увеличивать стоимость пустой платы?
Не понял, почему стоимость платы увеличится?
Думаю что все датчики по шине SPI можно заложить в v3 платы. А вот внешние датчики можно и по I2C цеплять.
Сергей,собственно я их и выкладывал,правда Мультивийное ГУИ не самый точный измеритель,но как говориться с чем смог разобраться)))
Тут дело не ГУИ. Вот что хочется получить от комрада Дринкера:
- Видео удержания коптера на месте с отпущенными стиками, хотя бы так как Сергей показал.
- Картинку с графиками акселя этого же полёта.
- Фотку внутренностей Хавка.
- Ну и по возможности, чтоб тов. Дринкер идентифицировал установленное на Хавке ПО.
И не то чтоб я или Сергей что то от него требуем, тут всё добровольно вроде как, но заруба есть заруба. И повторюсь, мне лично (и Сергею видимо тоже), да и людям посещающим данную ветку, будет интересно получить объективное мнение (не голословное) пользователя Ириса. Мне как программеру интересны данные акселя в полёте.
только фильтр на гиру поставь 42 или вообще 20… не надо ей много знать 98 - перебор…
А на Ф3 у меня гира Стшная, читаю только аксель.