Как стать автором
Обновить

Зачем Программисту Микроконтроллеров Диофантовы Уравнения

Уровень сложностиПростой
Время на прочтение4 мин
Количество просмотров12K
Всего голосов 21: ↑20 и ↓1+23
Комментарии60

Комментарии 60

Ничего не понятно, но очень интересно

Да что тут может быть не понятно?
Надо настроить электрическую цепочку (PLL) которая выдает на выходе мегагерцовую частоту .

Есть три ручки N M и F.

Надо прописать нужные циферки (натуральные числа ) и всё заработает само.

Есть три ручки N M и F.

Надо прописать нужные циферки (натуральные числа ) и всё заработает само.

Ну так какие N, M и F у вас получились? Несколько страниц разговоров, куча кода, какие-то картинки а ответ-то где - три int N, M и F, эти самые нужные циферки ?

На скриншоте решения показаны.

Там много чего показано, вам уже в первом комменте сказали, что ничего не понятно. Напишите здесь в комментах эти три значения N, M и F , plz, всего три числа, ведь это ваш код и ваши скриншоты, извлечь оттуда эти три числа не должно быть слишком утомительно.

Вот эти решения:

1: MS:1, NS:100, FR:8
2: MS:2, NS:200, FR:8
3: MS:3, NS:300, FR:8
4: MS:4, NS:400, FR:8

В условиях N M и F, а не MS, NS, FR.

Ну ладно, просто здравый смысл без вольфрамов и диафантов интересуется, если у вас такое узкое окно перед постскэйлером F от 500 MHz до 1200 MHz, почти двойка, то в ответе почти всегда будет только одно значение F, очень изредка 2 значения F. Зачем нужно тащить внутрь самого внутреннего цикла многократное возведение в степень двойки? Просто посчитайте этот постскэйлер и забудьте про степени.

Дальше, посчитали постскэйлер, запустили цикл от 1 до 15 по M. Зачем, о джизус, внутри этого цикла цикл от 31 до 500 по N? Просто выходную частоту 100 MHz умноженную уже известный постскэйлер F делите на (входную частоту, деленную на M). Будет возможно нецелый результат от деления, берете ближайшее целое для N.

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

Все бы ничего, но зачем это все осчитывать в контроллере? Кварц ведь никто на ходу не перепаивает. Соответственно - все конфиги заранее известны и считаются 1 раз. Нафига козе баян?

Кварц ведь никто на ходу не перепаивает.

Кварц не перепаивают, а вот PLL перенастроить и прописать в NVRAM новый конфиг - это запросто.

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

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

...а для повышения точности системной частоты...

Влепить RC-генератор, затем калибровать его к температуре (а есть датчик?) - ради чего? Чтобы сэкономить на кварце? Рука-лицо.

Зато на хабре статью можно будет написать.

Иногда кварц просто не предусмотрен: у многих малоногих МК вход и выход под кварц не разварены на ноги корпуса. Иногда надо, чтобы генератор запускался предельно быстро, за несколько тактов, а это может только RC. Иногда - надо обеспечить живучесть при ударах и перегрузках, с чем у кварцев плохо.

Абсолютно так. У меня где-то валяется недорисованный проект кухонного таймера на кучу каналов, в основе которого — тинька без кварца, и вот там я закладывал регулярное измерение температуры (кухня же!) и коррекцию того, сколько тактов в секунде.

Там вообще всё предельно ужато было по ногам, чтобы показывать минуты и обрабатывать достаточно удобные кнопки.

Например ради компактности. Установка кварца требует площадь на плате, сравнимую с площадью микроконтроллеров в самых компактных корпусах WLCSP18(1,8х2,1 мм) или WLCSP25 (2,3х2,5 мм). А ещё кварцевый генератор больше потребляет и требует использования 2 выводов микроконтроллера, что может в некоторых случаях потребовать взять больший корпус. А датчик температуры встроен во многие микроконтроллеры, например в большинство STM32.

Могут ещё быть случаи, когда нужно настроить частоту тактирования периферии на заранее неизвестное значение, причём делители частоты периферии не позволяют сделать это с нужной точностью. Например, если нужно принять данные по UART на частоте, близкой к предельной. Часто в этом случае делитель частоты для UART позволяет установить только некоторые фиксированные бодрейты, зато с помощью системного PLL можно даже выполнить сканирование диапазона бодрейтов для автоподбора.

В моей практике такое чЮдесное сканирование на похожей PLL (в асике) как-то сделали программисты. Перебирали прям в драйвере ну вообще все варианты N M R и выбирали самый идеально подходящий по частоте. Вот только выходная частота была пикселклоком, точнее его удесятерённой версией. И шла на тактирование HDMI. По несчастливой случайности, референсная частота на PLLке оказалась очень низкой (единицы килогерц) и потому хоть лок и не терялся, частота всё равно плавала настолько, что уже монитор периодически терял синхронизацию (гасла картинка на несколько секунд). После разбора полётов и выводов всё стало нормально: и референсная частота разумная, и точность пикселклока +-0.5 МГц. Это я к чему -- к тому что вот так слепо перебирать все N M F и выбирать наилучший матч к требуемой частоте может быть чревато.

Ну, я бы, наверное, не делал перебор параметров в драйвере, а сделал бы таблицу параметров во флеше с нужным шагом частоты, а в драйвере сделал бы поиск по ней, и автоподстройку. Но таблицу, конечно, тоже генерил бы программно, проверяя, что получается и автоматически и вручную.

В линуксовом драйвере они могли себе позволить :)

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

Я бы ещё добавил про то, что частота после каждой отдельной операции умножения/деления в ФАПЧ должна оставаться в некоторой области допустимых значений. Что собственно в конце и упоминается как "проверка на валидность". Можно сразу добавить её в решатель, чтобы после перебора выбрасывать не валидные значения. Те которые математически верны, но ФАПЧ не сможет реализовать.

Утилита Artery сама не считает делители ? Если просто вписать 100 МГц и нажать "ввод".

Утилита Artery сама не считает делители ?

Утилита Artery-то считает.
Дело в том, что у нас на работе нельзя устанавливать ПО из интернетов.

Также нельзя прописывать переменную Path, открывать диспетчер задач и прочие ограничения на локальных PC.

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

это прямо таки тема для отдельного обсуждения

Интернеты из дома на дискетках флешках приносите?

Я так делал в 00х...

Ну принес я дистрибутив.
А установить не могу так как надо админский логин и пароль набрать. А у меня его нет.

Это вообще такая частность и такая мелоч на которую квалифицированный программист даже не должен обращать внимания. Если у программиста даже подбор множителей и делителей тактовый частоты вызвывет "зависания" вплоть до написания статей то как же он дальше продвинется? В 99% случаев эти цифры подбираются руками за минуту, в оставшемся 1% пишется скрипт перебора на любом языке за 5 минут. Лезть в дебри математики тут излишнее усложнение и пустая трата времени.

пишется скрипт перебора на любом языке за 5 минут

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

Да какой там перебор, за пару минут на глаз делители подбираются и по формуле проверяется результат.

Руками за минуту — это и есть математика, только отработанная до автоматизма :)

Большинство программистов мк с которыми я обшался( у каждого по 7+лет опыта) на вопрос какая у вас сейчас частота ядра? Разводили руками.

Это как так "разводили руками"? От частоты ядра, так или иначе, зависит чуть более чем все.

Это как так "разводили руками"?

Они не знали на какой частоте у них микроконтроллер тактируется.

От частоты ядра, так или иначе, зависит чуть более чем все.

Плюсанул, но хотелось бы отметить, что чуть более чем всё - не совсем корректно как по мне, - или просто всё, или чуть менее, чем всё. Я понимаю, что сленг с лурки или откуда-то еще, но тем не менее.

О Ардуино, Ардуино, надо быть тупым для всех,

Для Ардуино, Ардуино, есть одна награда — смерть :-D

Да, я знаю, что у него есть своя экологическая ниша. Это система для пивоваров, которые автоматизируют домашнюю пивоварню, не становясь ради этого программистами МК. Собственно, оно придумано, чтобы не становиться программистом МК и человек, работающий с ним, не является программистом МК.

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

 Бывает, что от частоты работы ядра в общем-то ничего и не зависит особо

Что это за задачи такие?
Без знания частоты ядра даже HeartBeat LED не настроить.

Ну например если системный фреймворк в компании делает отдельная команда и разработчики логики уже получают микроконтроллер на котором круттится таже FreeRTOS. Возьмите к примеру SDK который c ESP32 идет. Там в общем никакой разницы нет ядро на 180 или 200MHz работает. Примерно так же во многих компаниях делается. Небольшая команда запускает собственный фреймворк на новом MCU, а дальше команда работающая над целевым устройством это использует.
Ну и потом, есть системы где частота ядра вообще динамически меняется в процессе работы. Завязываться на нее смысла вообще нет.

Если с нуля писать, то не настроить, но писать с нуля совершенно необязательно. Берём mbedOS, например, и там всё чудесно инициализируется по умолчанию, а sleep_for() принимает аж литералы времени типа 5s

Или например моя самоделка вообще на Rust в качестве часов использует LPTIMER, и частота ядра ей для работы со временем вообще по барабану. Если PWM понадобится - тогда да, придётся считать.

Если цель прошивки опрашивать кнопку и по нажатию выполнить функцию, то да. Частота не важна.

Прошивка - мина.

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

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


Да ладно уж, мелочиться...

--Многие даже не знают названия микроконтроллера,
--не имеют ни малейшего представления о схемотехнике электронной платы,
--не догадываются какой компилятор
--никогда не слышали слов "система сборки"
--не догадываются о существовании bin и hex файлов, переменных окружения, препроцессора, консолей, datasheet(ов), NVRAM, конечных автоматов, модульных тестов и прочего

Из embedded инструментов-примочек на столе только бубен.

И тем не менее такие тоже являются как бы программистами разработчиками. Причем я видел таких "художников-абстракционистов" даже яндексе.

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

Схемы формирования частот нонче навороченные пошли, на Atmega можно было обойтись калькулятором, а то и в уме две цифры поделить.

Что то подобное сейчас уже засовывают в system.c для микроконтроллеров. Хотя более правильно, на мой взгляд, было бы просто пощелкать опциями в визуальном конфигураторе, раз он уж есть, и лучше понять как все это работает, а не мистический черный ящик с настройками.

В Wolfram Mathematica можно решить в пару строк:

sol = Solve[8000000 n/m - 100000000 f == 0, {n, m, f}, 
   Integers] //. {C[1] -> c1, C[2] -> c2}
Multicolumn[
 TableView[#, Headers -> {{с1, c2, m, n, f}}, Alignment -> Center] & /@
   Table[{c1, c2, m, n, f} //. sol[[1]], {c1, 1, 10, 1},
{c2, 1, 10,1}],2]
Изображения
Аналитическое решение
Аналитическое решение
Результаты расчета
Результаты расчета

Если я правильно понял, F по условиям задачи "степени двойки" от 1 до 32 То есть 1,2,4,8,16,32. А у вас F четные от 2 до 20

Полученное решение данных уравнений более полное. Все "степени двойки" четные и содержаться в полученном ряду.

Полученное решение данных уравнений более полное. Все "степени двойки" четные и содержаться в полученном ряду.

Здесь постскэйлер - делитель на 2 или 4 или 8 и т.д. Не надо более полное решение, оно аппаратно нереализуемо. Оставьте только те значения, которые имеют отношение к условиям задачи.

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

Тогда Вам надо вот этот текст.

Вы в Самом Деле Хотите Стать Программистом Микроконтроллеров? https://habr.com/ru/articles/668368/

Как раз недавно пару параграфов и картинок добавил.

Вы в Самом Деле Хотите Стать Программистом Микроконтроллеров?

Уважаемый @aabzel , я автор десятка дистрибутивов ОС для микроконтроллеров (Mega, Due, 101, M0, ESP8266, ESP32 и т.д.) и автор десятков проектов на них.

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

(а против математики я ничего не имею)

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

Вижу у Вас есть опыт в разработке firmware. Это великолепно.

Напишите, тогда, пожалуйста, свою монографию на тему "Как здорово работать программистом микроконтроллеров"

я автор десятка дистрибутивов ОС для микроконтроллеров (Mega, Due, 101, M0, ESP8266, ESP32 и т.д.) и автор десятков проектов на них.


Вообще странно слышать слово "дистрибутив" в по отношению к прошивке для микроконтроллера.

Обычно слово "дистрибутив" говорят про образ ядра с Linux.
А то, что загружают во flash MCU обычно называют словами: прошивка, бинарь, firmware, артефакт.

Напрасно Вы так. @smart_alex На самом деле в программировании микроконтроллеров целая куча всяческой математики, как школьной так и ВУЗ(овской).

Вот подборка текстов в доказательство:

--Зачем Программисту Микроконтроллеров Численные Методы?
https://habr.com/ru/articles/700394/

--Зачем Программисту Микроконтроллеров Математическая Статистика? (или так ли хороши UWB трансиверы?)
https://habr.com/ru/articles/712616/

--Зачем программисту микроконтроллеров тригонометрия? (или Обзор Усилителя Звука из Apple AirTag)

https://habr.com/ru/articles/767386/

--Зачем программисту микроконтроллеров комплексные числа (или обзор MEMS микрофона MP23DB01HPTR)
https://habr.com/ru/articles/765896/

--Комбинаторика нужна для модульных тестов
https://habr.com/ru/articles/762142/
https://habr.com/ru/articles/709374/

--Грамматики Хомского
https://habr.com/ru/articles/757122/

--Математическая индукция
Сканирование шины RS485
https://habr.com/ru/articles/752292/

--Спец разделы мат. анализа: Ряды
Ряд Фурье как Фильтр Нижних Частот
https://habr.com/ru/articles/748334/
https://habr.com/ru/articles/687640/

--Бинарные деревья поиска
NVRAM Поверх off-chip SPI-NOR Flash
https://habr.com/ru/articles/732442/

--Высший пилотаж алгебры
Вывод формулы для двустороннего определения дальности между UWB трансиверами
https://habr.com/ru/articles/723594/

--Интегралы
Теория управления шаговым двигателем (или как вертеть PTZ камеру)
https://habr.com/ru/articles/709500/

--Сферическая Геометрия Римана
https://habr.com/ru/articles/649163/
https://habr.com/ru/articles/648247/

И это только то с чем я столкнулся. Может ещё что-то надо из математики.

язык математики вообще очень даже не для всех, но для сложных задач так или иначе придется запеть и эту песню. к тому же в школе и ВУЗах этому учат (ну надеюсь) .

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

Можно найти немало серьезных проектов в ардуино с огромными наборами формул

Есть примеры?

я сейчас уже не вспомню где я видел я прям совсем лютую портянку, но как пример это проекты связанные с gps и pid регулированием. Примерно как SoftRF, 360gts или здесь на хабре было управление протезом якобы взглядом (на самом деле акселерометры).

Да даже возмем обычный бародатчик с 6 коэффициентами поправки. Там немаленькие формулы чуть ли не с плавающей запятой. Вполне даже можно абстрагирироваться от их физического смысла, но даже чисто математику перевести в целочисленное будет способен явно не каждый программист МК, хотя нарисовать по результату красивый график у кого то получается и эффективнее и красивше.

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

Выпад в сторону автора посильнее моего, за который я словил минус в карму. Прикольно, так карма 92, однако. Статьи - много по модулям с мк, ага "раскуриваем трубку Гейгера-Мюллера" - это после которой я сразу побежал в гараж искать трубку Гейгера, должна была где-то там быть с советских времен, слава богу не нашел, умеет автор "раскуриваем трубку" зарядить энтузиазмом.

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

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

А что если требуемую частоту нельзя получить точно, а можно только приближенно? Попробуйте найти наиболее точное приближение для частоты 87,654321 МГц. (Подсказка: цепные дроби).

Но стоит добавить пару ограничений (что для нас более важно - стабильная частота или низкое энергопотребление?)

Еще оптимизацию по фазовому шуму можно добавить, не совсем то же самое, что стабильная частота.

Определения в начале статьи весьма самовольны. Диафантовы уравнения - это уравнения, решаемые в целых числах. Далее вы фокусируетесь на линейных диафантовых уравнениях.

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

Если вы решаете диафантово уравнение, где a и b - целые коэффициенты, то тут есть элементарное одно решение x_0=b,y_0=-a и вообще все решения лежат на прямой и задаются x_i = ib/gcd(a,b), y_i=ia/gcd(a,b).

Ваше исходное уравнение f_q \frac{N}{M}-f_s f = 0 элементарно преобразуется в f_q N - f_s (Mf) = 0

Отсюда по формулам выше вы можете найти N и Mf, а дальше, рассмотрев делители известного Mf, найти M и f.

Подставив ваши числа (8м и 100м) в формулы выше, получаем N=i*25 Mf=i*2. Из ограничения в таблице на N получаем 1<i<=20. Из ограничений на M, получаем, что надо исключить i=17 и i=19, потому что 2i в этом случае не раскладывается на степень двойки и число от 1 до 15. Потом Mf раскладываем на степень двойки и оставшееся M.


Можно взять, например, i=2. Тогда N=50, MF=4, что дает M=1, F=4 или M=2, F=2, или M=4, F=1. Т.е. вот вам уже 3 решения. Все 36 решений выписать не составит особого труда даже руками.

Ваш перебор, видимо, не все варианты перебирает. Найденные вами решения получаются при i=4, 8, 16, 20. Но там же вы упустили другие разложения MF на множители, например N=100, F=1, M=8; N=100, F=2, M=4; N=100, F=4, M=2.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории