Jump to content
    

KnightIgor

Участник
  • Posts

    792
  • Joined

  • Last visited

Reputation

2 Обычный

About KnightIgor

  • Rank
    Знающий
    Знающий

Контакты

  • Сайт
    Array
  • ICQ
    Array

Информация

  • Город
    Array

Recent Profile Visitors

4,244 profile views
  1. Я не спец в этих 6D алгоритмах, а Маджвик есть в исходнике. У меня нет гироскопа, т.к. это не задача стабилизации объекта в пространстве в реальном времени. У меня есть некая плата с магнетометром и акселерометром, и я хочу просто знать, в каком положении она закопана под землю - ее ориентацию там. Если наведете на тот самый "комплементарный фильтр" с исходником, буду благодарен.
  2. Каждый волен делать свои ошибки сам.
  3. Вы не понимаете, о чем я. Синтаксически нет необходимости в скобках после if с одним оператором. Речь о развивающемся коде! Я ловил такие ошибки у коллег. Есть такое понятие "глаза замыливаются": вы просто не видите свой код, а коллега бросает взгляд через ваше плечо и тыкает пальцем. Вы что, программер - одиночка, не работали в коллективе?
  4. Все, что работает - допустимо. Мы говорим о стиле. Есть определенные договоренности по синтаксису. https://www.mikrocontroller.net/wikifiles/b/b3/CodeStyleConventions_ID_Software.pdf Если вы хотите, скажем, влиться в мировое сообщество программистов, занимающихся каким-либо проектом (например, тот же Linux), вам следует придерживаться оговоренного стиля. Например, такого, который изложен по ссылке. Использование скобок даже для одного оператора после if (cond) обусловлено тем, чтобы избегать ошибок невнимательности при расширении кода. Например, у вас есть конструкция if (cond) func(1); и вам надо в процессе развития кода под if () вставить еще несколько операторов, то вы, очевидно, должны написать if (cond) { func1(); func2(); } Однако практика работы показывает, что делаются ошибки такого рода: if (cond) func1(); func2(); Как бы вы ни были внимательны и круты (как вы захотите о себе утверждать), такого рода залеты случаются сплошь и рядом (люди - не роботы). Поэтому, как мера безопасности, в сообществе программистов выработан стиль, помогающий уменьшить вероятность таких ошибок типа "copy paste" и "add stuff". В данном случае - скобки.
  5. А почему бы и нет? Более того, облачив кусок кода в скобки, можно в C объявить локальные переменные. Нынешние С, в отличие о старых стандартов, позволяют смешивать объявление переменных и код по ходу текста, но меня учили, что это плохой тон, и я делаю сначала объявление переменных/констант, а потом уже операторы, однако внутренние локальные переменные тоже в этом стиле допустимы, если объявление находится внутри "локальных" {}: Это такие "basics", что я даже не вспомню и не смогу для вас привести ссылки на литературу для начинающий в программировании.
  6. Ой... Синтаксически if(cond) и одним оператором до else (если есть) БЕЗ {} будет компилиться и даже правильно работать, но с таким синтаксисом по дресс-коду в порядочные дома не пускают. Страстно везде рекомендуется облачиться в скобки: if (cond) { } else { }
  7. У меня такой вопрос "back to roots": в чём глубинный смысл { ... } while (0) вместо просто { ... } ? У меня и второй вариант всегда работал...
  8. Сам себе отвечу по результатам. Пропустил я результаты через фильтр Маджвика с учетом того, что у меня нет гироскопа (его часть данных всегда нули). Программу запилил на Lazarus (сконвертировав C код). Выходные углы очень похожи на правду (*см. далее), а реакция на изменение положения - медленное (точно, как в видео https://www.youtube.com/watch?v=C7JQ7Rpwn2k&t=1908s&ab_channel=GoogleTechTalks, когда при демонстрации отключали гироскоп). Но есть одно "но": угол yaw (вокруг оси Z) выдается как бы почти удвоенный: я поворачиваю платку на 90 градусов (с севера на восток), а угол достигает почти 180. Поворачиваю далее до юга, а показания доходят до северо-запада. Так как формулы сложные, тупо поделил значение на 2, но начались вообще странные вещи (прыгает словно ArcSin или кто там в разрыв идет). Две другие оси показывают правильно. Что-бы это могло быть?
  9. Интересный топик. Правда, с конца мая тема не развивалась... Мне кажется, ТС видит перед собой МАЯТНИК, который, если на него посмотреть, и вправду имеет два хорошо различимых полусостояния: раз влево, раз вправо. И ТС интересует вопрос, как мне кажется, что происходит в крайних точках слева и справа, а также в точке "в самом низу". Если посмотреть на синусой.... ой, на синусоИду, то у нее тоже различимы две подобные части: положительная и отрицательная, которые и технически называются ПОЛУВОЛНЫ, потому вопрос и возникает, что полный цикл и вправду состоит из двух ПОДОБНЫХ полуволн, то есть, двух частей (но с разным знаком). Так что под определенным углом зрения вопрос ТС действительно оправдан. Если говорить о колебательных процессах (а не развернутой по времени проекции точки на ободе вращающегося колеса), то для ТС можно ответить, что происходит попеременный переход энергии в кинетическую и потенциальную "части". Для маятника крайние положения - это максимумы потенциальной энергии, а моменты движения через самую нижнюю точку - максимум кинетической энергии (раз влево, раз вправо, но для энергии это не важно). Таким образом, ответ заключается в периодических переходах энергии из одной ипостаси в другую. То же касается и электрических колебательных процессов: там переход между энергией электрического (конденсатор) и магнитного (катушка индуктивности) полей.
  10. Кватернионы, как я прочитал, - еще одна конструкция после комплексных чисел, поэтому комплексные уже не замыкают математику.
  11. У меня тут похожая задачка, только без гироскопа. На плате есть магнетометр, измеряющий магнитное поле Земли, и акселерометр. Эта плата помещается под асфальт, и хотелось бы знать, как она там расположилась относительно поверхности. Как я понимаю, если взять код, нужно просто скормить ему данные от accel и mag и нулевые значения гироскопа, т.к. плата не движется?
  12. Все началось с того, что Эйлеру поставили задачку найти предел функции, как срубить максимально бабла, кладя их в банк под проценты. Там получилось "проценты на проценты" с временными промежутками количеством, стремящимися к бесконечности. Это выражается как Lim[(1+1/N)^N], где N стремится в астрал. Предел оказался равен числу e=2,71828..., которое назвали e в честь Эйлера, по-немецки - Euler. Потом оказалось, что производная e^x есть тоже e^x, а потом ботаны вкурили, что вся вселенная рулится экспонентами или ее антиподом - логарифмами (правда, тут больше по основанию 2). Вот таков сакральный смысл: предел жадности равен числу e.
  13. С Kinetis дело не имел, но где-то надо настроить и UART на то, чтобы оно работало с DMA: посылало ему запросы по биту освободившегося буфера в UART. Может вы этого не сделали, вот DMA и ждет безуспешно запроса?
  14. Вставлю свои 5 центов. У меня на столе лежат: STM32F103VET GD32F103VET GD32F303VET SCB->CPUID возвращает/содержит: 0x411FC231 для STM32F103VET 0x412FC231 для GD32F103VET 0x410FC241 для GD32F303VET Похоже, это слово не меняется от экземпляра к экземпляру одного типа, а идентифицирует тип. Еще раз повторю кратко свои изыскания из форума "Читайте эту тему": - бинарник на мой проект под STM32F103 взлетел сразу на GD32F103 и 303 за исключением некоторых проблем с I2C: как оказалось, в режиме работы по прерываниям на GD32 нельзя устанавливать биты BUFIE и/или POS еще ДО передачи адреса периферии, что я делал на STM32F103 для особых случаев чтения только одного или только двух байтов - это приводило к зацикливанию прерывания на GD32, т.к. бит SB не сбрасывался. Я перенес эти настройки в другую ветвь обработчика прерывания: STM32F103 было фиолетово, а GD32F103/303 заработал. - встроенный UART загрузчик в GD32 полностью совместим с STM32, ST Loader Demostrator программирует без проблем. - DFU через USB не пробовал ни на каком. - На GD32F103 с питанием от 3.3в ADC температурного датчика уходит на максимум; случайно обнаружил, что при питании от 3.2в температура правильная, а чуть поднял питание - насыщение. - Этой ADC проблемы нет на GD32F303. - В моем проекте не задействованы SPI и большинство таймеров; те, что задействованы, работают ожидаемо. DMA и RTC тоже в порядке. - запись во flash из самой программы работает на GD32 без проблем; есть ощущение, однако, что на GD32 требуется больше времени для записи страницы. Проскакивала информация, что GD32F фактически работает из дополнительной "теневой" RAM, куда при старте копируется содержимое из встроенного SPI flash чипа, и GD32F представляет собой, по сути, гибридную сборку. Благодаря RAM быстродействие GD32F, якобы, выше, чем STM32F, и не нужно циклов ожидания как для flash; GD32F103 имеет максимум частоты в 108MHz. Эти факты я не проверял, но ощущение таки есть, что GD32F103 действительно пошустрей на 72MHz: есть у меня в проекте цикл обработки загруженой конфигурации, я измеряю время этого цикла и вижу примерно на 10% бОльшую скорость его обработки на GD32F в сравнении с STM32F103. Вывод: для проекта мы рассматриваем GD32F103 как полноценную альтернативу STM32F103.
×
×
  • Create New...