Jessaie de compter les impulsions dun générateur de formes donde en utilisant un Arduino Uno. Le générateur de forme donde est réglé sur les paramètres suivants:
- Type de forme donde: Impulsion
- Fréquence: 20 Hz (50ms)
- Amplitude: 3,0 Vpp
- Décalage: 0V
- Largeur = 5ms
Jusquà présent, je nai que des 0 affichés sur mon moniteur série.
Ici est ce que jai essayé jusquà présent:
1) Utilisation de pulseIn () et pulseInLong () -> aucun succès
2) Vérifiez les connexions de câblage -> Multimètre utilisé pour vérifier et ils sont correctement connectés.
3) Raccordez un oscilloscope pour voir si la forme donde est en cours de génération -> La forme donde est générée comme indiqué dans les images ci-dessous.
Remarque: La forme donde générateur fait partie de loscilloscope:
Mon code est affiché ci-dessous:
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); }
Commentaires
Réponse
- Comme Peter Bennett et dautres lont souligné, vous aviez initialement réglé 3Vpp, ou une impulsion alternant + 1,5V à -1,5v . Selon les Caractéristiques électriques du contrôleur Arduino , il nest pas garanti que 1,5 V soit lu comme « 1 ». Il doit être au moins 0,6 de Vcc. La broche
irq
ne peut pas reconnaître les transitions de front, mais elle lit toujours un « 0 ». Et vous nêtes pas censé fournir une tension -ve aux broches dE / S pour éviter tout dommage. !! - La fréquence des impulsions est de 20 Hz ou 20 impulsions par seconde. Avec un retard de 500 ms, vous comptez le nombre dimpulsions qui se produisent par demi-seconde, donc
result
doit avoir une valeur de 10. Cest ce que vous obtenez sur le moniteur série.
Réponse
De la « photo de la lunette, le niveau bas du signal est de -1,5 volts, et le niveau haut est de 1,5 volts. 1,5 volts est probablement une tension trop basse pour être reconnue comme une logique High par lArduino.
En outre, les entrées numériques Arduino peuvent être endommagées par la tension négative. Les entrées de la plupart des circuits intégrés numériques sont conçues pour accepter entrées entre la terre et la tension dalimentation positive.
Si lArduino fonctionne à partir de +5 Volts, vous devez régler le générateur de signal sur 5 Vpp, avec un décalage de +2,5 volts pour maintenir le signal dans lArduino » s limites de tension dentrée.
Pour être reconnu comme un haut logique, la tension dentrée doit être supérieure à 0,7 Vcc, ou 3,5 volts – les tensions inférieures peuvent ne pas être reconnues comme un haut, donc ne déclenchera pas dinterruption.
Commentaires
- Je lai réglé sur 5Vpp, mais le décalage + 2.5V provoque des fluctuations dans le nombre de comptages et sans le décalage jai un lecture constante du nombre dimpulsions, est-ce prévu? Je pense que oui
- Vérifiez les niveaux dentrée sur lArduino. Le niveau bas doit être à (ou très proche de) la terre, tandis que le niveau haut doit être proche de lalimentation positive de lArduino ', qui, je suppose, est de 5 volts.
Réponse
Vous réinitialisez IRQcount à chaque fois dans la boucle.
Commentaires
- Je pense que ' est OK. Remettez à zéro le compteur, activez les interruptions, retardez puis imprimez le nombre dinterruptions à la fin du retard.
- Cela ' nest pas un problème.
- Quelles sont les unités sur delay ()? Je ne programme ' t Audrino, mais est-ce que cest ticks ou ns?
- @ mjh2007 millisecondes, donc cest ' est certainement assez long.
- Arduino
delay()
est en ms.
pinMode(pin, mode)
?