Технический форум по робототехнике.
Правила форума
В данном разделе каждый может иметь не более одной темы. Тема должна начинаться с логина (ника) робофорума.
dccharacter » 12 фев 2013, 11:36
Ну и чего?
Dmitry__ » 12 фев 2013, 17:36
Ну чего тебе сказать? Я получил разрыв шаблона
Так много говорилось про перемалывание NOPов, а ты...
Научись пользоваться симулятором в IAR, прокрути в нем основные функции, посмотри кто жрет ресусрсы.
AHRS_GetValues(val) сьедает 3909246 тактов = 55846,3 мкс
Причем:
- Код: Выделить всё • Развернуть
processGyroData(GyroBuffer, GyroTempBuffer); =303521 t
processAccelData(AccBuffer, AccTempBuffer); =1802600 t
processMagnetoData(MagBuffer, MagTempBuffer); =1802490 t
Если ты хочешь получить 50 герц, то у тебя есть: 1000000 (1сек) /50 герц * 70мгц = 1400000 тактов.
А твои processGyroData + processAccelData + processMagnetoData сьедают почти 4000000 тактов.
А сам расчет AHRS занимает 630 тактов

dccharacter » 12 фев 2013, 18:07
гггггггг
Добавлено спустя 12 минут 14 секунд:
Кстати, это функции из примеров, из которых просто вырезано получение данных для того, чтобы данные с датчиков читались одновременно, а потом уже остальная лабуда шла.
Dmitry__ » 12 фев 2013, 18:14
На самом деле я могу ошибаться с тактами, т.к. проверял на симуляторе, а не в железе. Работа с i2c скорее всего проходит по time out, а это самое долгое ожидание. В общем, надо написать тестовые примочки, которые тебе реально покажут такты выполнения функций. Типа, обнулил таймер, выполнил функцию, прочитал таймер и выдал на терминал.
Но в любом случае, AHRS_GetValues не должен читать датчики залезая в реальные железяки. Он должен забирать данные из памяти. А готовить данные из датчиков должна другая программа (в прерывании, прозрачно основной проге). И вылизана по тактам она должна быть по макс. Даже нельзя ждать флаг готовности шин, проверил флаг, если все плохо - свалил до след. тика времени.
Добавлено спустя 2 минуты 8 секунд:dccharacter писал(а):Кстати, это функции из примеров, из которых просто вырезано получение данных
Да у стм полный быдлокодинг. Ни одну их функцию не включай в свой проект, пока полностью ее не оттестишь/поймешь.
dccharacter » 12 фев 2013, 20:54
Ну ты не разобрался
Вот где у меня читаются данные с железа
- Код: Выделить всё • Развернуть
void EXTI1_IRQHandler(void) {
/* Clear the EXTI line pending bit */
EXTI_ClearITPendingBit(EXTI_Line1);
STM_EVAL_LEDToggle(LED3);
STM_EVAL_LEDOn(LED4);
readAllSensors(GyroTempBuffer, AccTempBuffer, MagTempBuffer); // <--- чтение из железа занимает 1мс, скорости отпущены, если увеличить вдвое i2c, то ьудет свистеть
STM_EVAL_LEDOff(LED4);
GyroDRDFlag = 1;
}
Добавлено спустя 7 минут 41 секунду:AHRS_GetValues - 500 мкс в железе
Добавлено спустя 22 минуты 9 секунд:хм, а я в симуляторе не могу попасть на эти функции. Прога висит на всяких инициациях гиры и проч. Как ты до них дошел-то?
Dmitry__ » 12 фев 2013, 21:14
Вот трейсю: updateQuaternions(QuaternionsBuffer);
- Код: Выделить всё • Развернуть
32694
updateQuaternions(QuaternionsBuffer);
32753
AHRS_GetValues(val);
32760
processGyroData(GyroBuffer, GyroTempBuffer);
32786
L3GD20_Read(&tmpreg, L3GD20_CTRL_REG4_ADDR, 1);
32817
L3GD20_SendByte(ReadAddr);
32829 !!! L3GD20Timeout=4096
/* Loop while DR register in not empty */
L3GD20Timeout = L3GD20_FLAG_TIMEOUT;
while (SPI_I2S_GetFlagStatus(L3GD20_SPI, SPI_I2S_FLAG_TXE) == RESET)
{
if((L3GD20Timeout--) == 0) return L3GD20_TIMEOUT_UserCallback();
}
***********************************************************
/**
* @brief Checks whether the specified SPI flag is set or not.
* @param SPIx: To select the SPIx/I2Sx peripheral, where x can be: 1, 2 or 3
* in SPI mode or 2 or 3 in I2S mode or I2Sxext for I2S full duplex mode.
* @param SPI_I2S_FLAG: specifies the SPI flag to check.
* This parameter can be one of the following values:
* @arg SPI_I2S_FLAG_TXE: Transmit buffer empty flag.
* @arg SPI_I2S_FLAG_RXNE: Receive buffer not empty flag.
* @arg SPI_I2S_FLAG_BSY: Busy flag.
* @arg SPI_I2S_FLAG_OVR: Overrun flag.
* @arg SPI_I2S_FLAG_MODF: Mode Fault flag.
* @arg SPI_I2S_FLAG_CRCERR: CRC Error flag.
* @arg SPI_I2S_FLAG_FRE: TI frame format error flag.
* @arg I2S_FLAG_UDR: Underrun Error flag.
* @arg I2S_FLAG_CHSIDE: Channel Side flag.
* @retval The new state of SPI_I2S_FLAG (SET or RESET).
*/
FlagStatus SPI_I2S_GetFlagStatus(SPI_TypeDef* SPIx, uint16_t SPI_I2S_FLAG)
{
FlagStatus bitstatus = RESET;
/* Check the parameters */
assert_param(IS_SPI_ALL_PERIPH_EXT(SPIx));
assert_param(IS_SPI_I2S_GET_FLAG(SPI_I2S_FLAG));
/* Check the status of the specified SPI flag */
if ((SPIx->SR & SPI_I2S_FLAG) != (uint16_t)RESET)
{
/* SPI_I2S_FLAG is set */
bitstatus = SET;
}
else
{
/* SPI_I2S_FLAG is reset */
bitstatus = RESET;
}
/* Return the SPI_I2S_FLAG status */
return bitstatus;
}
Уже попали в ожидание шины spi и таймаут в 4096 повторов.
т.е. явно обращение к железке
- Код: Выделить всё • Развернуть
//L3GD20Timeout=4096
/* Loop while DR register in not empty */
L3GD20Timeout = L3GD20_FLAG_TIMEOUT;
while (SPI_I2S_GetFlagStatus(L3GD20_SPI, SPI_I2S_FLAG_TXE) == RESET)
{
if((L3GD20Timeout--) == 0) return L3GD20_TIMEOUT_UserCallback();
}
Добавлено спустя 13 минут 13 секунд:dccharacter писал(а):хм, а я в симуляторе не могу попасть на эти функции. Прога висит на всяких инициациях гиры и проч. Как ты до них дошел-то?
А ты останови симуляцию. (или вообще запрети запуск симуляции при отладке)
потом правая кнопка мыши на нужной функции: SetNextStatement
Саму функцию пометь точкой останова, и за этой функцией поставь точку останова.
Запомни значение CYCLECOUNTER (если этого окна нет, то: view/register)
A дальше по F11 / shiftF11 / F5 изучай мегакод стм

Если твой стек не переполнится и ты сможешь вернуться из дебрей в начальную функцию, то CYCLECOUNTER тебе покажет сколько времени ты был в жопппппе у стм
dccharacter » 12 фев 2013, 21:28
а, я понял
это притащено из СТМ-овских функций
там в каждом цикле идет чтение регистра и по нему выставляется чувствительность
это тупость конечно, руки просто не дошли до этого
dccharacter » 13 фев 2013, 01:48
офигеть
за два дня так и не удалось повернуть кубик теми кватернионами, что приходят от платы в питоне
в процессинге все крутиться
про разные реализации atan2 уже в курсе
жесть
Я всегда думал, что нет ничего элементарнее, чем описание вращения
dccharacter » 14 фев 2013, 22:43
dccharacter » 16 фев 2013, 16:09
Пацаны! КВАТЕРНИОНЫ!
http://www.gamedev.ru/code/articles/?id=4215Добавлено спустя 3 часа 53 минуты 16 секунд:Хи х ихи
Вращение на 90 град вокруг оси Y: rmY = Quaternion((sqrt(2.0)/2.0, 0, sqrt(2.0)/2.0, 0)) <-тупо, чтобы ось Х смотрела в монитор
Вращение на 90 град вокруг оси Z: rmZ = Quaternion((sqrt(2.0)/2.0, 0, 0, sqrt(2.0)/2.0)) <-тупо, чтобы вращение было в нужном направлении
Сумма вращений (оператор * перегружен!!!!): rmC = rmZ*rmY
Читаем кватернион с платы: q
Если надо задать "домашнюю позицию", берем кватернион, обратный текущему, т.о. вращения нивелируют друг друга: hq = q.conjugate(); q = hq*q
Суммируем все вращения: res = rmC*q
Дальше берем тупо любой вектор: axis = Quaternion((0, 1, 0, 0))
И тупо по формуле вращаем ег онашим вращением: axis = (res*axis)*res.conjugate()
profit!!!!!
Присказка "я вас *** вертел" приобретает новый смысл

))
Никаких конвертаций в матрицы и уж тем более страшные-ужасные углы эйлера.
dccharacter » 17 фев 2013, 18:29
Скриптик для визуализации
Добавлено спустя 2 часа 5 минут 35 секунд:
опять скучно...
можно, конечно, сделать нормальную печать и перевести i2c и SPI на ДМА, но.... зачем? Нынешний вариант не мешает абсолютно AHRS алгоритмам. Писать свои алгоритмы - мозгов нет. Использовать чужие - использовал уже. Куда это все приткнуть - хз.
грустно. скучно. пацаны, кто-нить кроме 3д-принтеров и радиоуправляемых машинок что-нить делает?
- Вложения
-
myVisualisation.py
- (6.87 КиБ) Скачиваний: 253
elmot » 17 фев 2013, 18:36
Я делает. Лежит недопиленный балансер. Так что довольно внимательно смотрю на твои изголятельства.
А, да, в F3 есть набортный операционник. Можно его заморщить:)
dccharacter » 17 фев 2013, 19:26
elmot писал(а):Я делает. Лежит недопиленный балансер. Так что довольно внимательно смотрю на твои изголятельства.
А, да, в F3 есть набортный операционник. Можно его заморщить:)
Ну балансир - да. Думал об этом...
dccharacter » 21 фев 2013, 21:04
NXP в свои ARM F1 микроконтроллеры зашивают драйвера для периферии в ROM. Вроде на маркетинговых материалах неплохо выглядит. Но в спецификации API..... Мамачки
Но вообще там вроде у них что-то интересное есть. Типа проброс периферии вообще на любую ногу и т.д.
Не пробовал никто?
Duhas » 21 фев 2013, 21:16
dccharacter писал(а):Типа проброс периферии вообще на любую ногу и т.д.
это для совсем бездарных трассировщиков ПП ? )