Räkna pulser med Arduino Uno

Jag försöker räkna pulser från en vågformsgenerator med en Arduino Uno. Vågformsgeneratorn är inställd på följande inställningar:

  • Vågformstyp: Puls
  • Freq: 20 Hz (50ms)
  • Amplitud: 3,0 Vpp
  • Offset: 0V
  • Bredd = 5ms

Hittills får jag bara 0s på min seriella bildskärm.

Här är vad jag har försökt hittills:

1) Använda pulseIn () och pulseInLong () -> ingen framgång

2) Kontrollera ledningsanslutningar -> Använd multimeter för att kontrollera och de är ordentligt anslutna.

3) Anslut ett oscilloskop för att se om vågformen genereras -> Vågformen genereras som visas i bilderna nedan.

Obs: Vågformen generator är en del av oscilloskopet:

Waveform Generator

Anslutningsdiagram

Min kod visas nedan:

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); } 

Kommentarer

  • Jag vet inte ' om det är standard ingång bu t behöver du använda pinMode(pin, mode)?
  • Är " låg " del av din vågform vid 0V, eller vid -1,5V?
  • Från ' omfångsfoto är signalens låga nivå -1,5 volt och den höga nivån är 1,5 volt. 1,5 volt är förmodligen för låg spänning för att erkännas som en logik Hög av Arduino.
  • För att vara snäll mot Arduino-ingångarna bör du ställa in signalgeneratorn för 5 Vpp och ändra förskjutningen till + 2,5 volt, så signalen växlar mellan 0 och + 5V (förutsatt att Arduino Vcc är 5 volt.) De digitala ingångarna på mikrokontrollern ska inte drivas negativt.
  • Åh, jag ändrade fördröjningen till 250 ms det är därför jag såg resultatet = 5 men nu ändrade jag det tillbaka till 500 ms och nu ser jag resultatet = 10, kan du förklara hur man kontrollerar om pulsantalet är korrekt?

Svar

  1. Som Peter Bennett och andra påpekade, ursprungligen hade du ställt in 3Vpp, eller en puls alternerande + 1,5V till -1,5v . Enligt Elektriska egenskaper hos Arduinos styrenhet är 1,5 V inte garanterad att läsas som ”1”. Det borde vara minst 0,6 av Vcc. irq stift kan inte känna igen kantövergångar, istället läses det ”0” hela tiden. Och du ska inte köra -ve spänning till I / O-stiften också för att undvika skador !!
  2. Pulsfrekvensen är 20 Hz eller 20 pulser per sekund. Med 500ms fördröjning räknar du med hur många pulser som inträffar per en halv sekund, så result bör ha värde 10. Det är vad du får visas på seriell bildskärm.

Svar

Från ”scope-bilden, signalens låga nivå är -1,5 volt och den höga nivån är 1,5 volt. 1,5 volt är förmodligen för låg spänning för att erkännas som en logik Hög av Arduino.

Arduino digitala ingångar kan också skadas av den negativa spänningen. Ingångarna på de flesta digitala kretsar är utformade för att acceptera ingångar mellan jord och den positiva matningsspänningen.

Om Arduino manövreras från +5 volt, bör du ställa in signalgeneratorn på 5 Vpp, med en +2,5 volt förskjutning för att hålla signalen inom Arduino ” s ingångsspänningsgränser.

För att kännas igen som en logik Hög måste ingångsspänningen vara över 0,7 Vcc eller 3,5 volt – lägre spänningar kanske inte känns igen som en hög, så det kommer inte att utlösa ett avbrott.

Kommentarer

  • Jag har ställt in den på 5Vpp, men + 2.5V offset orsakar fluktuationer i antalet räkningar och utan offset har jag en konsekvent pulsläsning, förväntas det? jag skulle tro det
  • Kontrollera ingångsnivåerna på Arduino. Den låga nivån ska vara på (eller mycket nära) marken, medan den höga nivån ska vara nära Arduino ' s positiva utbud, vilket jag antar är 5 volt.

Svar

Du återställer IRQcount varje gång genom slingan.

Kommentarer

  • Jag tror att ' är OK. Nollställ räknaren, aktivera avbrotten, fördröja och skriv sedan ut antalet avbrott i slutet av förseningen.
  • Det är ' inte ett problem.
  • Vilka enheter är fördröjda ()? Jag programmerar inte ' Audrino, men är det fästingar eller ns?
  • @ mjh2007 millisekunder, så det ' s definitivt tillräckligt lång.
  • Arduino delay() finns i ms.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *