He estado trabajando en un proyecto de control de eBike en el Arduino MEGA2560. El programa ejecuta 3 bucles de control PID, un bucle de control de capacidad de la batería (interpolación basada en tablas de búsqueda), un velocímetro (muestras basadas en un interruptor de láminas), así como una pantalla LCD para mostrar información. Sus entradas son 3 señales analógicas: voltaje de la batería, corriente y entrada del acelerador del usuario, así como una entrada digital: señal de activación / desactivación del velocímetro (interruptor de láminas). Actualmente, con todo esto funcionando en aritmética "larga", el Arduino logra completar 10 bucles por segundo. Como la pantalla LCD TFT requiere enormes cantidades de potencia computacional, estoy pensando en reemplazarla por una pantalla alfanumérica.
Las salidas consisten en una señal analógica del acelerador que va a un controlador de motor, la pantalla LCD y potencialmente algunos otros dispositivos que requieren señales analógicas. Por lo tanto, los convertidores ADC son esenciales y DAC sería muy útil, aunque actualmente estoy usando la salida Arduino PWM con un filtro de paso bajo RC. Del mismo modo, la capacidad de leer señales digitales y analógicas sin interrumpir el procesador sería excelente.
Me gustaría potencialmente hacer un producto de consumo a partir de esto, por lo tanto, quiero construir mi propia plataforma desde cero con un microcontrolador diferente que pueda darme al menos 100 muestras por segundo (10 veces lo que está logrando el Arduino). Además, para evitar los puntos flotantes, mis cálculos usan variables largas y, en consecuencia, números mayores de 16 bits, por lo que supongo que una MCU de 32 bits sería una buena idea. Además, una MCU capaz de hacer cálculos de coma flotante podría ser interesante para simplificar las matemáticas en el código.
Al final, no estoy seguro de cómo comenzar a buscar MCU que satisfagan estos requisitos y permitan una transición rápida del entorno Arduino. ¡Cualquier orientación sobre cómo encontrar tales MCU sería muy apreciada!
fuente
Respuestas:
(Esta es una guía genérica. Sospecho que también podría beneficiarse de la optimización del código, pero eso está fuera del alcance de este sitio web).
Paso 1: dimensionamiento aproximado, presupuesto, proveedor
Elige uno de:
Computadora (Raspberry Pi, Beagleboard, placa PC104, Intel Edison, etc.). Arranca un sistema operativo de uso general y tiene mucha potencia de procesamiento. Más caro y hambriento de poder. $ 10- $ 100.
Gran MCU. ARM Cortex-A / PIC32 / dsPIC / AVR32 / TI C DSP, etc. Potencia de computación decente, sistema operativo opcional. ~ $ 5.
Pequeño MCU. Cortex-M / PIC16. Realmente no hay suficiente espacio para un sistema operativo verdadero, tal vez solo un programador de tareas liviano. ~ $ 2.
Tiny MCU. Realmente solo para aplicaciones en las que te preocupas por cada microamperio de consumo de energía. ~ $ 1 o menos.
También debe considerar en esta etapa qué proveedores y cadenas de herramientas le gustan o no. Eche un vistazo al costo de cosas como dispositivos de depuración en circuito e IDE.
Paso 2: periféricos mínimos
¿Necesitas cosas como USB? PCI? HDMI? SATA? ADC o DAC inusualmente rápidos? Casi todas las categorías "pequeña" o "pequeña" no tienen estas, aunque USB está bastante disponible.
Paso 3: prototipo
Elija algo que cumpla con los criterios anteriores, al azar si es necesario, comience, descubra qué tan factible es y cuánto espacio / potencia de procesamiento necesita. Ya has hecho algo de esto. Escribir en C debería hacer que gran parte de la lógica sea portátil.
Una vez que tenga el prototipo, puede decirse: "Necesito uno como este, pero con más X" y dejar que eso guíe sus decisiones.
Paso 4: reducir
En general, es más fácil comenzar con el miembro más grande (la mayoría de Flash y RAM) de una familia de CPU, escribir v1 de su aplicación y luego elegir una más pequeña y más barata para que se ajuste. También puede dedicar tiempo al arte de adaptar el software a menos recursos. Lo que vale la pena depende de cuántas unidades vas a hacer.
fuente
Buen proyecto Aquí hay algunos consejos, pero sería difícil generalizar esto para cada proyecto.
Comience con los requisitos computacionales
Esto es lo que le dirá qué tipo de núcleo necesita y el rendimiento general de la MCU. Le sugiero que comience con esto, ya que obviamente no se puede extender utilizando componentes externos, a diferencia de los periféricos.
Primero, parece que usas operaciones matemáticas pesadas con enteros grandes dentro del ciclo. Entonces, como sugirió, 32 bits sería útil aquí, por lo que ARM es un candidato ideal. En cuanto a la frecuencia de operación: actualmente, estás usando un Arduino MEGA2560 (supongo que funciona a 16MHz) y puedes hacer 10 bucles / s. Si desea alcanzar 100 bucles / s, debería estar bien con un Cortex-M3 / M4 en el rango de 100MHz o más (estimación aproximada). Tenga en cuenta que el Cortex-M4F tiene una unidad de coma flotante.
Ya hemos reducido la selección.
Requisitos de memoria
Este es fácil: elija el MCU que tenga la mayor cantidad de RAM / Flash de su rango para el prototipo. Una vez que valide el prototipo, cambie a la MCU desde el mismo rango que tiene suficiente RAM / Flash, ahora que conoce sus requisitos exactos.
Tenga en cuenta que no creo que su aplicación necesite cantidades increíbles de memoria.
Ahora los periféricos
Necesitas absolutamente algo de ADC. Todas las MCU del rango que estamos analizando tienen algunas, por lo que no es un criterio útil. Tampoco lo son las entradas / salidas digitales, excepto si necesita una gran cantidad de ellas (lo cual no parece ser su caso).
Parece que necesitas un DAC. Sin embargo, esto es algo que en realidad no encontrará fácilmente y limitará demasiado a los candidatos. Por lo tanto, no cumplimos con ese requisito y nos quedaremos con un PWM y un paso bajo (que ciertamente es aceptable, en realidad).
No mencionas ninguna interfaz de comunicación, excepto la pantalla LCD (más adelante). De todos modos, todas las MCU tienen I2C / SPI / UART / ... si necesita alguna.
El LCD
Este es más complicado, porque hay muchas soluciones diferentes que imponen requisitos completamente diferentes a la MCU. Pero no elija la pantalla LCD dependiendo de la MCU. Elija la pantalla LCD que desea para su producto y luego seleccione la MCU que lo conducirá de manera eficiente.
Ahora eliges
Vaya al sitio web de ST Micro / NXP / Atmel y use sus herramientas de selección de MCU. También pasarás mucho tiempo leyendo hojas de datos. Tómese este tiempo No se desperdicia. Cualquier cosa que aprenda aquí, incluso si no lo usa específicamente para este proyecto, puede ser útil.
En este punto, también debe echar un vistazo a la cantidad de PIN que realmente necesitará y verificar el esquema de multiplexación de los candidatos MCU elegidos para verificar que puede usar todas las funciones de PIN que necesita. Porque, obviamente, querrás tomar las MCU con el menor número de pines que cumplan tus requisitos (por razones de costo / PCB de bienes raíces).
Consulte los precios / disponibilidad en Mouser / Digikey. Pero no debería necesitar algo particularmente caro aquí. Quizás 5 € más o menos.
Lo último con respecto al control LCD
Parece que la actualización de la pantalla LCD es parte de su ciclo principal. No debería Especialmente si estás haciendo un bucle 100 veces por segundo, es inútil. Haga que el bucle de control calcule todo y ajuste el comando del motor en cada iteración, pero simplemente actualice los valores para mostrarlos en algún lugar de la memoria. Luego, haga que otro bucle con menor prioridad muestre esta información al usuario cuando no haya nada más importante que hacer.
Sí, idealmente, requiere un cambio de tareas y otras cosas. Un sistema operativo real, en realidad (buscar FreeRTOS, Coocox OS, Nuttx, ... esos son muy pequeños, se utilizan en gran medida en Cortex-M y proporcionan los mecanismos multitarea necesarios).
fuente
Tenga en cuenta que este es un tema amplio que puede responderse correctamente utilizando múltiples enfoques (subjetivos).
Además, el formato stackexchange no es bueno para diseñar soluciones para problemas. Por ejemplo, rara vez hace que la gente diseñe hardware para usted. En cambio, propone un diseño de hardware y hace preguntas al respecto.
Dicho eso ...
Comience con las características del procesador que no puede cambiar. Como la velocidad y el tamaño de la memoria (si corresponde). Investigue si necesita interrupciones y cuán complejo debe ser el manejo de interrupciones.
Si necesita soporte periférico como ADC o DAC, la situación es más compleja. En caso de que estas características estén integradas en el procesador o sean externas al procesador. El precio, la precisión e incluso el ruido son factores en esta decisión.
Si se admiten periféricos externos, tenga en cuenta el tipo de comunicaciones en serie que son necesarias. El hardware externo puede necesitar SPI, I2C u otro tipo de UART. Si la velocidad de datos es alta, podría ser mejor encontrar un procesador con características DMA asociadas con sus puertos de comunicación serie.
Finalmente, si se trata de una aplicación de procesador integrada (que normalmente significa un procesador dedicado a una tarea), considere dividir los requisitos en varios grupos y asignar un procesador a cada uno. Por ejemplo, un procesador de pantalla GUI probablemente no necesita una función ADC. Este enfoque objetivo para resolver problemas ha demostrado ser exitoso en software y con la caída de los precios del procesador también se puede aplicar al hardware.
En el mundo real, este enfoque es iterativo. Es decir, muchos proyectos comienzan con un procesador e intercambian diferentes procesadores a medida que ocurren problemas de hardware y / o software o cambia el alcance del proyecto.
fuente
No vi a nadie mencionar el costo de las herramientas. Mi compañía eligió una TI CC2541 y descubrió que solo se compilaba con un compilador IAR de $ 4k, definitivamente un espectáculo para un aficionado. También el programador. Puede costar $ 20 o mucho más. Las herramientas más baratas parecen más la norma ahora, por lo que tal vez esto sea cosa del pasado pronto.
Además, si lo refluye usted mismo, los paquetes como TQFP son más fáciles que, por ejemplo, BGA. Un BGA grande es difícil de acertar, basado en la experiencia personal.
fuente
Si el producto es relativamente sensible a los precios y tiene una financiación de desarrollo decente, puede adquirir un grupo de paneles de evaluación y perfilar el código en cada uno para tener una idea. Eso debería ser bastante sencillo si su código está escrito en el portátil C. Además del micro, evaluará las cadenas de herramientas con versiones de demostración antes de desembolsar el costo de un IDE completo como IAR o Keil. En algunos casos, puede perfilar el código de cuello de botella directamente en el IDE sin hardware.
Si está fuertemente limitado por el costo de desarrollo, es posible que tenga que comprometerse para encontrar algo que no cueste demasiado para la configuración de desarrollo.
Por ejemplo, ST tiene una placa de evaluación ARM Cortex M7 con una bonita pantalla a color por <$ 100. Tiene una FPU con funciones DSP para que pueda hacer cualquier cosa de la que haya hablado fácilmente, probablemente ejecute un bucle PID a 100kHZ en lugar de solo 100Hz. Probablemente sea exagerado a menos que esa visualización sea una prioridad.
Si está buscando un procesador más barato sin FPU, entonces probablemente desee perfilar el código PID en su forma final. Asegúrese de que todos los factores de escala y linealización y calibración estén incluidos, ya que pueden sumar en términos de tiempo de procesamiento.
A menudo, los periféricos y la calidad y disponibilidad del middleware asociado (y los términos de licencia) influirán fuertemente en su elección. Si necesita el modo de host BT o Wifi o USB y los archivos FAT para almacenar en una memoria USB, o una interfaz SD rápida, todos estos serán factores importantes. Algunos chips tienen un controlador LCD incorporado y un controlador digitalizador que puede permitir el uso de un panel TFT relativamente económico. No pase por alto las tarifas de licencia a veces altas.
Si tiene alguna idea de la memoria de programa requerida, la velocidad de procesamiento y los periféricos (incluya FPU en esto), puede hacer una búsqueda paramétrica en el distribuidor antes de profundizar en las hojas de datos. Algunas cosas que son demasiado limitantes pueden ser: paquete de orificio pasante, DAC interno, PHY de Ethernet interno, FPU. Es probable que ninguno de estos sea necesario y pueden restringir indebidamente sus elecciones prematuramente.
Buena suerte con esto, es mucho trabajo hacer esto correctamente. En mi experiencia, es una economía falsa reducirlo demasiado a un producto nuevo porque los clientes inevitablemente pedirán cosas que no anticipó y desea tener alguna capacidad adicional para suministrarlas sin comenzar de nuevo. Por otro lado, si el producto es demasiado caro, no podrá vender lo suficiente a los márgenes adecuados para mantener el negocio.
fuente
Hay varias plataformas diferentes que puede comenzar a buscar, como Arduinos, microcontroladores PIC, FPGA y mucho más. Trabajé con Arduinos en el pasado y tiene un puerto ADC capaz de alcanzar 74kS / s. 100 muestras por segundo es extremadamente lento y me pregunto cómo lo descubrió. Por otro lado, desea preguntarse si necesitará algún tipo de interfaz como SPI, CAN, I2C o UART. Todos pueden tener sus propios beneficios y usted debe considerar si va a hablar con uno o más esclavos. El último pero probablemente el paso más importante sería adivinar cuántos pines en el microcontrolador necesitará usar.
"La capacidad de leer señales analógicas a digitales sin interrumpir el procesador sería excelente". Puedo hacer una suposición descabellada al decir que no desea lidiar con buffers externos o internos que circularán sus datos y posiblemente retrasarán su procesamiento de datos. ¿Está bien? Si es así, es más programación para usted, pero los procesadores generalmente son capaces de manejar la velocidad de 100 muestras por segundo. Depende de usted programar el reloj, la frecuencia de muestreo y el resto.
Además, considere las interrupciones en su programa si desea mantener continuamente los datos de muestreo y realizar otra tarea cuando se activa un indicador.
fuente