Generando una señal PWM (idealmente varias) desde GPIO, alternativa al pulso basado en software

0

Escenario :

Estoy tratando de controlar con precisión (sin fallos) varios servomotores desde una computadora hasta GPIO. La posición final, la velocidad y, idealmente, la aceleración deben controlarse.

Actualmente genero la señal PWM por software, pero el software no parece lo suficientemente preciso (debido principalmente a los cambios de contexto del kernel, la señal PWM tiene algunas veces varios microsegundos tarde, produciendo algunos "temblores"). Conozco varias formas de mejorar, por ejemplo, implementando la señal de un contexto de controlador (kernel), pero el problema permanecerá inherentemente.

Pregunta :

Cómo generar una señal PWM, según las indicaciones del software. ¿Qué solución se recomienda?

  1. Construyendo la lógica yo mismo: parece una exageración: 2 relojes, muchas puertas lógicas ... Incluso si es probable que se pueda lograr, el resultado final tomará demasiado espacio.
  2. Utilizando una imagen intermedia, dedicada a proporcionar PWM precisa, el protocolo entre la computadora y la imagen a definir. Podría ser una solución, no estoy seguro, sin embargo, del resultado o si hay mejores formas.
  3. Mirando por encima de las tiendas de Internet por PWM, servo controlador, ... No encontré ningún chip que integre esta función. Probablemente echo de menos un concepto importante.
  4. otros?
pregunta Adrian Maire

3 respuestas

1

Una solución es usar CPU pequeñas con hardware PWM. Una vez que te quedas sin hardware, agrega otra CPU. Necesita PWM lo suficientemente lento y suficientes bits para manejar los pulsos de 1 a 2 ms con resolución suficiente; no todos los micros tendrán esto.

También es posible hacer firmware PWM con una CPU pequeña -suponemos que usted desea < 1usec jitter y resolución, puede actualizar varios servos uno a la vez dentro de (digamos) Marco de 20ms. Tendría que preocuparse por no desbordar el búfer disponible en el micro (por ejemplo, intercalando la comunicación).

Y finalmente, podría hacer un híbrido dirigiendo los pulsos del temporizador de hardware desde un solo temporizador a través de un demultiplexador a servos individuales. Esto podría ser el más fácil de todos porque el micro tendría mucho tiempo para tratar con las comunicaciones (asumiendo que es impulsado por interrupciones).

    
respondido por el Spehro Pefhany
1

La mejor solución práctica es comprar el servo del estante y controlarlo desde su software por medio de la comunicación UART o Ethernet. Es porque las personas que hacen el servo lo hacen mejor que tú y más barato que tú. Y realmente lo han hecho, mientras que apenas estás empezando.

Sin embargo, déjame explicarte lo que hay dentro de un servo típico. Hay un microcontrolador con periférico pwm incorporado, que se configura en el inicio a cierta frecuencia y el ciclo de trabajo se actualiza cada ciclo de acuerdo con las salidas de los bucles de control. Normalmente, una MCU puede controlar dos motores, a veces tres o incluso más.

El servo firmware normalmente tiene ciclos de corriente, velocidad y posición, y dependiendo de los algoritmos de control avanzado del proveedor (corrección de errores, ecam, configuración de entrada, nombre).

La arquitectura más avanzada tiene un controlador maestro con CPU fresca en el interior y etapas de alimentación separadas conectadas por comunicación al maestro.

Un servo decente de doble eje cuesta alrededor de $ 500. Estoy seguro de que el tiempo que va a perder para construirlo por sí mismo cuesta más.

Si necesita sugerencias sobre dicho servo, le sugiero Galil (simple, pero casi alto), Adtek QS9 (chino alto, muy simple y práctico), entonces tiene beckhof, yaskawa, elmo- bueno, pero más Caro y complicado.

    
respondido por el Gregory Kornblum
0

Está saliendo de una implementación de software debido a que, en general, los núcleos de las computadoras no son en tiempo real. Como tal, cualquier cosa puede ser priorizada antes de su conmutador PWM. Puede reducir el problema elevando la prioridad de su controlador, pero el problema no desaparecerá, ya que los controladores y otros módulos del kernel aún pueden tener prioridad.

Para solucionar realmente el problema en el lado de la computadora, se requiere el uso de un kernel en tiempo real. Linux tiene el proyecto RTAI. MATLAB tiene su propio sistema operativo simple para ejecutar sistemas. Pero, en general, mi opinión es que generalmente es más simple tener un MCU (microcontrolador) que haga el trabajo duro en el metal. Un simple Arduino será barato / fácil / lo suficientemente simple. Si desea más canales PWM, puede probar una placa ARM (ahora también hay algunos Arduinos basados en ARM).

Si realmente necesita que el controlador esté en el lado de la PC, entonces tiene que ir en tiempo real o debe diseñar su controlador para permitir el jitter al enviar información a la MCU (si usa un USB, puede tener una fluctuación de retardo), pero entonces la forma de onda PWM no se verá afectada.

    
respondido por el Ronan Paixão

Lea otras preguntas en las etiquetas