Contando pulsos usando Arduino Uno

Estoy tratando de contar pulsos de un generador de forma de onda usando un Arduino Uno. El generador de forma de onda se establece en la siguiente configuración:

  • Tipo de forma de onda: pulso
  • Frecuencia: 20 Hz (50ms)
  • Amplitud: 3.0 Vpp
  • Desplazamiento: 0V
  • Ancho = 5ms

Hasta ahora, solo se muestran 0 en mi monitor de serie.

Aquí es lo que he probado hasta ahora:

1) Usando pulseIn () y pulseInLong () -> sin éxito

2) Verifique las conexiones de cableado -> Usé un multímetro para verificar y están conectados correctamente.

3) Conecte un osciloscopio para ver si se está generando la forma de onda -> La forma de onda se está generando como se muestra en las imágenes a continuación.

Nota: La forma de onda El generador es parte del osciloscopio:

Generador de formas de onda

Diagrama de conexión

Mi código se muestra a continuación:

volatile int IRQcount; int pin = 2; int pin_irq = 0; //IRQ that matches to pin 2 int result = 0; void setup() { // put your setup code here, to run once: Serial.begin (115200); pinMode(2, INPUT); attachInterrupt(pin_irq, IRQcounter, FALLING); } void IRQcounter() { IRQcount++; } void loop() { // put your main code here, to run repeatedly: cli();//disable interrupts IRQcount = 0; sei();//enable interrupts delay(500); cli();//disable interrupts result = IRQcount; sei();//enable interrupts Serial.print(F("Counted = ")); Serial.println(result); } 

Comentarios

  • No ' no sé si será predeterminado entrada bu ¿Es necesario utilizar pinMode(pin, mode)?
  • ¿Es " bajo " ¿parte de su forma de onda a 0 V o a -1,5 V?
  • De la ' foto del osciloscopio, el nivel bajo de la señal es -1,5 voltios y el nivel alto es de 1,5 voltios. 1.5 voltios es probablemente un voltaje demasiado bajo para ser reconocido como un alto lógico por Arduino.
  • Para ser amable con las entradas de Arduino, debe configurar el generador de señal para 5 Vpp y cambiar la compensación a + 2.5 voltios, por lo que la señal cambia entre 0 y + 5V (asumiendo que el Arduino Vcc es de 5 voltios). Las entradas digitales en el microcontrolador no deben ser negativas.
  • Ya veo, cambié el retardo a 250 ms, es por eso que estaba viendo result = 5 pero ahora lo cambié de nuevo a 500 ms y ahora veo result = 10, ¿puede explicar cómo verificar si el conteo de pulsos es correcto?

Respuesta

  1. Como señalaron Peter Bennett y otros, inicialmente había configurado 3Vpp, o un pulso alternando + 1.5V a -1.5v . Según las características eléctricas del controlador de Arduino , no se garantiza que 1,5 V se lea como «1». Debería ser al menos 0,6 de Vcc. El pin irq no puede reconocer las transiciones de borde, en su lugar, lee un «0» todo el tiempo. Y no se supone que debe conducir voltaje -ve a los pines de E / S para evitar daños !!
  2. La frecuencia del pulso es de 20 Hz o 20 pulsos por segundo. Con un retraso de 500 ms, está contando cuántos pulsos ocurren por medio segundo, por lo que result debe ser de valor 10. Eso es lo que se muestra en el monitor de serie.

Respuesta

De la «foto del alcance, el nivel bajo de la señal es -1,5 voltios y el nivel alto es 1,5 voltios. 1,5 voltios es probablemente un voltaje demasiado bajo para ser reconocido como un alto lógico por el Arduino.

Además, las entradas digitales de Arduino pueden resultar dañadas por el voltaje negativo. Las entradas de la mayoría de los circuitos integrados digitales están diseñadas para aceptar entradas entre tierra y el voltaje de suministro positivo.

Si el Arduino se opera desde +5 Voltios, debe configurar el generador de señal para 5 Vpp, con una compensación de +2.5 voltios para mantener la señal dentro del Arduino » s límites de voltaje de entrada.

Para que se reconozca como un nivel lógico alto, el voltaje de entrada debe estar por encima de 0,7 Vcc o 3,5 voltios; es posible que los voltajes más bajos no se reconozcan como altos, por lo que no provocarán una interrupción.

Comentarios

  • Lo configuré en 5Vpp, sin embargo, la compensación de + 2.5V causa fluctuaciones en el número de conteos y sin la compensación tengo un lectura constante del conteo de pulsos, ¿se espera? yo creo que sí
  • Compruebe los niveles de entrada en el Arduino. El nivel bajo debe estar en (o muy cerca) de tierra, mientras que el nivel alto debe estar cerca del suministro positivo de Arduino ', que supongo que es de 5 voltios.

Responder

Está reiniciando IRQcount cada vez que pasa el ciclo.

Comentarios

  • Creo que ' está bien. Ponga a cero el contador, habilite las interrupciones, demore y luego imprima el número de interrupciones al final de la demora.
  • Eso ' no es un problema.
  • ¿Cuáles son las unidades en delay ()? No ' t programo Audrino, pero ¿son tics o ns?
  • @ mjh2007 milisegundos, entonces ' s definitivamente lo suficientemente largo.
  • Arduino delay() está en ms.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *