Soy una Persona Matemática. Así que pensando desde esa perspectiva.
Para hacer mi pregunta un poco más concreta. Estaba pensando en controlar un servo de hobby a través de un flujo de datos en serie Uart.
Estoy inventando números con el propósito de comunicar la idea.
CONTEXTO:
Supongamos que un servo necesita actualizarse a 100 Hz y necesita una resolución de 1 grado.
Esto implica que las comunicaciones en serie deben enviar DATOS (101101000) de 9 bits de ancho. (Me doy cuenta de que hay gastos generales MANTÉNGALO SIMPLE ATM). @ 100 Hz. Por lo tanto, tasa de transferencia de 900 bits por segundo.
Dado que un servo está controlado por una señal PWM. Y en el caso de un arduino con reloj de 16Mhz.
Esa transferencia en serie consumirá un porcentaje del tiempo, dejando el resto para producir la señal PWM para controlar el servo.
PREGUNTA PRINCIPAL:
¿Cómo encuentro en general "dada la naturaleza de la biblioteca de los lenguajes de programación" la cantidad de instrucciones de bajo nivel utilizadas para una función o rutina particular? Entonces puedo ver si tengo suficiente tiempo para encajar en este caso. La señal PWM entre la transferencia de datos.
En general, cualquier biblioteca escrita en C probablemente no tendrá información sobre cuántos ciclos de reloj se necesitan para ejecutar una función. El motivo es que depende de la configuración de optimización de su compilador y del compilador que utilice.
Por lo general, solo puede saber a partir del código fuente cuánto tiempo llevará algo si está mirando el lenguaje ensamblador. Y solo entonces buscando el tiempo de cada instrucción en la hoja de datos.
Creo que las placas Arduino usan los procesadores Atmel AVR. En ese caso, puede usar Atmel Studio para simular el código para cualquier función de biblioteca. El simulador contará el tiempo transcurrido de la simulación.
Simplemente coloque un punto de interrupción antes y después del código que desea cronometrar. Ejecute el código hasta el primer punto de interrupción y registre el tiempo. Luego corre al segundo punto de interrupción y verifica el tiempo. La diferencia en esos dos tiempos es lo que quieres medir.
La recepción en serie y la generación de PWM en realidad se ejecutan en paralelo sin la participación de la CPU porque su chip probablemente tenga hardware dedicado para ambas funciones. Solo se requiere que la CPU ajuste el ciclo de trabajo de PWM si necesita cambiar, y que tome un carácter una vez que el búfer de recepción esté lleno.
También con respecto a los 9 bits, si su UART admite una palabra de 9 bits, entonces su número total de bits es de 9 bits de datos más un bit de inicio y parada, es decir, 11 bits por valor. Si su UART solo admite 8 bits, está obligado a enviar dos bytes, para un total de 20 bits si incluye los bits de inicio y parada.
Tenga en cuenta que el tiempo que llevará enviar un byte se puede determinar aproximadamente sin simulación solo en función de la velocidad en baudios. Por ejemplo, una velocidad de 9600 bps tomará (10 bits)/(9600 bits por segundo) = 1,04 ms por byte (al enviar con 8 bits de datos, 1 bit de inicio, 1 bit de parada). Dado que solo necesita actualizar una vez cada 10 ms, incluso 9600 bps (que es bastante lento) sería más que suficiente.
Incluso con un procesador RISC como este, donde todas las instrucciones toman la misma cantidad de ciclos, será difícil, si no imposible, determinar la cantidad exacta de ciclos (y, por lo tanto, el tiempo) de una rutina de biblioteca determinada. Especialmente considerando que cada decisión condicional dentro de cada llamada a la biblioteca puede introducir más o menos instrucciones (y tiempo) en la ruta de ejecución. Si estuviera trabajando con un depurador completo y un sistema de simulaciones (que Atmel puede ofrecer a un precio), entonces sería posible establecer puntos de interrupción y medir el tiempo preciso de cada caso posible de cada rutina. Pero sospecho que sería frustrante a menos que las funciones de la biblioteca estuvieran diseñadas para garantizar que todos los casos resultaran en el mismo momento.
Siendo ese el caso, si yo fuera usted y tuviera estas inquietudes, emplearía un osciloscopio con al menos doble rastreo y capacidad de disparo para probar la temporización y la sincronización, de una manera más determinista. Es decir, puedo iniciar cualquier cantidad de secuencias de prueba y alternar varios pines digitales para cambiar el estado de salida cuando se completa una tarea determinada. Esto me permitiría ver claramente tanto el tiempo total para completar varias tareas, como las diferencias entre varios casos. El resultado que espera, que creo que obtendrá dada la velocidad de las CPU, es que tendrá tiempo extra más que suficiente, y todas sus tareas se completarán en un tiempo insignificante en comparación con la velocidad mucho más lenta. de las palabras seriales reales de 9 bits.
Por supuesto, si resulta que incluso con un tiempo de procesamiento insignificante, todavía no está satisfecho con estar limitado por la velocidad de la transmisión en serie, entonces tendrá que usar una tasa de bits/baudios mucho más rápida, o tendrá que utilizar varios procesadores (cada uno con su propia E/S serie). luego, todos pueden preparar sus datos y ser activados para enviarlos simultáneamente, desde un solo comando (como un único punto de E/S digital que indica a todas las CPU que envíen).
¡Buena suerte! Con suerte, encontrará que la velocidad de Arduino no es un problema, y el envío de datos a todos sus servos uno a la vez sigue siendo adecuado.
Y no sé si importa, pero todos los procesadores arduino que conozco tienen varias salidas PWM directas.
Pero también tenga en cuenta que probablemente haya mejores foros que el foro de ingeniería eléctrica para preguntas específicas sobre codificación o capacidad del procesador.
Ale..chenski
Robar
Robar
jsotola
Lundin