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:
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
Respuesta
- 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 !! - 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.
pinMode(pin, mode)
?