Velocidad de respuesta de pin de Arduino Uno

2

Estamos intentando construir una bobina con múltiples bobinas, y cada bobina debe activarse y desactivarse en intervalos de tiempo precisos. Por razones de costo (e inexperiencia), estamos considerando usar un Arduino Uno para esta tarea. Nuestras preguntas son las siguientes:

¿Qué tan rápido puede el Uno cambiar un pin entre estados? ¿Qué tan consistente es el tiempo? ¿Hay una opción mejor, teniendo en cuenta nuestra inexperiencia y falta de fondos?

    
pregunta anonymous

4 respuestas

1

Si necesita que se repitan los pulsos a intervalos regulares, es decir, una señal modulada en ancho de pulso (PWM), el uso de los temporizadores de hardware en el ATmega328 podría ser el camino a seguir. Esto le proporciona una sincronización muy precisa y consistente y le permite alternar un pin tan rápido como \ $ f_ {CPU} / 2 \ $ (8 MHz en un Arduino Uno), pero restringe bastante su forma de onda a "alta para X ciclos" fuera de Y ".

Este artículo de Arduino tiene una descripción general del tema.

    
respondido por el kwc
0

Echemos un vistazo a lo que la CPU nos permite hacer. El siguiente es un código C para su distribución lo más rápido posible:

while (1) PORTA ^= 0x01;

Si el compilador fuera lo suficientemente inteligente, se compilaría en lo siguiente:

  ldi r25, 0x01    ; Load immediate

start:
  eor r24, r25     ; r24 = r24 XOR r25
  out 0x02, r24    ; Out (store) to IO location
  rjmp .-6         ; Goto start

Yo diría que este es el bucle más rápido en un AVR que puedes obtener. Ahora, tomemos el tiempo de ejecución de cada instrucción:

  • OUT - 1 ciclo
  • EOR - 1 ciclo
  • RJMP - 2 ciclos

Esto totaliza a 4 ciclos. Tenga en cuenta que este es un solo pin de alternar. Para obtener la frecuencia de conmutación, multiplique por 2. Teniendo en cuenta la velocidad de su CPU de 16 MHz, puede decir que lo más rápido que puede cambiar un pin en un mega AVR es \ $ f_ {max} = f_ {CPU} / 8 \ $

Esto, por supuesto, hace que la tasa sea casi incontrolable, ya que el paso más pequeño que puede disminuir es un ciclo de CPU único, por ejemplo, agregando una instrucción NOP a la mezcla.

Para alternar un pin hay soluciones mucho más elegantes. Sugeriría leer sobre el temporizador 555. Es probable que atrapes algo de viento allí.

    
respondido por el Dzarda
0

Esto comenzó como un comentario, pero no había una buena forma de formatearlo ...

Encontré (aunque en una MCU diferente: Coldfire para aquellos que estén interesados) que utilizando

PORTn ^= 1;

Es en realidad un lote más lento que escribir directamente en los registros PORTnSET o PORTnCLR , ya que implica una secuencia de lectura / operación lógica / escritura.

Para explicarlo, el micro tiene varios registros para cada puerto (no sé qué tan común es esto en todos los micros), pero el popular puerto de propósito general (que se puede usar para configurar, borrar o leer el estado del pin) se encuentra "por encima" del trío de nivel inferior de PORTnSET, CLR o STATE que, en orden, puede AJUSTAR el pin (1 = set, 0 = sin cambio), CLEAR (1 = borrar, 0 = sin cambio) o LEA el estado del pin sin procesar (leer los otros no es una garantía ya que el estado de registro puede no aplicarse si el pin está configurado como entrada, etc.).

Encontramos que PORTn ^= 1 resultó en una gran cantidad de líneas de ensamblaje desde el compilador, lo que de hecho causó que nuestros pulsos fueran demasiado largos.

Si apuntas a un solo pulso rápido, sería más rápido hacerlo:

PORTnCLR = 1; // Clears pin
<wait for button push or whatever>
PORTnSET = 1; // Sets pin
PORTnCLR = 1; // Clears pin

No sé qué tan rápido necesita ir, pero me parece que debería haber alguna forma analógica simple de proporcionar un pulso de disparo MUY nítido (si el ancho del pulso tiene que ser lo más estrecho posible) con unos pocos bits básicos.

También hay mejores opciones en términos micro si necesita la capacidad de secuenciación, las placas de desarrollo STM32 pueden tener hasta ~ 192MHz por menos de un Ardunio, y luego puede aprender algo de programación real.

Un buen comienzo serían los archivos de notas de Linear Tech, ya que hay algunas cosas brillantes de la talla de Bob Pease & Jim Williams está allí:

enlace

    
respondido por el John U
-1

El arduino uno usa un cristal de 16MHz, lo que significa que es capaz de hacer 16 millones de instrucciones en un segundo.

Depende de qué tan largo sea su script lo rápido que el arduino alternará su pin alto y bajo.

No importa, esta respuesta parece estar equivocada. Mi mal

    
respondido por el Handoko

Lea otras preguntas en las etiquetas