Разработка электроники,

Систем автоматики,

Программного обеспечения

ООО "Антех ПСБ",
Санкт-Петербург

+79811865082

anteh@bk.ru

ООО Антех ПСБ примеры

Увеличение частоты кварцевого резонатора, платы управления FDM 3D принтера, Arduino AtMega2560 с 16 до 24MHz

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), как на фотографии ниже:

увеличение частоты кварца arduino atmega2560 fdm 3d принтер замена smd комбинированного кварца на кварц лодочку и чип конденсаторы

На фото: низкая лодочка с напаянными проводами кварц 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

c:\[путь]>create_speed_lookuptable -f 27
#ifndef SPEED_LOOKUPTABLE_H
#define SPEED_LOOKUPTABLE_H

#include "Marlin.h"

const uint16_t speed_lookuptable_fast[256][2] PROGMEM = {
   {62500, 51613}, {10887, 4925}, {5962, 1857}, {4105, 975}, {3130, 601}, {2529, 407}, {2122, 294}, {1828, 223},
   {1605, 174}, {1431, 140}, {1291, 116}, {1175, 96}, {1079, 82}, {997, 70}, {927, 61}, {866, 53},
   {813, 47}, {766, 43}, {723, 37}, {686, 34}, {652, 31}, {621, 28}, {593, 26}, {567, 23},
   {544, 22}, {522, 20}, {502, 18}, {484, 17}, {467, 16}, {451, 15}, {436, 14}, {422, 13},
   {409, 13}, {396, 11}, {385, 11}, {374, 10}, {364, 10}, {354, 9}, {345, 9}, {336, 9},
   {327, 8}, {319, 7}, {312, 7}, {305, 7}, {298, 7}, {291, 6}, {285, 6}, {279, 6},
   {273, 6}, {267, 5}, {262, 5}, {257, 5}, {252, 5}, {247, 4}, {243, 5}, {238, 4},
   {234, 4}, {230, 4}, {226, 4}, {222, 4}, {218, 3}, {215, 4}, {211, 3}, {208, 3},
   {205, 3}, {202, 3}, {199, 3}, {196, 3}, {193, 3}, {190, 3}, {187, 2}, {185, 3},
   {182, 2}, {180, 3}, {177, 2}, {175, 3}, {172, 2}, {170, 2}, {168, 2}, {166, 2},
   {164, 2}, {162, 2}, {160, 2}, {158, 2}, {156, 2}, {154, 2}, {152, 1}, {151, 2},
   {149, 2}, {147, 1}, {146, 2}, {144, 2}, {142, 1}, {141, 2}, {139, 1}, {138, 1},
   {137, 2}, {135, 1}, {134, 2}, {132, 1}, {131, 1}, {130, 2}, {128, 1}, {127, 1},
   {126, 1}, {125, 1}, {124, 2}, {122, 1}, {121, 1}, {120, 1}, {119, 1}, {118, 1},
   {117, 1}, {116, 1}, {115, 1}, {114, 1}, {113, 1}, {112, 1}, {111, 1}, {110, 1},
   {109, 1}, {108, 1}, {107, 0}, {107, 1}, {106, 1}, {105, 1}, {104, 1}, {103, 1},
   {102, 0}, {102, 1}, {101, 1}, {100, 1}, {99, 1}, {98, 0}, {98, 1}, {97, 1},
   {96, 0}, {96, 1}, {95, 1}, {94, 0}, {94, 1}, {93, 1}, {92, 0}, {92, 1},
   {91, 1}, {90, 0}, {90, 1}, {89, 1}, {88, 0}, {88, 1}, {87, 0}, {87, 1},
   {86, 0}, {86, 1}, {85, 1}, {84, 0}, {84, 1}, {83, 0}, {83, 1}, {82, 0},
   {82, 1}, {81, 0}, {81, 1}, {80, 0}, {80, 1}, {79, 0}, {79, 1}, {78, 0},
   {78, 1}, {77, 0}, {77, 0}, {77, 1}, {76, 0}, {76, 1}, {75, 0}, {75, 1},
   {74, 0}, {74, 1}, {73, 0}, {73, 0}, {73, 1}, {72, 0}, {72, 1}, {71, 0},
   {71, 0}, {71, 1}, {70, 0}, {70, 0}, {70, 1}, {69, 0}, {69, 1}, {68, 0},
   {68, 0}, {68, 1}, {67, 0}, {67, 0}, {67, 1}, {66, 0}, {66, 0}, {66, 1},
   {65, 0}, {65, 0}, {65, 1}, {64, 0}, {64, 0}, {64, 1}, {63, 0}, {63, 0},
   {63, 0}, {63, 1}, {62, 0}, {62, 0}, {62, 1}, {61, 0}, {61, 0}, {61, 1},
   {60, 0}, {60, 0}, {60, 0}, {60, 1}, {59, 0}, {59, 0}, {59, 0}, {59, 1},
   {58, 0}, {58, 0}, {58, 0}, {58, 1}, {57, 0}, {57, 0}, {57, 0}, {57, 1},
   {56, 0}, {56, 0}, {56, 0}, {56, 1}, {55, 0}, {55, 0}, {55, 0}, {55, 1},
   {54, 0}, {54, 0}, {54, 0}, {54, 1}, {53, 0}, {53, 0}, {53, 0}, {53, 0},
   {53, 1}, {52, 0}, {52, 0}, {52, 0}, {52, 0}, {52, 1}, {51, 0}, {51, 0},
};

const uint16_t speed_lookuptable_slow[256][2] PROGMEM = {
   {62500, 8065}, {54435, 6221}, {48214, 4945}, {43269, 4025}, {39244, 3340}, {35904, 2816}, {33088, 2407}, {30681, 2080
},
   {28601, 1816}, {26785, 1599}, {25186, 1419}, {23767, 1267}, {22500, 1140}, {21360, 1029}, {20331, 935}, {19396, 853},

   {18543, 780}, {17763, 718}, {17045, 662}, {16383, 612}, {15771, 569}, {15202, 529}, {14673, 493}, {14180, 461},
   {13719, 432}, {13287, 406}, {12881, 381}, {12500, 360}, {12140, 340}, {11800, 321}, {11479, 304}, {11175, 288},
   {10887, 274}, {10613, 261}, {10352, 248}, {10104, 236}, {9868, 226}, {9642, 215}, {9427, 206}, {9221, 197},
   {9024, 189}, {8835, 182}, {8653, 174}, {8479, 167}, {8312, 160}, {8152, 155}, {7997, 149}, {7848, 143},
   {7705, 138}, {7567, 134}, {7433, 128}, {7305, 125}, {7180, 120}, {7060, 116}, {6944, 113}, {6831, 108},
   {6723, 106}, {6617, 102}, {6515, 99}, {6416, 96}, {6320, 94}, {6226, 90}, {6136, 88}, {6048, 86},
   {5962, 83}, {5879, 81}, {5798, 78}, {5720, 77}, {5643, 74}, {5569, 73}, {5496, 70}, {5426, 69},
   {5357, 68}, {5289, 65}, {5224, 64}, {5160, 62}, {5098, 61}, {5037, 60}, {4977, 58}, {4919, 56},
   {4863, 56}, {4807, 54}, {4753, 53}, {4700, 52}, {4648, 50}, {4598, 50}, {4548, 48}, {4500, 48},
   {4452, 46}, {4406, 46}, {4360, 45}, {4315, 43}, {4272, 43}, {4229, 42}, {4187, 41}, {4146, 41},
   {4105, 39}, {4066, 39}, {4027, 38}, {3989, 38}, {3951, 36}, {3915, 36}, {3879, 36}, {3843, 34},
   {3809, 34}, {3775, 34}, {3741, 33}, {3708, 32}, {3676, 32}, {3644, 31}, {3613, 31}, {3582, 30},
   {3552, 30}, {3522, 29}, {3493, 28}, {3465, 29}, {3436, 27}, {3409, 28}, {3381, 27}, {3354, 26},
   {3328, 26}, {3302, 26}, {3276, 25}, {3251, 25}, {3226, 24}, {3202, 25}, {3177, 23}, {3154, 24},
   {3130, 23}, {3107, 22}, {3085, 23}, {3062, 22}, {3040, 22}, {3018, 21}, {2997, 21}, {2976, 21},
   {2955, 21}, {2934, 20}, {2914, 20}, {2894, 20}, {2874, 19}, {2855, 19}, {2836, 19}, {2817, 19},
   {2798, 18}, {2780, 19}, {2761, 18}, {2743, 17}, {2726, 18}, {2708, 17}, {2691, 17}, {2674, 17},
   {2657, 17}, {2640, 16}, {2624, 16}, {2608, 16}, {2592, 16}, {2576, 16}, {2560, 15}, {2545, 16},
   {2529, 15}, {2514, 14}, {2500, 15}, {2485, 15}, {2470, 14}, {2456, 14}, {2442, 14}, {2428, 14},
   {2414, 14}, {2400, 14}, {2386, 13}, {2373, 13}, {2360, 13}, {2347, 13}, {2334, 13}, {2321, 13},
   {2308, 13}, {2295, 12}, {2283, 12}, {2271, 12}, {2259, 12}, {2247, 12}, {2235, 12}, {2223, 12},
   {2211, 11}, {2200, 12}, {2188, 11}, {2177, 11}, {2166, 11}, {2155, 11}, {2144, 11}, {2133, 11},
   {2122, 10}, {2112, 11}, {2101, 10}, {2091, 11}, {2080, 10}, {2070, 10}, {2060, 10}, {2050, 10},
   {2040, 10}, {2030, 10}, {2020, 9}, {2011, 10}, {2001, 9}, {1992, 10}, {1982, 9}, {1973, 9},
   {1964, 9}, {1955, 9}, {1946, 9}, {1937, 9}, {1928, 9}, {1919, 8}, {1911, 9}, {1902, 9},
   {1893, 8}, {1885, 8}, {1877, 9}, {1868, 8}, {1860, 8}, {1852, 8}, {1844, 8}, {1836, 8},
   {1828, 8}, {1820, 8}, {1812, 8}, {1804, 7}, {1797, 8}, {1789, 8}, {1781, 7}, {1774, 7},
   {1767, 8}, {1759, 7}, {1752, 7}, {1745, 8}, {1737, 7}, {1730, 7}, {1723, 7}, {1716, 7},
   {1709, 7}, {1702, 7}, {1695, 6}, {1689, 7}, {1682, 7}, {1675, 6}, {1669, 7}, {1662, 6},
   {1656, 7}, {1649, 6}, {1643, 7}, {1636, 6}, {1630, 6}, {1624, 7}, {1617, 6}, {1611, 6},
};

#endif

В скрипте у --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 вылетает ошибка:

avrdude: verification error, first mismatch at byte 0x046c
         0x23 != 0x63
avrdude: verification error; content mismatch
avrdude: verification error; content mismatch
Ещё
avrdude: verification error, first mismatch at byte 0x146c
         0x3d != 0x7d
avrdude: verification error; content mismatch
avrdude: verification error; content mismatch

Так было несколько раз. Но прошивка залита, по крайней мере pronterface работает.
Есть проблемы с USB USART преобразователем, реализованном на AtMega16U2, точнее код не отлажен для работы с разными кварцами, но никто ничего и не обещал. Посредством STK500 программатора, через ISP залита Arduino-usbserial-atmega16u2-Mega2560-Rev3.hex. И при заливке прошивки снова:

avrdude: verification error, first mismatch at byte 0x146c
         0x3d != 0x7d
avrdude: verification error; content mismatch
avrdude: verification error; content mismatch

Не помогло, ошибка появляется. Но прошивка 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 и снова мимо:

avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_getsync(): timeout communicating with programmer
Произошла ошибка при загрузке скетча

Согласно boards.txt передача данных с компьютера на AtMega16U2 происходит на 115200, с AtMega16U2 на AtMega2560 на 57600(по факту 58823). Предыдущие прошивки AtMega16U2 и AtMega2560 установили частоту USART обмена между собой на 62500, логично предположить, что скорость передачи данных с компьютера на AtMega16U2 нужно изменить на 125000. Меняем запускаем:

avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: verification error, first mismatch at byte 0x146c
         0x3d != 0x7d
avrdude: verification error; content mismatch
avrdude: verification error; content mismatch

Прошивка загрузилась, pronterface работает.
Следующие 3 раза прошивка не загружалась.
После того, как был убран крокодил минуса осциллографа с земли ISP разъёма AtMega16U2 всё стало быстро загружаться, но наблюдались ошибки:

avrdude: verification error, first mismatch at byte 0x146c
         0x3d != 0x7d
avrdude: verification error; content mismatch
avrdude: verification error; content mismatch

После пере подключения USB снова не загружается

avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_getsync(): timeout communicating with programmer
Произошла ошибка при загрузке скетча

После пере подключения и нажатия reset на плате загрузка пошла:

avrdude: verification error, first mismatch at byte 0x146c
         0x3d != 0x7d
avrdude: verification error; content mismatch
avrdude: verification error; content mismatch

Все загрузилось.

Пробуем снизить "волшебную" универсальную частоту 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. Проверяем:

avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: verification error, first mismatch at byte 0x146c
         0x3d != 0x7d
avrdude: verification error; content mismatch
avrdude: verification error; content mismatch

Ситуация та же, но всё как и ранее загрузилось. Нажимаем reset и снова производим загрузку:

avrdude: verification error, first mismatch at byte 0x146c
         0x3d != 0x7d
avrdude: verification error; content mismatch
avrdude: verification error; content mismatch

После пере подключения всего и попытке загрузки в уже прошитую AtMega2560 снова:

avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_getsync(): timeout communicating with programmer
Произошла ошибка при загрузке скетча

Нажимаем reset, загрузка и всё ОК:

avrdude: verification error, first mismatch at byte 0x146c
         0x3d != 0x7d
avrdude: verification error; content mismatch
avrdude: verification error; content mismatch

Пробуем 27MHz

Для прошивки 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. Проверяем:

avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_getsync(): timeout communicating with programmer
Произошла ошибка при загрузке скетча

Ни в какую работать не хочет.

Можно использовать и 25MHz кварц, но, на всякий случай ищем тот, с которым не будет ошибок. По хорошему нужно с прошивкой разбираться. Лучшим вариантом будет использование вместо AtMega16U2 аппаратного преобразователя USB в USART, микросхема CP2104. Поддерживается всеми операционными системами, надёжен, проверен, доступен, не требует прошивки. Но в QFN корпусе.

Пробуем кварц 24MHz

Кварца 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
Проверяем:

avrdude: verification error, first mismatch at byte 0x266c
         0xa0 != 0xe0
avrdude: verification error; content mismatch
avrdude: verification error; content mismatch

Всё работает. Но непонятная ошибка осталась. Значение ошибки зависит от частоты кварца. На 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 принтером. Ниже фото стенда проверки работы с аппаратным преобразователем:

arduino atmega2560 cp2104 atmega2560 cp2104 wire

Fuse по умолчанию для AtMega2560
atmega2560 fuses arduino

Fuse по умолчанию для AtMega16U2 arduino atmega16u2 fuse

Arduino AtMega2560 кварц 24MHz + Marlin. Краткая инструкция

Повторюсь, 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, заливаем прошивку. На ошибки, после заливки не обращаем внимания.
Всё будет работать штатно.

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

Copyright ©Новиков Алексей Александрович,

2023 Санкт-Петербург, 197372, ООО "Антех ПСБ",

anteh собака bk.ru