Хороший проект. Вот несколько советов, но было бы сложно обобщить это для каждого проекта.
Начните с вычислительных требований
Это то, что скажет вам, какое ядро вам нужно, и общие характеристики MCU. Я предлагаю вам начать с этого, поскольку он, очевидно, не может быть расширен с помощью внешних компонентов, в отличие от периферийных устройств.
Во-первых, кажется, вы используете тяжелые математические операции с большими целыми числами внутри цикла. Итак, как вы предложили, 32-битная версия была бы полезна здесь, поэтому ARM является идеальным кандидатом. Что касается частоты работы: в настоящее время вы используете Arduino MEGA2560 (работающий на 16 МГц, я полагаю), и вы можете сделать 10 циклов / с. Если вы хотите достичь 100 циклов / с, вам будет хорошо с Cortex-M3 / M4 в диапазоне 100 МГц или более (грубая оценка). Обратите внимание, что Cortex-M4F имеет единицу с плавающей запятой.
Мы уже сузили выбор.
Требования к памяти
Это легко: выберите MCU, у которого больше всего RAM / Flash из своего диапазона для прототипа. После проверки прототипа переключитесь на MCU из того же диапазона, в котором достаточно RAM / Flash, теперь, когда вы точно знаете свои требования.
Обратите внимание, что я не думаю, что вашему приложению требуется невероятное количество памяти.
Теперь периферия
Тебе обязательно нужен АЦП. У всех MCU диапазона, на который мы смотрим, есть некоторые, так что это бесполезный критерий. Также нет цифровых входов / выходов, за исключением случаев, когда вам нужно их очень большое количество (что, похоже, не ваш случай).
Кажется, вам нужен ЦАП. Тем не менее, это то, что вы на самом деле не найдете легко и слишком сузите кандидатов. Таким образом, мы не соблюдаем это требование, и мы останемся с ШИМ и НЧ (что на самом деле приемлемо).
Вы не упоминаете ни о каком интерфейсе связи, кроме LCD (позже). В любом случае, все MCU имеют I2C / SPI / UART / ... если вам нужно.
ЖК
Это хитрее, потому что есть много разных решений, которые предъявляют совершенно разные требования к MCU. Но не выбирайте ЖК-дисплей в зависимости от MCU. Выберите нужный вам ЖК-дисплей, а затем выберите MCU, который будет эффективно управлять им.
- Если вам нужен символьный ЖК-дисплей: тогда самый простой и наименее ограничивающий для MCU - поговорить с ним через некоторый последовательный интерфейс (часто SPI). Таким образом, он не будет использовать слишком много PIN-кодов, вы можете использовать меньшие / более дешевые микроконтроллеры, и скорость не является проблемой.
- Если вам нужен графический TFT LCD: если он маленький, последовательная связь все еще может быть подходящей. Тем не менее, для 320x200 или более, и если вы хотите иметь хороший графический интерфейс, вы начнете хотеть общаться с параллельным интерфейсом. В этом случае либо вы используете некоторый GPIO (но это увеличит нагрузку на MCU, потому что вам придется разбивать контрольные линии), либо вы выбираете MCU с выделенным ЖК-интерфейсом (который часто совпадает с интерфейс внешней памяти). Этот последний накладывает сильное ограничение на выбор MCU, но у вас нет других сильных ограничений, так что ...
Теперь вы выбираете
Зайдите на сайт ST Micro / NXP / Atmel и используйте их инструменты выбора MCU. Вы также потратите много времени на чтение таблиц. Возьми это время. Это не впустую. Все, что вы узнаете здесь, даже если вы не используете это специально для этого проекта, может быть полезным.
На этом этапе вам также необходимо узнать количество PIN-кодов, которые вам действительно нужны, и проверить схему мультиплексирования выбранных кандидатов в MCU, чтобы убедиться, что вы можете использовать все необходимые функции PIN-кодов. Потому что, очевидно, вы захотите взять MCU с наименьшим количеством контактов, которые отвечают вашим требованиям (по соображениям стоимости / стоимости печатной платы).
Проверить цены / наличие на Mouser / Digikey. Но вам не нужно что-то особенно дорогое здесь. Может быть, 5 € или около того.
Последнее, что касается управления ЖК
Кажется, обновление ЖК-дисплея является частью вашего основного цикла. Это не должно Особенно, если вы зацикливаетесь 100 раз в секунду, это бесполезно. Заставьте цикл управления вычислять все и настраивать команду двигателя на каждой итерации, но просто обновляйте значения, чтобы они отображались в памяти. Затем сделайте еще один цикл с более низким приоритетом, чтобы показать эту информацию пользователю, когда нет ничего более важного, чтобы сделать.
Да, в идеале, это требует переключения задач и прочего. Фактически, настоящая ОС (ищите FreeRTOS, Coocox OS, Nuttx, ... они очень маленькие, в основном используются в Cortex-M и обеспечивают необходимые механизмы многозадачности).