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

Sir_Alex
Alexsis1109:

разве можно между чтением двух каналов РУ еще что-то делать? допустим если первый канал в самом минимуме а это 1мс, то до второго канала остается время не более 1мс, это в лучшем случае, а то и меньше. Вы хотите сказать что в это время нужно считывать, домустим, инфу с датчиков? разве спасет 1мс? или я не так понял?

  1. За 1мс, можно горы свернуть 😃 (Например чтение значений Гиры, Акселя и Температуры через I2C шину с датчика MPU6050, занимает 550мкс (это на ATMEGA2560))
  2. Для декодирования PPM, достаточно ловить переход из 0 в 1 (или наоборот). Для этого используйте прерывание.
  3. Пока вы читаете значения из Гироскопа или делаете другие вычисления. Вам абсолютно ничего не мешает обрабатывать PPM через прерывания.
Gene
Sir_Alex:
  1. За 1мс, можно горы свернуть 😃 (Например чтение значений Гиры, Акселя и Температуры через I2C шину с датчика MPU6050, занимает 550мкс (это на ATMEGA2560))

У меня получается примерно в четыре раза медленнее, причем без чтения температуры, но на ATMEGA 32. Использую стандартную библиотеку от Jeff Rowberg, команду getMotion6(&ax, &ay, &az, &gx, &gy, &gz). Если запрашивать гиры и аксели по отдельности (getAcceleration(&ax, &ay, &az), getRotation(&gx, &gy, &gz), получается медленнее. Процессор, насколько я в курсе, не должен влиять на скорость опроса, ибо основной затык в шине i2C и в самом чипе MPU6050.

Не поделитесь своим методом получения данных с MPU6050, при котором на опрос всех датчиков уходит 550 микросекунд? Или это секрет?

Alexsis1109
Sir_Alex:
  1. За 1мс, можно горы свернуть (Например чтение значений Гиры, Акселя и Температуры через I2C шину с датчика MPU6050, занимает 550мкс (это на ATMEGA2560))

а как Вы прокомментриуете пример с барометром 085 на обработку которого уходит примерно 30мс? Тут то придется пропустить парочку пачек РРМ сигнала или и тут усть какой то выход?

mataor
Alexsis1109:

а как Вы прокомментриуете пример с барометром 085 на обработку которого уходит примерно 30мс? Тут то придется пропустить парочку пачек РРМ сигнала или и тут усть какой то выход?

посмотрите для примера код мультивия - будет понятно.
Все что можно по прерываниям делать - делается по прерываниям.
на остальное есть общий цикл, в котором идет подсчет времени.
если прошло необходимое время (для аппы - 20мс, для баро там 3-4 пункта, каждый через отдельный промежуток времени) то выполняем нужные действия (внутри баро оператор case с запоминанием текущего шага), иначе пропускаем данный пункт и выполняем прочие действия.

так сделано везде. тупо ждать выполнения долгой функции через ожидание никто не делает.

Sir_Alex
Alexsis1109:

а как Вы прокомментриуете пример с барометром 085 на обработку которого уходит примерно 30мс? Тут то придется пропустить парочку пачек РРМ сигнала или и тут усть какой то выход?

Обработку??? Чтение барометра занимает порядка 200-300мкс (я точно не помню по BMP085), накиньте еще 50-100мкс на обсчет давления и температуры.

Gene:

Не поделитесь своим методом получения данных с MPU6050, при котором на опрос всех датчиков уходит 550 микросекунд? Или это секрет?

Почему секрет, код Мегапирата открыт для всех 😃
Чтение выполняется одной командой в пакетном режиме:

    // now read the data
    uint8_t rawMPU[14];

    if (I2c.read(mpu_addr, MPUREG_ACCEL_XOUT_H, 14, rawMPU) != 0) {
//        healthy = false;
        return;
    }

    _sum[0] += (((int16_t)rawMPU[0])<<8) | rawMPU[1]; // Accel X
    _sum[1] += (((int16_t)rawMPU[2])<<8) | rawMPU[3]; // Accel Y
    _sum[2] += (((int16_t)rawMPU[4])<<8) | rawMPU[5]; // Accel Z
    _sum[3] += (((int16_t)rawMPU[6])<<8) | rawMPU[7]; // Temperature
    _sum[4] += (((int16_t)rawMPU[8])<<8) | rawMPU[9]; // Gyro X
    _sum[5] += (((int16_t)rawMPU[10])<<8) | rawMPU[11]; // Gyro Y
    _sum[6] += (((int16_t)rawMPU[12])<<8) | rawMPU[13]; // Gyro Z
mataor

П.С. гдето уже писал… так вот опробовал опрос датчиков на и2с 800кГц - все отлично работает, цикл в вие сразу упал примерно на 500мкс, на 1,2МГц датчики уже не опрашиваются у меня)))

Gene
Sir_Alex:

Почему секрет, код Мегапирата открыт для всех 😃
Чтение выполняется одной командой в пакетном режиме

Я не совсем понял идет ли речь о MPU6000 или MPU6050? В коде библиотеки я не нашел упоминания о второй. Или они полностью совместимы?

mataor
Gene:

Я не совсем понял идет ли речь о MPU6000 или MPU6050

насколько помню они совместимы, различие в том, что в 6050 только и2с, а в 6000 еще SPI есть.

Sir_Alex
Gene:

Я не совсем понял идет ли речь о MPU6000 или MPU6050? В коде библиотеки я не нашел упоминания о второй. Или они полностью совместимы?

Я говорил про MPU6050 подключенный по I2C, но 6000 то же самое, только он еще может работать через SPI. Через SPI естественно еще быстрее будет прочитать регистры.
Через SPI работает библиотека ArduCopter’a

oleg70

Вопрос программистам: настраиваю пины под usart по типу:
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
т.е. в регистр MODER ставлю тип ноги “AF”, далее надо как то указать что мне на этой ноге нужен именно USART, но как ?
Есть регистр (два) AFR для IO, есть функция его настройки, но в хедерах в качестве параметров для нее только безликие GPIO_Mode_AF_х…
Где найти однозначное соответствие между _AF_x и устройством ?
Как вообще ремаппинг правильно делается ?
Прошу подсказки…

rual
oleg70:

Как вообще ремаппинг правильно делается ?

это не про Ф3, ремапинг это Ф0,1,4. Изначально под функцию предназначены выводы определенного порта, ремапинг переключает на другие фиксированые группы выодов, порт достаточно перевести в алтернативный режим и всё.

oleg70:

Прошу подсказки…

Для Ф3 немного по другому

 /* подадим такт на порт */
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);
  /* настройка выводов порта */
  GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_4|GPIO_Pin_5;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
  GPIO_Init(GPIOC, &GPIO_InitStructure);

  /* Соединим выводы портов с AF7 */
 GPIO_PinAFConfig(GPIOC, GPIO_PinSource5, GPIO_AF_7);
 GPIO_PinAFConfig(GPIOC, GPIO_PinSource4, GPIO_AF_7);

Не претендую на точность изложения, но GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; указывает на то что вывод порта будет пользован альтернативной функцией, а функция для вывода порта выбирается GPIO_PinAFConfig(GPIOC, GPIO_PinSource4, GPIO_AF_7);
номер функции GPIO_AF_7 берётся из таблицы, найдите сами в ДС.

Alexsis1109
mataor:

посмотрите для примера код мультивия - будет понятно.

с удовольствием, можно ссылочку?

Sir_Alex:

Обработку??? Чтение барометра занимает порядка 200-300мкс (я точно не помню по BMP085), накиньте еще 50-100мкс на обсчет давления и температуры.

если я правильно понял, все обращения к датчикам и сбор с них информации происходит как бы в свободное время между чтения каналов ШИМа РРМ сигнала?

Alexsis1109

вот правильно ли я делаю: завожу счетчик на 10 мкс и начинаю смотреть состояние 1 канала РРМ сигнала. если после “0” пришла “1” начинаю подсчет длительности ШИМа с интервалом 10мкс. после того как настал “0” значит ШИМ закончился, запоминаю результат и перехожу к опросу 2 канала. И так же если после “0” пришла “1” начинаю подсчет длительности и так все 7 каналов приемника. Правильный ли метод? В таком случае, длительность ШИМа можно посчитать с точностью ±10мкс, что на практике выходит очень и очень грубо. Я так понимаю нужна точность как минимум 1мкс. Но счетчик отказывается работать быстрее чем 5 мкс. В чем дело? И кто с какой точностью считывает ШИМ с приемника?

rual
Alexsis1109:

вот правильно ли я делаю

Все совсем не так… Вы код обработчика ППМ на прошлой странице смотрели? С работой таймера в режиме захвата знакомы? Что такое прерывания и для чего они знаете? Поймите правильно, я не могу курс лекций расписать, могу подсказать , посоветовать. Вот и советую подробно разобраться с работой таймера, посмотреть готовый рабочий код.

Alexsis1109
rual:

Все совсем не так…

рабочий код вижу. расскажите, пожалуйста, в двух словах суть самого процесса считывания ШИМа, чтобы лучше код осмыслить…

Sir_Alex
Alexsis1109:

если я правильно понял, все обращения к датчикам и сбор с них информации происходит как бы в свободное время между чтения каналов ШИМа РРМ сигнала?

Ага, вроде того, но не совсем. Вам надо обрабатывать PPM, Датчики - по прерываниям. Т.е. у вас постоянно крутится основной цикл программы, который занимается обсчетами углов, команд от пользователя, телеметрией и др. делами. И когда приходит прерывание от барометра, вы читаете его новое значение и запоминаете, дальше управление возвращается в главный цикл. Когда приходит прерывание от PPM, считаете ширину импульса очередного канала, как только прочитали весь пакет, записываете в переменные, которые потом читаются из главного цикла. Ну а главный цикл постоянно что то обсчитывает и выдает результат в виде управляющих сигналов на моторы.

Все это утрированно, т.к. датчики могут быть и не подключены с использованием прерываний (как правило этот вывод называется INT). Тогда вам надо отсчитывать определенное время в главном цикле и если например прошло 9ms, можно прочитать свежее значение барометра.

Alexsis1109
Sir_Alex:

Когда приходит прерывание от PPM

т.е. на каждый канал приемника нужно завести в контроллере свое прерывание? и по “1” начинать его измерять?

Sir_Alex:

считаете ширину импульса очередного канала

ширина импульса, на сколько я понимаю, считается с помощью счетчика (таймера) и чем чаще этот счетчик тикает тем точнее можно измерить длительность ШИМа. так? если это так, то с какой максимальной точностью можно измерить ШИМ в Atmega128? у меня завести таймер быстрее 5мкс не получалось, он переставал работать

mahowik
rual:

Всё правильно, вот только в этом этом режиме АППАРАТ не знает своё положение в пространстве, а просто пытается удерживать заданные Р/У угловые скорости.

это 3D (акро) режим, который есть почти во всех полетных контроллерах…

Sir_Alex
Alexsis1109:

т.е. на каждый канал приемника нужно завести в контроллере свое прерывание? и по “1” начинать его измерять?

Так вам надо работать с PPM (8 каналов передается по одному проводу) или PWM (передается каждый канал по своему проводу)?
Для PPM вешается одно прерывание на один вывод процессора, ловим переход из 0 в 1. Ширина импульса будет равна времени между двумя прерываниями.
Для PWM - зависит от возможностей процессора. Если есть возможность повесить 8 аппаратных прерываний -вперед. Но можно и одним обойтись и проверять какие пины изменили свое состояние, тут надо естественно ловить оба перехода из 0 в 1 и из 1 в 0.

Alexsis1109:

ширина импульса, на сколько я понимаю, считается с помощью счетчика и чем чаще этот счетчик тикает тем точнее можно измерить длительность ШИМа. так? если это так, то с какой точностью можно измерить ШИМ?

Ну например в МегаПирате, точность таймера 0.5мкс, этого достаточно. Можно и точнее, но нет в этом смысла.

mahowik
mataor:

П.С. гдето уже писал… так вот опробовал опрос датчиков на и2с 800кГц - все отлично работает, цикл в вие сразу упал примерно на 500мкс

ну тыж понимаешь, что это не штатный режим и тут уже как карта ляжет… выйдешь на мороз, какой нить из параметров подплывет и привет кирпич Ж)

Alexsis1109
Sir_Alex:

Так вам надо работать с PPM (8 каналов передается по одному проводу) или PWM (передается каждый канал по своему проводу)?

у меня аппаратура Futaba 7C, там, на сколько мне известно PPM сигнал. просматривая осцилом каналы приемника, заметил странную вещь. условно возьмем 1 и 2 канал. так вот ШИМ 1 канала изменялся влево, а ШИМ 2 канала изменялся вправо. Т.е. у них как бы была общая стеночка по середине. Для первого канала эта стеночка была концом, а для 2 канала началом.тогда в этом случае захватив переход из 0 в 1 первого канала можно “пролететь” аж в конец второго о_0. Вы с таким сталкивались? а все остальные каналы начинаются нормально, слево начало и увеличивают шим вправо.

Sir_Alex:

Ну например в МегаПирате, точность таймера 0.5мкс, этого достаточно. Можно и точнее, но нет в этом смысла.

Вы не знаете, можно ли на Atmega128 завести таймер на 0.5мкс? У меня уже при 5мкс он переставал работать, зависал… в чем тут может быть дело?