-
Постов
4 848 -
Зарегистрирован
-
Победитель дней
3
Весь контент Xenia
-
Наверное не на все, а на те, которые имеют контроллер на AVR. Мне должен прийти вроде с платой на STM32 (хотя полной уверенности нет). Или думаете - и в тех контроллерах 3D-принтеров, которые на ARM, там тоже абдуриновый код внутрях? Это было бы печально... По-видимому, вы поленились взглянуть на проект "Marlin" по ссылке, которую я вам давала. В этом случае мне придется для вас оттуда кое-что процитировать: Из них AVR только первые две строчки, а остальные - ARM.
-
Кстати - и как успехи? В создании собственной? Сложно там? много? А то может тоже (если будет время и желание) поковыряю.... Довольно просто. За основу для ковыряния взяла проект "Marlin" с GitHub'а - https://github.com/MarlinFirmware/Marlin/ Почему его? А потому что, прочитав фабричную прошивку в бинарном коде невооруженным глазом, увидела в ней надпись "FIRMWARE_NAME: Marlin 1.1.6". Похоже, что китайцы на все свои 3D-принтеры эту прошивку ставят, т.к. ленятся сами ее писать. Код там написан на C++ без использования скетчей, а если и есть там скетч, то только один - чтобы Сишную программу запустить. Однако фундамент у нее ардуиновский - множество поддерживаемых контроллеров и материнских плат заданы таблично. Поэтому самое сложное дело - настройка, чтобы правильно файл Configuration.h создать под стать реальному железу. А дальше можно изощряться с кодом программы, как захочется. Стоит лишь перед этим убедиться, что 3D-принтер слушается команд. У меня же был особый случай (иначе программу ковырять не было бы причин) - мне хотелось из 3D-принтера сделать ... автосамплер. Т.е. вместо узла подачи филамента я установила перистальтический насос (тоже на шаговом двигателе). Вот такого типа: А вместо рабочего узла ставится игла от шприца, соединяемая гибкой трубкой с насосом. 3D-принтер брала самый дешевый и "голенький" (чтобы был свободный доступ ко всем его узлам): Обошлось не дорого - 8000 руб. То что у дешевых китайских 3D-принтеров руки немножко дрожат :), меня ничуть не волновало, т.к. как бы сильно ни дрожала игла, в пробирку диаметром 8-10 мм она не промахнется. Модификация программы свелась у меня к добавлению собственных команд ЧПУ, помимо тех, что используются 3D-принтерами. Это касаемо калибровки (чтобы запоминало координаты пробирок/флаконов и помнило их по номерам). Тогда как скорость работы устраивала меня та, что была, т.к. задача у меня была более простая: опустить игру до дна (тут пришлось-таки концевые выключатели для надежности поставить, т.к. изначально их не было), засосать заданное количество микролитров жидкости (коэффициент перевода микролитров в число шагов задается всего однажды на этапе той же калибровки), поднять иглу, переместиться в позицию другой пробирки, опустить иглу, выдавить тот объем, который прежде засосало. И так чтобы работало всю ночь без человека.
-
Как раз на "MKS GEN" такая возможность есть, т.к. там дравера не впаянные, а на разъемах установленные. Я сначала думала, что это из-за того, что драйвера часто сгорают :), а оказалось, что для того, чтобы можно было выбирать драйверы на свой вкус. Именно ради этого в подвале разъема установлены джамперы (3 штуки), с помощью которых плата может быть адаптирована к драйверам разного типа (в том числе и к TMC2130). А оно всюду так и есть - удобство завсегда достигается за счет потери функциональности :).
-
"14-битноый холловский датчик" это кто? Инфенионовский TLE501x?
-
Вот это точно! :) Хотя драйверы шаговых двигателей нынче не просто мосфетные ключи, а уже довольно интеллектуальные устройства: Хорошо уже то, что шагом можно управлять импульсами (один импульс = один шаг), не задумываясь о необходимых двигателю таймаутах. Это дополнительный аргумент в пользу того, что STM32H7 здесь не нужен. Кстати и удерживание половинным током этот же драйвер тоже делает. К тому же на микроплате с драйвером еще "крутилка" (trimpot) есть: Поэтому запросто его не убить. Но радиатор на эту микросхему приклеивать обязательно (они входят в комплект, но приклеивать приходится самостоятельно), а лучше организовать еще и принудительную вентиляцию (на плате "MKS Gen V1.4" есть разъем для вентилятора). P.S. Говорят, что драйвер TMC2130 от TI еще круче (по SPI сопрягается), но я его не испытывала, тем более что он дороже. Сравнение этих двух драйверов здесь:
-
А где вы такой шилд для Arduino Mega раздобыли? Самое дешевое, что вижу у китайцев - это: https://aliexpress.ru/item/10000066672988.html но в сумме с ценой за "Arduino Mega" получается заметно больше, чем рекомендованная мной плата "MKS Gen V1.4", где то и другое уже собрано воедино. Кроме того, драйверы шаговых двигателей в состав шилда не входят (их покупать придется отдельно), тогда как "MKS Gen V1.4" можно купить сразу со вставленными драйверами примерно за ту же цену. Плох там не Си (он в Arduino Studio из GCC взят), а встроенные функции, которыми приходится пользоваться. Тогда как у Arduino с этим плохая наследственность - так уж повелось, что Arduino-контроллер (обычно это была ATmega8) использовался, как "автомат", т.е. составлялась таблица его контактов (даже не портов, а именно номеров пинов!), которыми тот мог "дрыгать" (управлять уровнем), и задавалась команда (одна на всю таблицу), которой можно было этот уровень изменять. А дальше через эту таблицу всё и делали. При замене контроллера на другой заменялась таблица выводов, но всё остальное оставалось без изменений. Отсюда и та всеядность Ардуин ко всевозможным типам контроллеров - там по сути не было ничего, что зависело бы от их архитектуры. Как это дело обстоит сейчас, я не в курсе, т.к. в современные прошивки не лазила. Полагаю, что UART и USB-СDC все-таки сделаны на аппаратном уровне с использованием предназначенных для этого линий и аппаратной поддержки.
-
Для Управления шаговыми двигателями ATMega2560 должно быть за глаза достаточно. А если она "тормозит", то это программа так криво написана :). Лично я сталкивалась с похожей проблемой на примере 3D-принтера, для которого пыталась создать свою прошивку, модифицируя фабричную. Для этой цели мне гораздо более понравилась специализированная плата "MKS Gen V1.4", которая представляет собой фактически ту же "Arduino Mega", только уже с готовыми драйверами под шаговые двигатели (5 штук) и питанием под них (12/24V). Она несколько дороже обойдется, чем "Arduino Mega", зато можно купить сразу с драйверами (я покупала в комплекте с A4988), они уже на адаптерах распаяны под DIP16. Сильно понравилось то, что у этой платы нет той дурацкой Arduino-разводки по краям, а вместо этого выводы контроллера ATMega2560 выведены на многочисленные разъемы различного предназначения. При желании можно вместе с ней купить еще дисплей TFT28 или TFT32 - в сумме обойдется дешевле, чем покупать по-отдельности, но этого уже я советовать не стану, т.к. дисплеем разочарована. Сейчас китайских 3D-принтеров развелось тьма тмущая, а потому управляющие платы для них выпускают огромными тиражами, а цены на них соответственно снизились. Теперь о программной части. По-хорошему так надо всю ардуиность из памяти этого контроллера стереть и писать самостоятельно. Т.е. чтобы без всяких скетчей. А главное - никаких таймаутов (!), импульсы для драйверов шаговикам надо создавать таймерами (в крайнем случае по прерыванию), но никак не временными задержками. Тогда при одновременной работе сразу нескольких шаговых двигателей они не будут друг друга тормозить. В продаже часто бывает уменьшенный вариант "MKS Gen L", он чуть дешевле, но покупать его я не советую, хотя для 3D-принтера он вполне годится. И наконец, бывает еще "MKS Robin" в разных вариантах - там уже STM32F103RCT6 стоит. Однако пишут что они хуже из-за их ... 3-вольтовости :), драйверы от 5 вольт якобы лучше срабатывают. А STM32H7 на такую работу ставить - полное кощунство :).
-
Дело в том, что я сама такие программы пишу :), оттого и у меня к этому вопросу интерес. У меня самописная библиотека по образцу интеловской MKL, но с теми функциями, которые в MKL отсутствуют (т.к. к линейной алгебре прямого отношения не имеют). Однако приём у меня такой же как у Intel: библиотечные примитивы пишутся на ассемблере отдельно под каждый род инструкций (FP, SSE4, AVX, AVR2, написала бы с удовольствием и под AVR512, но, к сожалению, у меня нет машины на таком процессоре), а при вызове первой же библиотечной функции таблица входных адресов перестраивается в зависимости от того, на каком процессоре и операционной системе ее запустили. Однако под Windows XP я не могу воспользоваться "богатством" своей библиотеки, тогда как я рассчитывала ее применение как раз для тех случаев, чтобы ею можно было пользоваться на любой Windows-платформе (с Linux я работать не умею).
-
Можно ли у вас узнать, где находится это "одно место", в котором якобы хранятся все обновления из этого списка? А то список велик, но к чему именно он относится, в этом вашем сообщении не указано. А попытка приложить этот текст в прошлым вашим сообщениям создает ситуацию неопределенности, т.к. можно предложить несколько разных версией, где всё это можно сыскать. Очень интересно! Если со временем набредете на инсталлятор Windows XP с таким включением, поделитесь пожалуйства! А то самой подменять ntkernel уж больно страшновато. Здесь причину вы сами правильно назвали: "прирост будет ощущаться в приложениях, скомпилированных с использованием инструкций AVX/AVX2". А поскольку программисты обычно стараются достигнуть максимальной совместимости своих программ малой кровью, то предпочитают компилировать float-арифметику на том "сопроцессоре", что был когда-то еще у процессора 386DX. Тогда как компилятору всё равно - какие инструкции разрешишь ему использовать, те и будет. В уж в отношении программ для Windows XP (у которых в PE заголовке прописано "O/S system 5.1" или меньше) инструкции AVX уж точно никто использовать не станет, т.к. всем известно, что эта ОС их не поддерживает даже в том случае, если процессор на это способен. А вот среди 32-разрядных приложений под Windows 7 (у которых в PE заголовке прописано "O/S system 6.0" или больше) встречаются и такие, что инструкции AVX в себе содержат. Но в целом AVX-инструкции - большое благо :), и дело широкими шагами идет к тому, чтобы в будущих моделях процессоров не только удалить FP-сопроцессор, но и поддержку SSE-инструкций во всех их вариантах.
-
У меня в коллекции два китайских логических анализатора, пытающихся копировать Saleae: Но ни у одного из них такого симптома нет - оба показывают на высокоомном вольтметре между измерительными каналами и землей нулевой потенциал или очень близкий к нему. Однако по USB они от компьютера гальванически не развязаны, а потому в принципе могут что-то нехорошее показывать, если измеряемая схема имеет другую землю или присоединена к USB-разъему другого компьютера.
-
Математика 7-го класса :).
Xenia ответил KnightIgor тема в Решение задач
В общем-то ситуация понятна - система неравенств дает иное решение, чем система уравнений с теми же коэффициентами. Однако в этом случае эта задачка уже не для 7-го класса... -
Математика 7-го класса :).
Xenia ответил KnightIgor тема в Решение задач
Из утверждения №1: "1. Если достать 27 фишек, то одна будет точно зеленой." следует, что остаток (Totаl - 27) должен быть на единицу меньше, чем число зеленых фишек. В противном случае мог получится вариант, когда все зеленые фишки оказались бы в остатке (Totаl - 27), и не одной из них достать не удалось. Отсюда: G = (Totаl - 27) +1 = Totаl - 26 аналогично для остальных утверждений №2, №3 и №4: G = Total - 26 R = Total - 24 W = Total - 21 (черный, т.к. буква B занята синим цветом) B = Total - 16 Подставляем вместо Total сумму R+G+B+W, получаем систему уравнений: R + 0 + B + W = 26 0 + G + B + W = 24 R + G + B + 0 = 21 R + G + 0 + W = 16 Решается легко исключением строк, поскольку коэффициенты при всех переменных всюду единичные (как раз для 7-го класса), но я возиться с этим не стала, а инвертировала матрицу в Matlab'е: >> m = [ 1 0 1 1; 0 1 1 1; 1 1 1 0; 1 1 0 1 ] m = 1 0 1 1 0 1 1 1 1 1 1 0 1 1 0 1 >> b = [26 24 21 16] b = 26 24 21 16 >> x = inv(m) * b' x = 5.0000 3.0000 13.0000 8.0000 Т.е. Red = 5 Green = 3 Blue = 13 Black = 8 Total = 5+3+13+8 = 29 (это я сложила в уме :)) -
Математика 7-го класса :).
Xenia ответил KnightIgor тема в Решение задач
Red = 5 Green = 3 Blue = 13 Black = 8 Total = 5+3+13+8 = 29 Если результат верный, то расскажу, как решала :). -
DDS генератор
Xenia ответил Allregia тема в Алгоритмы ЦОС (DSP)
Про фильтр-то мне ясно, а непонятно, откуда вообще высокие частоты тут берутся. Мне понятно, отчего у гитарной струны есть высшие обертоны. Понятно, откуда они берутся и у кварцевого резонатора. Но неясно, откуда этим частотам взяться, если напряжение выдает ЦАП строго по таблице, и ступеньки там незаметные из-за того, что кривая плавная, а выход ЦАП достаточно инерционен. -
DDS генератор
Xenia ответил Allregia тема в Алгоритмы ЦОС (DSP)
А можно узнать откуда у вас эта информация? Мне казалось вы знаете что дискретный спектр периодичен. Давайте ещё об этом поговорим? Это не столько информация, сколько соображение здравого смысла :). Самая высокая частота, которую можно представить на дискретной сетке - это знакопеременный косинус, когда четные точки имеют значение +1, а нечетные -1. Это и есть частота Найквиста, для которой можно построить только косинус, тогда как синус той же частоты сливается уже в нулевую линию. Частоты, выше частоты Найквиста, при оцифровке через АЦП будут выглядеть на дискретной сетке "прореженными", как в стробоскопе. Обычно в виде разностной частоты между измеряемой частотой и частотой сэмплирования АЦП. Т.е. выглядеть они станут, как низкие частоты, а не как высокие. Но если рассматривать ситуацию вне дискретного случая, то одиночного импульса (а ля дельта-функция Дирака), меандра или пилообразного сигнала вполне достаточно, чтобы от него расползлись частоты по всему спектру, в том числе и за пределами частоты Найквиста. Но это уже не тот случай, который мне интересно обсуждать, т.к. я убежденная дискретница :). -
DDS генератор
Xenia ответил Allregia тема в Алгоритмы ЦОС (DSP)
Нет, конечно, ЦАП работает у меня на частоте 8.4643 MHz (=Fcpu/56), хотя и это заметно выше, чем разрешает даташит. Но если Fs - частота дискретизации, то формулу n*Fs/2 я не понимаю, т.к. уже при n>2 она дает частоту генерируемой синусоиды выше частоты дискретизации. Тогда как Fs/2 - это уже частота Найквиста, выше которой дискретную синусоиду сделать невозможно, а эта формула дает частоты выше. Т.е. я полагаю, что на n надо делить, а не множить. -
DDS генератор
Xenia ответил Allregia тема в Алгоритмы ЦОС (DSP)
Не знаю, что такое "n". У меня тактовая частота CPU 474 МГц, а генерируемая частота около 153.3 КГц. Если n - это делитель, то он в этом случае равен 1/3092. А послецапового фильтра у меня вообще нет - щуп осциллографа прямо к ноге микроконтроллера приставляла :). -
DDS генератор
Xenia ответил Allregia тема в Алгоритмы ЦОС (DSP)
Скажите, а как вы определили, что у вас присутствует зеркалка? Я тоже делала DDS на STM32H743-ем, и стало, на мой взгляд, хорошо только после того так таблицу синусов записала в память SRAM1 (это та, куда DMA имеет отдельный доступ). "Хорошо" в том смысле, что на осциллографе кривая красиво выглядит и нужную мне частоту и период имеет. А теперь вот сомневаться начала - вдруг и у меня тоже зеркалка есть? :) -
ЖКИ WINSTAR 1602C vs 1602D
Xenia ответил zombi тема в В помощь начинающему
Не видно какой либо иной команды для этой цели кроме "Set cursor position". Причем, она тоже иногда проходит нормально, передвигая курсор в нужную позицию (чтобы это стало видно, надо сделать "cursor blink on"). Меня даже посещала мысль, что команда передвижения курсора может занимать продолжительное время, требуя после себя паузы. Для проверки этого предположения я выдавала команду установки курсора не перед началом текста, а в его конце. А поскольку на дисплей выводится строка всего лишь 1 раз в секунду, то для установки курсора перед следующим выводом текста времени должно хватать с избытком. Тем не менее, эффект мигания при этом всё равно сохраняется. А вот если курсор не двигать, а только текст выводить, то сроки лепятся в хвост друг другу, образуя единое месиво, то мигание при этом отсутствует. Что и странно. -
ЖКИ WINSTAR 1602C vs 1602D
Xenia ответил zombi тема в В помощь начинающему
Нет мигает только при обновлении содержимого. Раз на раз не приходится - то правильно обновит, а то всё сотрет. Но если отсоединить TX/RX, то изображение никуда не девается, как бы долго не стояло. Причем похоже на то, что стирание происходит от команды вернуться на 1-ое знакоместо. -
ЖКИ WINSTAR 1602C vs 1602D
Xenia ответил zombi тема в В помощь начинающему
Вот еще вариант с меньшим числом проводов: Вот только плохо он у меня работает - мигает (в смысле через раз картинку показывает, периодически стирая изображение целиком). Думала бракованный экземпляр - заказала второй экземпляр у того же продавца, но результат тот же самый. Кто-нибудь испытывал такое же изделие? Другие символьные дисплеи с интерфейсом UART кому-то известны? -
Спасибо вам за активную работу по пополнению FTP-библиотеки! Ваше участие в буквальном смысле идеально. А то обычно приходится самой что-то добывать или кого-то просить, чтобы выложили. А если что-то и выкладывают по своей инициативе, то потом порой приходится долго думать над тем, что в выложенном архиве покоится :).
-
Тогда советую вам проверить размеры буферов (я, помнится, что-то в них ковыряла, пока не заработало). У меня в CubeMX это выглядит так:
-
Функцию static int8_t CDC_Receive_FS(uint8_t* pbuf, uint32_t *Len); нужно создавать самому в файле usbd_cdc_if.c, а потом подставить ее имя вот сюда: USBD_CDC_ItfTypeDef USBD_Interface_fops_FS = { CDC_Init_FS, CDC_DeInit_FS, CDC_Control_FS, CDC_Receive_FS, CDC_TransmitCplt_FS }; Привязка идет не по именам, а в порядке упоминания имен функций в этом списке - функция приема данных от хоста в списке 4-ая. А потому вместо имени "CDC_Receive_FS" допустимо использовать любое другое. Можете посмотреть, как это сделано у меня, это здесь: http://89.175.255.52/temp/usbd_cdc_if.c но это отнюдь не предложение скопировать этот файл буквально.
-
А вы программку простенькую напишите, чтобы в ewp-файл проекта после MAIN.C дописала ваши файлы. Например, так: <file> <name>$PROJ_DIR$\MAIN.C</name> </file> <file> <name>$PROJ_DIR$\module1.c</name> </file> <file> <name>$PROJ_DIR$\module2.c</name> </file> ... <file> <name>$PROJ_DIR$\module1000.c</name> </file>