Перейти к содержанию
    

AVI-crak

Участник
  • Постов

    367
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные AVI-crak


  1. 5 minutes ago, mantech said:

    Конечно, все прекрасно реализуется изменением частоты по трапеции

    Там нет частоты шага двигателя, есть время одного шага. Алгоритмов разгона/торможения несколько десятков. Та самая трапеция подходит только для прямолинейного движения. Для криволинейного движения используются кривые безье, там уже не двигатель важен - а вектор движения исполнительного механизма. Который имеет свою массу, инерцию, и линейную скорость. Поддержка постоянной скорости перемещения исполнительного механизма по криволинейной траектории выполняется обратными расчётами. Рассчитывается точка в которой будет находиться механика через фиксированное время, потом считают насколько нужно довернуть двигатели, коррекция на возможность там появиться, и на их физическое положение. И только после этого появляются дополнительные шаги перемещения. 

    Конечно можно всё это посчитать заранее, но полученные данные нужно где-то хранить, а память у мк не резиновая. По этому ограничиваются просчётом небольшой части траектории движения, напрозапас, и добивают буфер в фоновом режиме.

    Аппаратный таймер не способен реализовать весь необходимый диапазон времени для одного шага. Даже простой программный таймер на это не способен. Однако программный таймер на дробных числах - легко с этим справляется. Потому как реализует функцию интерполяции. Там по условию вполне может потребоваться пропустить 1 шаг из тысячи, и общее движение останется плавным.

    22 minutes ago, jcxz said:

    Что значит "пропускать шаги"?

    Программный счётчик на дробных числах uint32_t: старший бит целое число, всё остальное - дробная часть. Общая частота обслуживания всех счётчиков допустим 10КГц (выше нет смысла).

    Для того чтобы получить время 200us (5КГц) - достаточно каждый раз прибавлять по  2147483648, это 1 целое и 0 дробное.

    Чтобы получить время 199,99999990686us (5000,000002328КГц) - необходимо добавлять  0 целое и 2147483647 дробное.

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

  2. 8 minutes ago, mantech said:

    Зачем? Может я чего-то не догоняю и управление ШД вышло на какой-то новый уровень, но всегда для управления ШД использовал только 2 параметра, кол-во шагов и частоту...

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

  3. 17 minutes ago, jcxz said:

    Может стоит уже вырасти из возраста ногодрыга?

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

    От ногодрыга уйти нельзя, даже с использованием дма для таймеров - потому-что нужно пропускать шаги! Один таймер для всех каналов, дробные счётчики, и единый алгоритм синхронной обработки. Иначе всё будет криво дёргаться в разные стороны.

  4. 3 hours ago, Vitёk said:

    Компилятор arm-none-eabi-gcc 5.4.1 из состава embitz 1.11, проект для Cortex-M3, если что.

    gcc-arm-none-eabi-10.3-2021.07-win32.zip https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads

    Будет ругаться на default.specs https://www.embitz.org/forum/thread-4.html, и ebmon.specs - который можно оставить пустым. Для того чтобы работала печать в отладку - использовать мой код https://github.com/AVI-crak/Rtos_cortex/blob/master/monitor.c. При использовании без ос - заменить os_data.system_us на обычный счётчик. Он там как собака работает.

  5. 1 hour ago, Xenia said:

    А что там с оборудованием от AMD

    Вот, когда здание уже было готово, и остро встал вопрос размещения оборудования - курирующий от AMD персонал задал очень глупый вопрос: "А это временный склад, да?".

    Просто по мнению специалиста, бетонная коробка с побелкой!!! на потолке - может быть только складом, и то промежуточным. Я-б вообще не удивился, если-б там земляной пол был.

    Посему разговоры про нанометры - это как делёжка не убитого медведя. Тех.документация для установки фаба с нуля - по объёму как средняя библиотека (если всё в бумагу перевести). И любое отклонение (экономия с откатом) - автоматически обнулит конечный результат. Там всё важно: марка бетона, композитная краска для бетонных конструкций, качество нержавейки - которой весь бетон внутри здания оборачивают и проваривают в стык... И это ещё только первый контур защиты от пыли. Второй контур вообще в скафандрах собирают (тот который от пыли), а все готовые детали несущих конструкций - пропускают через систему шлюзов (грубая очистка, глубокая очистка, ну и прям блеск). Потому как после завершения всех работ - уборщицу с тряпкой туда уже не пустят.

    Я очень сильно сомневаюсь что таджики умеют работать в чистых комнатах. Да и насчёт русских не очень уверен. 

  6. 1 hour ago, AVStech said:

    НМ-Тех (бывш. Ангстрем-Т) читают этот форум?

    А смысл? У нас уже несколько раз пытались строить, но каждый раз получалось глинобитное сооружение из соломы и навоза. Так и будет получаться, пока тендер на строительство выигрывают люди умеющие делиться. Просто выделить деньги - недостаточно, нужно быть лично заинтересованным в конечном результате. А подобный поворот за гранью фантастики.

  7. 9 minutes ago, GenaSPB said:

     Тот самый Cortex-A7 dual core на 800 МГц. Пока вроде лежит

    В этом мире всего пара сумасшедших, что использовали этот чип по прямому назначению. Для сравнения: stm32f769bg - за этот год выкупили всего 8 штук (я 3). 

    f1c100s продался сотнями, и наверное миллионами в готовых изделиях. Что-бы там ни говорили, но изготовить серийное устройство на старшем чипе st - многократно сложнее чем на китайской потделке.

    Именно по этой причине ST так упорно прорывается в зону сверх малого потребления, там есть кому продавать своё барохло.

  8. 2 hours ago, dimir said:

    где этот раздел?

    https://www.st.com/resource/en/reference_manual/rm0090-stm32f405415-stm32f407417-stm32f427437-and-stm32f429439-advanced-armbased-32bit-mcus-stmicroelectronics.pdf

    Страница 69.

    https://www.st.com/en/microcontrollers-microprocessors/stm32f407-417.html

    Страница документации stm32f407. Reference Manuals - это как-раз оно.

    Ставь хром, включи автоматический перевод, ели по другому вообще никак не получается.

  9. 1 hour ago, dimir said:

    Где эти примеры?

    Я уже говорил вам, что все вопросы касательно чипов компании st - нужно начинать с полного названия чипа. Это не адруина, где всего пара чипов, и почти всё решается ногодрыгом. Тут много периферии, в разных вариантах и разном количестве. Да даже корпуса чипов настолько разнообразны, что почти всегда приходится полностью переписывать уровень железа. У st нет совместимости на уровне железа, вообще нет - все чипы имеют различия.

    То-же условие к поиску информации. Документацию скачивать только у st, и только для своего чипа. В кубике выбирать только свой чип, чтоб все буквы/цифры совпадали. В гугле искать по номеру серии (например stm32f103). И не прыгать по документации как сайгак, а читать сверху вниз. Доки писали роботы для роботов, там важно как написано, и где написано. Если первым идёт раздел про Boot ноги мк - значит без этого раздела у вас ничего не получится.

  10. 1 minute ago, jcxz said:

    Интересно - а чего вы ожидали? Телепатов, которые удалённо увидят ваши исходники и удалённо же найдут в них баги?

    А я их видел, там реально вывих мозга можно заработать. Особо прикольно смотрится не фиксированный размер элементов массива буфера, отчего функция обработки приобретает причудливые костыли в самых неожиданных местах.

  11. 14 hours ago, KnightIgor said:

    я пытаюсь найти ошибку самостоятельно, поскольку здесь, кроме общих поучений в виде введения в принципы FIFO и иных заявлений типа "она неправильно построена", надеяться на совет не приходится

    По документации должен стоять маяк, а у вас колодец с фонарём на дне. Можно конечно заменить фонарь на сейсмический излучатель, а все корабли принудительно оборудовать гидролокаторами... Но это потребует многократно больших средств, чем банальный маяк. 

  12. KnightIgor - ваш стиль впадения в анабиоз на пару дней - не способствует продуктивной беседе. 

    FIFO - это мост, ставить на него полицейских - не лучшая идея. Нам нужно чтобы движение через мост было максимально быстрым, а в случае внутреннего арбитража внешних писателей - движение будет прерывистым, с полным очищением перед сменой писателя. То-есть смысл использования fifo теряется, тогда-уж проще обмениваться ссылками на готовые данные.

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

    Таким образом сохраняется главное преимущество fifo перед остальными вариантами связи - удаление или многократное уменьшение времени взаимных блокировок.

    Кстати, связь через порт отладки SWO - на аппаратном уровне поддерживает разделение на каналы, и это очень удобно. Особенно когда скорость потоков не равномерна - позволяет не валить всё в одну кучу, а аккуратно раскладывать по полочкам. Кроме того, требования к программному обеспечению на стороне мк - получаются самыми малыми по размеру, буквально несколько строк.

  13. 4 hours ago, KnightIgor said:

    Как двинуть указатель атомарно?

    Ну, проблемы могут возникнуть только у тех чипов, где размер регистра меньше указателя. Например на восмибитном мк опасно делать указатель более 256. И да, это не совсем указатель в классическом варианте (полный адрес) - это смещение от первого элемента буфера(индекс). То-есть на 32b системах очень трудно споткнуться.

    Алгоритм записи в фифо: проверить свободное место, записать данные, изменить указатель "головы". Повторить до окончания данных.

    Алгоритм чтения: прочитать указатели, если не равны - то сначала прочитать данные по указателю "хвост", потом обновить указатель. Повторить до совпадения указателей.

    Хвост всегда догоняет голову, голова не может догнать хвост. Нарисуй круг, поставь по кругу числа, и поиграйся до полного просветления.

     

  14. 7 hours ago, KnightIgor said:

    Существует две основные концепции построения кольцевых буферов

    Вот специально для полной атомарности придумали FIFO с двумя указателями, без блокирования прерываний танцев с бубном. Два потока могут общаться через fifo, даже если выполняются на разных ядрах, одновременно. А посчитать свободное место или остаток - можно в любое время с любой стороны, и при этом не будет ошибок!!! Причём на FIFO можно натравить дма, оно конечно не полностью автоматически получится - но телодвижений будет на пару порядков меньше.

    Насчёт третьего пункта - не понимаю как и в чём оно должно вам помогать. FIFO - это не синхронный механизм связи, и уж точно не является объектом распространения зоны видимости, он всегда сам по себе - между двумя фиксированными потоками. Когда желающих больше - нужно либо больше разных FIFO, либо канальный уровень сверху, ну или арбитраж ресурсов. Но самого механизма FIFO - это вообще никак не касается, его дело простое - рулить буфером. 

    Кстати я уже давно заметил, чем алгоритм проще - тем надёжнее работает. 

  15. Ох нихрена-се наворочено. Мне FIFO как-то по проще видится, уж во всяком случае без индекса.

    #define fifo_size 256
    
    union fifo
    {
        struct in
        {
            const volatile uint16_t     tail;
            volatile uint16_t           head;
            volatile char               ptr[fifo_size];
        };
        struct out
        {
            volatile uint16_t     tail;
            const volatile uint16_t           head;
            volatile char               ptr[fifo_size];
        };
    };

    Всё очень просто: голова не может догнать хвост, хвост всегда догоняет голову.

  16. 11 hours ago, KnightIgor said:

    Я в код уже и не заглядываю.

    Моя история - ошибка с временем жизни в пять лет. За это время главный наладчик успел заработать цирроз печени, а сколько народу на линии сменилось уже не сосчитать... Всё дело в одной пропущенной букве: константа должна быть одинарной точности, а GCC её принудительно делал двойной точности. В очень редких случаях этот код начинал выполнятся, и работал чуть дольше чем с одинарной точностью. В результате лента конвейера успевала продвинуться на пару миллиметров, отчего лапы захвата тары звонко долбились об пластик. Это было громко, намного громче фонового шума всего цеха. Отчего вокруг ленты возникал кипишь, плавно переходящий в панику.

    Пропущенная буква - "f".  

  17. 4 hours ago, aaarrr said:

    Внутри может быть что угодно

    Не путать именную структуру с полем bool(числовое значение+реальный адрес), и bool в качестве возврата функции - одно определение вообще на весь проект. Как только значению bool даётся новое имя - сразу появляется адрес для хранения числового значения, который уже можно передавать куда угодно. Но в чистом виде GCC имеет право заоптимизировать вусмерть, лишив физического адреса. Как оно первоначально и было задумано.

  18. Ой-ли... https://docs.microsoft.com/ru-ru/dotnet/csharp/language-reference/builtin-types/bool

    Bool сам себе результат применения логики, он не является числовым значением. И есно к регистрам r0-r3 имеет очень слабое отношение - переходит в число исключительно в режиме эмуляции самого себя. Так-же значение bool нельзя передать куда-то далеко, можно только использовать здесь и сейчас.

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

    Это нормально до момента, пока библиотека не меняет тип ядра, например с cortex M7 на cortex M0 и обратно. А меняют ядро для того чтобы библиотека работала везде и всегда. Вот только bool после таких манипуляций намертво переходит в режим эмуляции. Это кстати одна из тех причин, по которой я ненавижу чужие откомпелированные библиотеки.

  19. Ну классика-же:

    #undef true
    #define true false
    /* ебитесь как хотите */

    Кстати, значение bool не обязательно должно возвращаться в регистре R0. Вместо этого используется регистр xpsr(для arm), в котором находятся биты сравнения: всё что не равно - лож.

    По этой причине использование bool на чипах cortex M0 - добавляет очень странные телодвижения, которые трудно понимать на трезвую голову.

  20. Неверно, все адресные линии используются для инсталла, но А12 не используется для адресации в mt48lc16 чипе. Эту линию можно посадить на землю, там всегда должен быть ноль. Просто адресные линии чипа ST и адресные линии внешней памяти - это немного разные вещи.

     

    Начнём с того что на внешнем чипе А0 - это выборка в строке и столбце, команды подаются раздельно, и на выхлопе всегда данные в полной разрядности чипа. Это свойство позволяет использовать память с выхлопом в два бита данных - просто увеличивая количество микросхем памяти до необходимой ширины шины данных. 

    В настройках sdram указывается ширина выборки страниц, которая физически зависит от объёма памяти делённое на 4096 бит (ширина страницы) и ещё на количество банков. А12 уже отпадает как адрес, и используется в выборе банка.

     

    Выборка в пределах страницы настраивается косвенно, по ширине линий данных на чипе ST (указывается). При этом  DQM0~3, - это проекция адресных линий A0-A1. Интерфейс sdram может быстро читать блоком - всю страницу разом. Но количество внешних микросхем бывает разным, а сама внешняя память об этом ничего не знает. Есть настройка для чтения потоком, как для ST, так и для внешней памяти. По умолчанию записано и считается что подключена одна внешняя микросхема памяти, в этом случае ничего изобретать не нужно.

     

    Для mt48lc16 адрес формируется так: DQM0, DQM1 (А0), быстрое чтение внутри строки (А1-А8), выборка строки (А9-А21), выбор банка (А22-А23). Вот это А0-А23 - это проекция адресного пространства ST на внешнюю память, к нему ещё и смещение добавляется. А то что там из чипа торчит, и как подписано - с реальностью отношения не имеет.

     

    И ещё. У меня есть большая подборка журналов схемотехника, большое количество схем из интернетов, а так-же бумажная макулатура от советского наследия (хорошо горит между прочим). Дык вот, каждая вторая схема имеет ошибки!!! Ошибок нет там, где есть обратная связь между шансом появления ошибки - и доходом автора схемы. Например техническая документация на микросхему. А вот публичная схема с участим этой микросхемы - может содержать ошибку, потому как автору глубоко пофиг. 

×
×
  • Создать...