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

rual
mahowik:

Теперь осознаю, что всеж надо было вибрации на платформе пофиксить сперва… иначе похоже никак. Для оси Z с инерциалкой попроще, т.к. для компенсации интеграторов используется быстрый и относительно точный (по сравнению с гпс) барометр. А вот для X,Y осей картинка другая, т.к. для повышения точности нужно больше доверия полагать на аксель (из-за того что гпс врет в большом диапазоне + тормозит по координатам на 1-2 сек), а тут уже вибрации выводят интеграторы из состояния равновесия…

полностью согласен

mahowik:

ну и да, для инерциалки по X,Y нужно калибровку шкал акселя по всем осям добавлять, что в арду 3.0.х и сделали на сколько помню… по Z необязательно, т.к. можно больше веры полагать на баро в компл. фильтре… т.е. баро устаканивает Z интегратор и по вибрациям и по нелинейностям шкалы акселя…

Не знаю как в вие, но у меня допустим надо обязательно калибровку по всем осям, т.к. суммарный вектор ускорения по мировым Х,У легко может иметь не хилую проекцию на Z-ось акселя.

mahowik:

а что за 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);
}

драйвера МПУ в архиве.

SergDoc:

не 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 подталкивать данные.

MPU60x0.rar

Drinker
SergDoc:

Так что у мистера Drinkera есть ещё время для создания нормальной темы про iris

Какая связь между твоими потугами полететь и темой про ирис? Ну хотел по-быстрому для затравки тему создать, ну не получилось, попозжа создам как просят с картинками и кеном… Не все ведь сидят целыми днями у компа и паяльника. 😃

SergDoc:

Мы так и не услышали начальника транспортного цеха пока нет никаких данных не по iris не по его контроллеру pixhawk

Выше написано

Штоп не было ненужных мыслей, вот что попытался с телефона прицепить - коропка и опись содержимого. Терпения господа. Дайте добраться до дела.

SergDoc

А никто не гадит в чужой теме чисто трёпом, давайте факты!!! а я взлетел, ибо как вы выразились “дешевка”…
Кстати я разгадал тайный замысел 3D Robotix 😃 они просто ушли таким способом с i2c… мы кстати можем тоже невзначай, но чуть попозже, когда mpu-шки с компасом появятся… или заложить всё spi сразу? но смысл?компас и баро - датчики не срочные, да и как говорилось выше будет дополнительный выносной компас кому надо…

rual:

драйвера МПУ в архиве.

только фильтр на гиру поставь 42 или вообще 20… не надо ей много знать 😃 98 - перебор…

Drinker
SergDoc:

а я взлетел, ибо как вы выразились “дешевка”…

Сергей, нервы надо беречь. Взлетел ну и взлетел, поздравляю. С чего я про ирис начал, а с того что, выше у кого-то не получилось подружиться с лсм. Я в свою очередь вставился, мол есть на лсм хорошо летающее изделие. Вот и все.

SergDoc:

давайте факты!!!

SergDoc:

а я взлетел

Это конечно мегафакт.
Если есть конкретные вопросы, то с удовольствием отвечу. Пока не понимаю какие факты. Летает все начиная от 15 баксов.

SergDoc

Мне нужны данные по LSM которая стоит в PIXHAWK, ибо я не понимаю - у меня например на мелкоплате был офигенный разброс по осям датчика!!!
а на MPU всё супер, так лучше я дороже датчик куплю и поставлю его в “дешевку” чем непонятную хрень за 200 долырей с двумя процами при этом общающимися по i2c и дешевыми датчиками! вот о чём я твержу…

Drinker:

Летает все начиная от 15 баксов.

Летает и ёжик если его пнуть основательно 😃 вопрос как 😃
А мне и на мою “дешевку” надо копить несколько месяцев 😦

Drinker
SergDoc:

чем непонятную хрень

Думаю “там” не идиоты сидят. Да и вообще какая разница и2с там или спи, лсм или мпу. Железо сбито с алгоритмами и получен результат. Чего еще надо?

SergDoc:

у меня например на мелкоплате был офигенный разброс по осям датчика

Можно подробнее? че за лсм?

SergDoc

LSM330DL если память не изменяет, и резонанс акселя ровно на середине газа…

Drinker
SergDoc:

LSM330DL если память не изменяет, и резонанс акселя ровно на середине газа…

Придется видимо доставать с полки один из своих быдлопилотов с лсм для проверки теории. Завтра прям с утра и приступим к исследованиям.

с такой LSM303DLHC

SergDoc

Да, Андрей, вам тоже надо сказать спасибо, если бы вы не задели меня своим Iris, я бы ещё долго телепался 😃
Туман рассеивается - солнышко проглянуло, и если жена не подведёт, ибо я сегодня с дочкой сижу, то попробую удержание позиции и высоты 😃

soliada
SergDoc:

Мне нужны данные по LSM которая стоит в PIXHAWK

Сергей,собственно я их и выкладывал,правда Мультивийное ГУИ не самый точный измеритель,но как говориться с чем смог разобраться)))
Как я подозреваю,у Вас ЛСМка которая гира аксель в корпусе 5Х7мм? Если так,то у меня на ней тоже ничего не полетело из-за слишком большой боязни вибрации. А так,все коптёры что у меня были,летали исключительно на СТМовских датчиках без всяких проблем,насчет вибрации и балансировки пропов особо и не заморачивался никогда.Честно говоря разници в полете между МПУ и СТМ датчикаи вообще не замечал.
Так что большенство пользователей наверное и не поймут-оценят всей прелести того или иного датчика,а тем более интерфейса по которому он подключен,пользователю главное что? Чтоб летало,снимало и управлялось щупальцами)))

SergDoc

Значит, это будет вопрос религии 😃 Но я как-то не горю желанием пересаживаться с MPU 😃
Далее на новой плате можно испытать не менее 4-х проектов, в принципе в этом и нежелание выкладывать её в открытый доступ - зачем кому-то переходить дорогу, скажем так, есть довольно стабильная и дешевая альтернатива и все желающие могут её получить 😃

soliada:

Как я подозреваю,у Вас ЛСМка которая гира аксель в корпусе 5Х7мм?

да она:

soliada

А что если действительно сделать плату не все в одном,а по типу компьютерной материнки)))Вроде такое же предложение уже звучало.
Из плюсов,сразу имеем выносной компас )))На плате датчиков можно уместить и ЖПС,один фиг если делать по уму,то плата получается минимум 50Х50 мм для антенны 35Х35мм.Т.е получается.на одной стороне антенна,а на другой датчики и ЖПС модуль.К контроллеру будет идти 8пиновый разъем СПИ+УАРТ,или 10 пиновый в случае СПИ+УАРТ+И2Ц.Один фиг если выносить компас+ЖПС нужно не менее 6 ти пинового разъема.По цене они не сильно отличаются друг от друга.

Sir_Alex
soliada:

А что если действительно сделать плату не все в одном,а по типу компьютерной материнки)))Вроде такое же предложение уже звучало.

Обычным пользователям это не надо. А тем кто сам колупается, либо сами могут спаять, либо собрать на коленке из EVAL KIT’ов.

SergDoc

Был такой проект, под одноименным названием ОпенПилот, с поддержкой кучи датчиков и т.д. да чёт не пошел… появился CC, потом CC3D, теперь Revo и думается мне незачем распыляться на разное железо (GPS передатчики… не в счёт), а чётко отработать стабилизацию и ИНС на одних (достойных естественно), а дальше уже пойдёт как по маслу из проца в проц если надо будет…

mataor
SergDoc:

они просто ушли таким способом с i2c… мы кстати можем тоже невзначай, но чуть попозже, когда mpu-шки с компасом появятся… или заложить всё spi сразу? но смысл?компас и баро - датчики не срочные, да и как говорилось выше будет дополнительный выносной компас кому надо…

компас с СПИ можно уже и сейчас ставить… а баро вроде и так СПИ имеет

SergDoc

и при стоимости изготовления одной пустой платы, ну как-то огород городить…

mataor:

компас с СПИ можно уже и сейчас ставить… а баро вроде и так СПИ имеет

датчики - как и говорил, не срочные и городить их на spi и в 3-4 раза увеличивать стоимость пустой платы?

soliada
Sir_Alex:

Обычным пользователям это не надо.

Пожалуй да.Обычным пользователям идеально будет коробочка формата спичечного коробка с входами с одной стороны и выходами с другой)))
Ну и пожалуй еще парой разъемов для подключения “продвинутых” примочек.

SergDoc

Короче я платы заказываю, и надеюсь сегодня вылечю - у нас небо чистое 😃

Sir_Alex
SergDoc:

датчики - как и говорил, не срочные и городить их на spi и в 3-4 раза увеличивать стоимость пустой платы?

Не понял, почему стоимость платы увеличится?

Думаю что все датчики по шине SPI можно заложить в v3 платы. А вот внешние датчики можно и по I2C цеплять.

rual
soliada:

Сергей,собственно я их и выкладывал,правда Мультивийное ГУИ не самый точный измеритель,но как говориться с чем смог разобраться)))

Тут дело не ГУИ. Вот что хочется получить от комрада Дринкера:

  1. Видео удержания коптера на месте с отпущенными стиками, хотя бы так как Сергей показал.
  2. Картинку с графиками акселя этого же полёта.
  3. Фотку внутренностей Хавка.
  4. Ну и по возможности, чтоб тов. Дринкер идентифицировал установленное на Хавке ПО.
    И не то чтоб я или Сергей что то от него требуем, тут всё добровольно вроде как, но заруба есть заруба. И повторюсь, мне лично (и Сергею видимо тоже), да и людям посещающим данную ветку, будет интересно получить объективное мнение (не голословное) пользователя Ириса. Мне как программеру интересны данные акселя в полёте.
SergDoc:

только фильтр на гиру поставь 42 или вообще 20… не надо ей много знать 98 - перебор…

А на Ф3 у меня гира Стшная, читаю только аксель.