Pulsen tellen met Arduino Uno

Ik probeer pulsen van een golfvormgenerator te tellen met een Arduino Uno. De golfvormgenerator is ingesteld op de volgende instellingen:

  • Golfvormtype: puls
  • Freq: 20 Hz (50 ms)
  • Amplitude: 3,0 Vtt
  • Offset: 0V
  • Breedte = 5ms

Tot nu toe krijg ik slechts 0s weergegeven op mijn seriële monitor.

Hier is wat ik tot nu toe heb geprobeerd:

1) PulseIn () en pulseInLong () gebruiken -> geen succes

2) Controleer bedradingsverbindingen -> Gebruikte multimeter om te controleren en ze zijn correct aangesloten.

3) Sluit een oscilloscoop aan om te zien of de golfvorm wordt gegenereerd -> De golfvorm wordt gegenereerd zoals weergegeven in onderstaande afbeeldingen.

Opmerking: de golfvorm generator maakt deel uit van de oscilloscoop:

Waveform Generator

Verbindingsschema

Mijn code wordt hieronder weergegeven:

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

Reacties

  • Ik weet niet ' of het standaard zal zijn input bu Moet je pinMode(pin, mode) gebruiken?
  • Is de " laag " deel van je golfvorm bij 0 V of bij -1,5 V?
  • Van de ' scoopfoto is het lage signaalniveau -1,5 volt , en het hoge niveau is 1,5 volt. 1,5 volt is waarschijnlijk een te lage spanning om door de Arduino als een logic high te worden herkend.
  • Om vriendelijk te zijn voor de Arduino-ingangen, moet je de signaalgenerator instellen op 5 Vtt, en de offset wijzigen in + 2,5 volt, dus het signaal schakelt tussen 0 en + 5V (ervan uitgaande dat de Arduino Vcc 5 volt is). De digitale ingangen op de microcontroller mogen niet negatief worden aangestuurd.
  • O ja, ik heb de vertraging gewijzigd in 250 ms daarom zag ik resultaat = 5 maar nu veranderde ik het terug naar 500 ms en nu zie ik resultaat = 10, kun je uitleggen hoe je kunt controleren of het aantal pulsen correct is?

Answer

  1. Zoals Peter Bennett en anderen opmerkten, had je aanvankelijk 3 Vpp ingesteld, of een puls die afwisselend + 1,5 V tot -1,5 V afwisselde . Volgens de elektrische kenmerken van de Arduino-controller , wordt niet gegarandeerd dat 1,5 V wordt gelezen als “1”. Het moet ten minste 0,6 Vcc zijn. irq pin kan randovergangen niet herkennen, maar leest altijd een “0”. En het is niet de bedoeling dat je ook spanning naar de I / O-pinnen stuurt om schade te voorkomen !!
  2. De pulsfrequentie is 20 Hz of 20 pulsen per seconde. Met een vertraging van 500 ms tel je hoeveel pulsen er per halve seconde voorkomen, dus result zou de waarde 10 moeten hebben. Dat is wat u op een seriële monitor te zien krijgt.

Antwoord

Van op de “scope-foto, het lage niveau van het signaal is -1,5 volt, en het hoge niveau is 1,5 volt. 1,5 volt is waarschijnlijk een te lage spanning om door de Arduino als een logic high te worden herkend.

Ook kunnen de digitale ingangen van de Arduino beschadigd raken door de negatieve spanning.De ingangen op de meeste digitale ICs zijn ontworpen om te accepteren ingangen tussen aarde en de positieve voedingsspanning.

Als de Arduino wordt bediend vanaf +5 volt, moet je de signaalgenerator instellen op 5 Vtt, met een offset van +2,5 volt om het signaal binnen de Arduino te houden ” s ingangsspanningslimieten.

Om te worden herkend als een logische hoge spanning, moet de ingangsspanning hoger zijn dan 0,7 Vcc of 3,5 volt – lagere spanningen worden mogelijk niet herkend als een hoge spanning, dus zal geen onderbreking veroorzaken.

Opmerkingen

  • Ik heb het ingesteld op 5Vpp, maar de offset van + 2.5V veroorzaakt fluctuaties in het aantal tellingen en zonder de offset heb ik een consistente pulstelling, wordt dat verwacht? ik denk het wel.
  • Controleer de ingangsniveaus op de Arduino. Het lage niveau moet op (of zeer dicht bij) de aarde zijn, terwijl het hoge niveau dicht bij de positieve voeding van de Arduino ' moet zijn, waarvan ik aanneem dat deze 5 volt is.

Answer

Je stelt IRQcount elke keer in de lus opnieuw in.

Reacties

  • Ik denk dat ' ok is. Zet de teller op nul, schakel de onderbrekingen in, stel de vertraging in en druk vervolgens het aantal onderbrekingen aan het einde van de vertraging af.
  • Dat ' is geen probleem.
  • Wat zijn de eenheden op delay ()? Ik ' programmeer Audrino niet, maar zijn dat tikken of ns?
  • @ mjh2007 milliseconden, dus het ' s zeker lang genoeg.
  • Arduino delay() is in ms.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *