Разработка электроники,
Систем автоматики,
Программного обеспечения
ООО "Антех ПСБ",
Санкт-Петербург
+79811865082
anteh@bk.ru
29.11.2016 Сайт https://anteh.ru
Помня золотое правило "работает НЕ трожь", каждый сам принимает решение о необходимости описанной доработки. Автор статьи и сайт не несут никакой ответственности за полученный Вами результат.
Описаны практически все аппаратные проблемы с решениями и нюансы, с которыми можно столкнуться при смене кварца Arduino AtMega2560.
На текущий момент не было реальной проверки самой печати, результат может быть разный. Информация добавляется по ходу процесса, лишнего будет многовато, пока всё не утрясётся.
В процессе испытаний получилось, что применение кварца в 24MHz для 3D принтера с marlin прошивкой нецелесообразно. То что меню перестало заедать это хорошо, но никаких других преимуществ пока не обнаружено. Разве возможность увеличить частоту STEP импульсов, но придётся marlin исходник дорабатывать, а это к его разработчикам. Помимо этого, с 24MHz кварцем наблюдается подёргивание кареток при движении эффектора вниз в начале печати и при печати в целом, проявляется в движении рывками осей, но пропусков нет. В целом вроде удовлетворительно, но когда вернул 16MHz стало лучше. Нижний абзац, с описанием проблемы при питании драйверов напряжением более 26VDC при 16MHz не актуален. Интересующиеся могут попробовать 20MHz. Можно предположить, что чтобы не было проблем с 24MHz кварцем, то нужно произвести какие-либо настройки marlin прошивки.
При питании A4988 27VDC и частоте тактирования Mega2560 в 24MHz ход трёх кареток по вертикали дельта принтера происходит прерывисто, скорость движения то замедляется то ускоряется такое наблюдалось при Vref=900mV, при Vref=700mV такого уже не наблюдается. При Vref=300mV были проблемы, не работало. При Vref=400mV оси тихо и плавно пошли но при отработке команды "autohome" в верхней точке одна из осей начала "хрипеть" так же, как ранее при 300mV все оси. При Vref=600mV снова небольшие ускорения и замедления, при движении осей по вертикали. Волнами идёт. При Vref=500mV опять волнами, до этого было всё в порядке. И тут обратил внимание на величину сетевого напряжения она =241VAC, в розетке 241(12ночи) и т.к. стабилизатора напряжения нет, то на драйвера приходит 29.5VDC и похоже это перебор. Нужен стабилизатор переменного сетевого напряжения и бесперебойник. Принтер запитан от стабилизатора 225VAC получено напряжение питания 27.8VDC на драйверах. Выставлен Vref=900mV прерывистость наблюдалась в меньшей степени. Неделей ранее, при испытаниях принтера с повышенным напряжением проблем не было, возможно сетевое напряжение было меньше. В разрыв +27VDC питания шаговых двигателей ставим пару диодов. Итог такой: в розетке 222VAC питание драйверов 25.8V Vref=900mV драйвера A4988 и вопрос решён всё работает как надо без "дерготни", проблема была в "передозировке" напряжения у A4988 при тактировании AtMega2560 от 24Mhz кварца. Вывод: предельное напряжение питания для A4988 не должно превышать 26VDC, иначе оси начнут двигаться прерывисто. Как оказалось, это было связано с использованием 24MHz кварца AtMega2560, на 16MHz проблемы нет.
Было предположение, что напряжение питания шаговых двигателей как-то повлияет на шумность. При плавном изменении, через латр, напряжения с 12 до 29VDC, во время печати, каких либо заметных на слух изменений замечено не было.
Если сразу к делу, то в конце краткая подробная инструкция
Есть проблема подвисания управления пластиковым FDM 3D принтером во время печати, не хватает производительности контроллера. Возможно, повлияет на качество печати и позволит увеличить параметр DELTA_SEGMENTS_PER_SECOND 200. Решено поднять частоту кварца и посмотреть, какие преимущества или проблемы это даст. При напряжении питания контроллера atmega 5VDC, для увеличения частоты тактирования, без использования генератора частот, можно просто заменить кварц на более высокочастотный. 27MHz будет работать без проблем, у кого-то и 32 может заработать. Для первого эксперимента решено использовать 20MHz.
На плате Arduino mega2560 для тактирования USB преобразователя на AtMega16u2 используется кварц "низкая лодочка" 16MHz, для тактирования контроллера AtMega2560 используется 16MHz SMD кварц CSTCE16M0V53-R0. Кварц не удобный для замены. Отпаиваем миниатюрный SMD кварц со встроенными конденсаторами и рядом, на термоклей, ставим 20MHz кварц, напаиваем конденсаторы 12pf 0603 и 2 провода от кварца до конденсаторов(центральный вывод smd кварца -GND), как на фотографии ниже:
![]() | ![]() |
На фото: низкая лодочка с напаянными проводами кварц 20MHz, в синей термоусадке 27MHz.
После замены/перепайки кварца, в Arduino IDE нужно указать новую частоту кварца. Идём в С:\arduino-1.6.13\hardware\arduino\avr\boards.txt и меняем параметр mega.build.f_cpu=16000000L на mega.build.f_cpu=20000000L. Этот параметр задаёт значение F_CPU используемое в прошивке marlin. Сохраняем файл.
Оригинальный загрузчик stk500boot_v2_mega2560.hex копируем с переименованием в stk500boot_v2_mega2560_20MHz.hex и редактируем в ручную UBRR0L в .hex файле. Boot загрузчик работает через USART0. U2X0=1 настроено удвоение частоты(было заблуждением, хоть согласно .hex файлу стоит удвоение, возможно при работе бут загрузчика удвоение отключается). UBRR0L = 0x10(частота 115200) при частоте кварца 16MHz и удвоении частоты, это было заблуждением. Т.е. нужно искать регистр, в который загружается 0x10 и затем регистр отправляется в 0xC4(UBRR0L). С помощью AVR Studio был открыт stk500boot_v2_mega2560.hex, полностью дизассемблировать не удалось, было около 30 нераспознанных команд "Data or unknown opcode". Найден предположительный участок кода загрузки в r24 константы 0x10 и отправки её в UBRR0L. В hex ищем участок кода, где E180 и E188 расположены рядом, точнее 80E1 и 88E1. Здесь интересует 80E1(E180) -это ldi r24, 0x10 формат (E180)1110kkkkddddkkkk. Т.е. 80E1 нужно изменить на 85E1 и это будет соответствовать частоте загрузчика115200 на 20MHz при удвоении частоты. Не забываем про чек сумму, она поменяется с 0xA4 на 0x9F. Чек сумма у каждой строки своя и подсчитывается начиная от байта после двоеточия до предпоследнего байта строки включительно. Загрузчик работает только на 115200(это было заблуждение), поэтому hex нужно править под частоту кварца AtMega2560. Заливаем загрузчик в AtMega2560 по ISP, например, через STK500. И … ничего не вышло.
Вернул всё в исходное. Осциллограф показал частоту USART0 AtMega2560 =17us или 58823 герца ближайшая стандартная 57600. То, что включено удвоение частоты также было непроверенным предположением. Реально удвоение частоты USART0 отключено, по крайней мере при работе бут загрузчика. По факту имеем, что с прошивкой stk500boot_v2_mega2560.hex бут загрузчик AtMega2560 обменивается с USB USART преобразователем на частоте 58823(измерено по периоду бита). Точнее на TxD выводе 9 PD3 AtMega16U2 и TxD выводе USART0 AtMega2560 присутствует частота 58823 герца при использовании одинаковых 16MHz кварцев. Важно, что ориентироваться нужно на эту частоту. Согласно документации, этой частоте соответствует UBRR0L=16=0x10 если не включено удвоение частоты. Для 20MHz UBRR0L=0x14 или нужно 80E1(E180 ldi r24, 0x10) заменить на 84E1 (E184 ldi r24, 0x14). Правим чек сумму на A0. Прошиваем… и ура заработало. Ошибок IDE, при прошивке не выдало. Частота TxD AtMega2560, у которой 16MHz кварц был заменён на 20MHz, по показаниям осциллографа(на глаз измерялся период бита) составила примерно 16.9us или 59172герца, по расчётам 59524. Отклонение частот TxD AtMega16U2 и TxD AtMega2560 находится в рамках допустимых 10%.
Пробуем поработать с pronterface. Проблем не возникло, всё стандартно, частота обмена с pronterface та же 250000 герц.
Пробуем кварц 27MHz "CPM 27.000 C-20"это полноразмерная лодочка, на фото выше в синей термоусадке. UBRRL = 27000000/(16*58823)-1 = 28 = 0x1C, 80E1(E180 ldi r24, 0x10) заменяем на 8CE1 (E18C ldi r24, 0x1C), чек сумма 98. Расчётная частота 58190герц, отклонение от 58823 = 663герца. В boards.txt поправляем mega.build.f_cpu=27000000L.
Не заработало. Решить нужно 2 проблемы:
1. Не заработал USART обмен, не смотря, что отклонения в частотах не превышало 10%.
2. Возникла проблема с отсутствием таблицы speed_lookuptable_fast для частоты 27MHz, для каждой частоты кварца эта таблица должна быть своей. Штатно предусмотрено 2 таблицы, для 16 и 20 MHz.
Первая решается подбором кварца и выбором частоты USART, вторая с помощью скрипта create_speed_lookuptable.py размещённого на GitHub. Считаем, что python установлен, запускаем скрипт для частоты 27MHz. Например из командной строки, через cmd: <путь>\create_speed_lookuptable -f 27 -d 8
|
В скрипте у --cpu-freq заменён тип int на float, чтобы использовать дробные значения частот кварца "-f', '--cpu-freq', type=float". Но большой практической необходимости в этом нет.
Для кварца 27MHz расхождение в частотах обмена составило 58823-58190=663герца. По стандарту частота может отклоняться на 10%. Есть некое интернет мнение на счёт отклонения в 3%. Для 20MHz разница была в 58823-59524 = 701. Не клеится.
Пробуем кварц 25MHz. UBRRL = 25000000/(16*58823)-1 = 25.56. Для UBRRL = 26 частота = 57870герц. Прошивка через загрузчик заливаться начала, но через секунд 20 вылетает ошибка:
|
Так было несколько раз. Но прошивка залита, по крайней мере pronterface работает.
Есть проблемы с USB USART преобразователем, реализованном на AtMega16U2, точнее код не отлажен для работы с разными кварцами, но никто ничего и не обещал. Посредством STK500 программатора, через ISP залита Arduino-usbserial-atmega16u2-Mega2560-Rev3.hex. И при заливке прошивки снова:
|
Не помогло, ошибка появляется. Но прошивка 3D принтера скорее всего залита, pronterface работает.
Возможно лучшее решение использовать другой USB USART преобразователь, например на CP2104. Можно попробовать использовать одинаковые кварцы на AtMega16U2 и AtMega2560. Пробуем подправить прошивку Arduino-usbserial-atmega16u2-Mega2560-Rev3.hex для использования другого кварца, а именно 25MHz вместо 16MHz. По тому же самому принципу, подправлял hex. В Arduino-usbserial-atmega16u2-Mega2560-Rev3.hex ищем:
F419 BRNE PC+0x04 Branch if not equal
E120 LDI R18,0x10 Load immediate
E030 LDI R19,0x00 Load immediate
Или ищем 19F420E130E0 и 20E1 исправляем на 2AE1 чек сумма 2C. Загружаем получившийся .hex в AtMega16U2 по ISP STK500 и… не нашёл второго кварца на 25MHz. Переделываем всё на 27MHz. Но оказалось, что для тактирования USB 48MHz подойдёт только 16MHz кварц.
Можно попробовать найти "волшебную" универсальную частоту USART, которая будет одинаковой или максимально близкой для AtMega16U2 и AtMega2560, ниже представлена таблица, помогающая произвести подобный поиск:
UBRRL | 16MHz | 20MHz | 24MHz | 22MHz | 25MHz | 27MHz |
0 | 1000000 | 1250000 | 1500000 | 1375000 | 1562500 | 1687500 |
1 | 500000 | 625000 | 750000 | 687500 | 781250 | 843750 |
2 | 333333,3333 | 416666,6667 | 500000 | 458333,3333 | 520833,3333 | 562500 |
3 | 250000 | 312500 | 375000 | 343750 | 390625 | 421875 |
4 | 200000 | 250000 | 300000 | 275000 | 312500 | 337500 |
5 | 166666,6667 | 208333,3333 | 250000 | 229166,6667 | 260416,6667 | 281250 |
6 | 142857,1429 | 178571,4286 | 214285,7143 | 196428,5714 | 223214,2857 | 241071,4286 |
7 | 125000 | 156250 | 187500 | 171875 | 195312,5 | 210937,5 |
8 | 111111,1111 | 138888,8889 | 166666,6667 | 152777,7778 | 173611,1111 | 187500 |
9 | 100000 | 125000 | 150000 | 137500 | 156250 | 168750 |
10 | 90909,09091 | 113636,3636 | 136363,6364 | 125000 | 142045,4545 | 153409,0909 |
11 | 83333,33333 | 104166,6667 | 125000 | 114583,3333 | 130208,3333 | 140625 |
12 | 76923,07692 | 96153,84615 | 115384,6154 | 105769,2308 | 120192,3077 | 129807,6923 |
13 | 71428,57143 | 89285,71429 | 107142,8571 | 98214,28571 | 111607,1429 | 120535,7143 |
14 | 66666,66667 | 83333,33333 | 100000 | 91666,66667 | 104166,6667 | 112500 |
15 | 62500 | 78125 | 93750 | 85937,5 | 97656,25 | 105468,75 |
16 | 58823,52941 | 73529,41176 | 88235,29412 | 80882,35294 | 91911,76471 | 99264,70588 |
17 | 55555,55556 | 69444,44444 | 83333,33333 | 76388,88889 | 86805,55556 | 93750 |
18 | 52631,57895 | 65789,47368 | 78947,36842 | 72368,42105 | 82236,84211 | 88815,78947 |
19 | 50000 | 62500 | 75000 | 68750 | 78125 | 84375 |
20 | 47619,04762 | 59523,80952 | 71428,57143 | 65476,19048 | 74404,7619 | 80357,14286 |
21 | 45454,54545 | 56818,18182 | 68181,81818 | 62500 | 71022,72727 | 76704,54545 |
22 | 43478,26087 | 54347,82609 | 65217,3913 | 59782,6087 | 67934,78261 | 73369,56522 |
23 | 41666,66667 | 52083,33333 | 62500 | 57291,66667 | 65104,16667 | 70312,5 |
24 | 40000 | 50000 | 60000 | 55000 | 62500 | 67500 |
25 | 38461,53846 | 48076,92308 | 57692,30769 | 52884,61538 | 60096,15385 | 64903,84615 |
26 | 37037,03704 | 46296,2963 | 55555,55556 | 50925,92593 | 57870,37037 | 62500 |
27 | 35714,28571 | 44642,85714 | 53571,42857 | 49107,14286 | 55803,57143 | 60267,85714 |
28 | 34482,75862 | 43103,44828 | 51724,13793 | 47413,7931 | 53879,31034 | 58189,65517 |
29 | 33333,33333 | 41666,66667 | 50000 | 45833,33333 | 52083,33333 | 56250 |
30 | 32258,06452 | 40322,58065 | 48387,09677 | 44354,83871 | 50403,22581 | 54435,48387 |
31 | 31250 | 39062,5 | 46875 | 42968,75 | 48828,125 | 52734,375 |
32 | 30303,0303 | 37878,78788 | 45454,54545 | 41666,66667 | 47348,48485 | 51136,36364 |
33 | 29411,76471 | 36764,70588 | 44117,64706 | 40441,17647 | 45955,88235 | 49632,35294 |
34 | 28571,42857 | 35714,28571 | 42857,14286 | 39285,71429 | 44642,85714 | 48214,28571 |
35 | 27777,77778 | 34722,22222 | 41666,66667 | 38194,44444 | 43402,77778 | 46875 |
36 | 27027,02703 | 33783,78378 | 40540,54054 | 37162,16216 | 42229,72973 | 45608,10811 |
37 | 26315,78947 | 32894,73684 | 39473,68421 | 36184,21053 | 41118,42105 | 44407,89474 |
38 | 25641,02564 | 32051,28205 | 38461,53846 | 35256,41026 | 40064,10256 | 43269,23077 |
39 | 25000 | 31250 | 37500 | 34375 | 39062,5 | 42187,5 |
40 | 24390,2439 | 30487,80488 | 36585,36585 | 33536,58537 | 38109,7561 | 41158,53659 |
41 | 23809,52381 | 29761,90476 | 35714,28571 | 32738,09524 | 37202,38095 | 40178,57143 |
42 | 23255,81395 | 29069,76744 | 34883,72093 | 31976,74419 | 36337,2093 | 39244,18605 |
Бросается в глаза цифра 62500 и она действительно "волшебная". Теперь можно полностью исключить из пазла проблему несогласованности частот.
Краткое резюме. AtMega16U2 должна работать только с кварцем 16MHz с частотой USART 62500 UBRRL=15. AtMega2560 может работать с разными кварцами обеспечивающими частоту USART ровно 62500, таких кварцев много.
Для прошивки Arduino-usbserial-atmega16u2-Mega2560-Rev3_16MHz_62500.hex задаём частоту USART 62500. Ищем 19F420E130E0 и 20E1 исправляем на 2FE0 чек сумма 28.
Для stk500boot_v2_mega2560_25MHz_62500.hex задаём ту же частоту 62500. Ищем C00080E18093C40088E18093 и 80E1 меняем на 88E1 чек сумма 9С. Прошиваем обе микросхемы, запускаем заливку прошивки с компьютера через USB и снова мимо:
|
Согласно boards.txt передача данных с компьютера на AtMega16U2 происходит на 115200, с AtMega16U2 на AtMega2560 на 57600(по факту 58823). Предыдущие прошивки AtMega16U2 и AtMega2560 установили частоту USART обмена между собой на 62500, логично предположить, что скорость передачи данных с компьютера на AtMega16U2 нужно изменить на 125000. Меняем запускаем:
|
Прошивка загрузилась, pronterface работает.
Следующие 3 раза прошивка не загружалась.
После того, как был убран крокодил минуса осциллографа с земли ISP разъёма AtMega16U2 всё стало быстро загружаться, но наблюдались ошибки:
|
После пере подключения USB снова не загружается
|
После пере подключения и нажатия reset на плате загрузка пошла:
|
Все загрузилось.
Пробуем снизить "волшебную" универсальную частоту 62500 до 31250 также универсальная для разных кварцев:
Для прошивки Arduino-usbserial-atmega16u2-Mega2560-Rev3_16MHz_31250.hex задаём частоту USART 31250. Ищем 19F420E130E0 и 20E1 исправляем на 2FE1 чек сумма 27.
Для stk500boot_v2_mega2560_25MHz_31250.hex задаём ту же частоту 31250. Ищем C00080E18093C40088E18093 и 80E1 меняем на 81E3 чек сумма A1. Прошиваем, устанавливаем mega.menu.cpu.atmega2560.upload.speed=62500. Проверяем:
|
Ситуация та же, но всё как и ранее загрузилось. Нажимаем reset и снова производим загрузку:
|
После пере подключения всего и попытке загрузки в уже прошитую AtMega2560 снова:
|
Нажимаем reset, загрузка и всё ОК:
|
Для прошивки Arduino-usbserial-atmega16u2-Mega2560-Rev3_16MHz_31250.hex задаём частоту USART 31250. Ищем 19F420E130E0 и 20E1 исправляем на 2FE1 чек сумма 27.
Для stk500boot_v2_mega2560_27MHz_31250.hex задаём ту же частоту 31250. Ищем C00080E18093C40088E18093 и 80E1 меняем на 85E3 чек сумма 9D. Прошиваем, устанавливаем mega.menu.cpu.atmega2560.upload.speed=62500. Проверяем:
|
Ни в какую работать не хочет.
Можно использовать и 25MHz кварц, но, на всякий случай ищем тот, с которым не будет ошибок. По хорошему нужно с прошивкой разбираться. Лучшим вариантом будет использование вместо AtMega16U2 аппаратного преобразователя USB в USART, микросхема CP2104. Поддерживается всеми операционными системами, надёжен, проверен, доступен, не требует прошивки. Но в QFN корпусе.
Кварца 24MHz не оказалось, был кварцевый генератор.
Для прошивки Arduino-usbserial-atmega16u2-Mega2560-Rev3_16MHz_31250.hex задаём частоту USART 31250. Ищем 19F420E130E0 и 20E1 исправляем на 2FE1 чек сумма 27.
Для stk500boot_v2_mega2560_24MHz_31250.hex задаём ту же частоту 31250. Ищем C00080E18093C40088E18093 и 80E1 меняем на 8FE2 чек сумма 94. Прошиваем, устанавливаем mega.build.f_cpu=24000000L и mega.menu.cpu.atmega2560.upload.speed=62500. Создаём таблицы speed_lookuptable_ для 24MHz
Проверяем:
|
Всё работает. Но непонятная ошибка осталась. Значение ошибки зависит от частоты кварца. На 24MHz загрузка происходит всегда и без задержек в начале загрузки. Но это не означает, что AtMega2650 не будет работать на 27MHz.
Остановился на 24MHz c 31250герц скоростью обмена между 16U2 и 2560. Можно частоту увеличить до 62500. Разницы между 31250 и 62500 не заметно, разве на 31250 прошивка длится в 2 раза дольше.
Пробовал AtMega16U2 менять на аппаратный преобразователь USB в USART на базе CP2104, чтобы исключить необходимость дополнительной доработки прошивок при работе с разными кварцами. На время эксперимента AtMega16U2 снималась с платы. Фокус удался частично. Передача данных от компьютера(pronterface) в Arduino не идёт, но приём идёт. Если нажать на reset кнопку Arduino, то в pronterface выдаются все сообщения как при подключении и устанавливается соединение. Если плата Arduino AtMega2560 не подключена к принтеру, то она на команды не реагирует. Т.е. всё должно работать, но для установления связи по USB с компьютером(pronterface) нужно нажимать reset на плате Arduino AtMega2560. Решено на этом закругляться. Выбрал кварц 24MHz со штатным загрузчиком. Но если кому интересно, то через аппаратный преобразователь можно 27MHz и более кварц повесить, с возможностью работы через pronterface с 3D принтером. Ниже фото стенда проверки работы с аппаратным преобразователем:
![]() | ![]() |
Fuse по умолчанию для AtMega2560
Fuse по умолчанию для AtMega16U2
Повторюсь, 24MHz кварц использовать нецелесообразно, появляются прерывистые движения кареток, связано, скорее, с не равномерным натяжением ремней. На низких скоростях печати, на определённом токе и напряжении питания драйверов менее 26VDC прерывистое движение не наблюдается. Проблема прерывистого движения может быть и в драйверах. Пока особых преимуществ использования 24MHz кварца не обнаружилось. Использование более высокой частоты тактирования должно убрать тормоза управления принтером во время печати и позводит добавить второй хотэнд для дельта принтера. Пока единственное преимущество 24MHz -перестало меню жутко тормозить во время печати. Разбираться с прерывистым движением планирую через использование промышленных драйверов, возможно попробую поставить ШВП.
Как описывалось в начале статьи производим замену smd кварца на "лодочку" 24MHz с дополнительной установкой чип конденсаторов 12-15pf. Если удастся найти, то можно установить кварц такого же типа. Не принципиально какого типа резонатор, самому пришлось кварцевый генератор на 24MHz ставить, под рукой не оказалось кварца на эту частоту, да так и оставил.
Редактируем файл Arduino IDE С:\arduino-1.6.13\hardware\arduino\avr\boards.txt меняем 2 параметра "mega.build.f_cpu=24000000L" -Частота кварца AtMega2560 и "mega.menu.cpu.atmega2560.upload.speed=62500" -Частота USART обмена между USB и AtMega16U2.
Корректируем файл "speed_lookuptable.h" marlin проекта или копируем с заменой предлагаемый, содержит частоты 24, 25, 27MHz, к уже имеющимся 16 и 20MHz.
Прошиваем AtMega16U2 и AtMega2560 прошивками бут загрузчиков Arduino-usbserial-atmega16u2-Mega2560-Rev3_16MHz_31250.hex и stk500boot_v2_mega2560_24MHz_31250.hex соответственно.
Запускаем проект в Arduino IDE, заливаем прошивку. На ошибки, после заливки не обращаем внимания.
Всё будет работать штатно.
Если говорить в целом, то "гнать" контроллеры не хорошо. Для личного пользования, исследования, развлечения, пожалуйста, но в областях связанных с промышленной автоматизацией, медицинских применениях и других областях, влияющих на безопасность жизнедеятельности человека, ни в коем случае.