Tæller impulser ved hjælp af Arduino Uno

Jeg prøver at tælle impulser fra en bølgeformgenerator ved hjælp af en Arduino Uno. Bølgeformgeneratoren indstilles til følgende indstillinger:

  • Bølgeformtype: Impuls
  • Freq: 20 Hz (50ms)
  • Amplitude: 3,0 Vpp
  • Offset: 0V
  • Width = 5ms

Indtil videre får jeg kun 0er vist på min serielle skærm.

Her er det, jeg har prøvet indtil videre:

1) Brug af pulseIn () og pulseInLong () -> ingen succes

2) Kontroller ledningsforbindelser -> Brugt multimeter til at kontrollere og de er korrekt tilsluttet.

3) Tilslut et oscilloskop for at se, om bølgeformen genereres -> Bølgeformen genereres som vist på billederne nedenfor.

Bemærk: Bølgeformen generator er en del af oscilloskopet:

Bølgeformgenerator

Forbindelsesdiagram

Min kode vises nedenfor:

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

  • Jeg ved ikke ' om det vil være standard til input bu t skal du bruge pinMode(pin, mode)?
  • Er " lav " del af din bølgeform ved 0V eller ved -1,5V?
  • Fra ' omfangsfotoet er signalets lave niveau -1,5 volt , og det høje niveau er 1,5 volt. 1,5 volt er sandsynligvis for lav spænding til at blive genkendt som en logik High af Arduino.
  • For at være venlig over for Arduino-indgangene skal du indstille signalgeneratoren til 5 Vpp og ændre forskydningen til + 2,5 volt, så signalet skifter mellem 0 og + 5V (forudsat at Arduino Vcc er 5 volt.) De digitale indgange på mikrocontrolleren skal ikke køres negativt.
  • Åh jeg ser, jeg ændrede forsinkelsen til 250 ms, det er derfor, jeg så resultatet = 5, men nu ændrede jeg det tilbage til 500 ms, og nu ser jeg resultatet = 10, kan du forklare, hvordan man kontrollerer, om pulsantalet er korrekt?

Svar

  1. Som Peter Bennett og andre påpegede, havde du oprindeligt indstillet 3Vpp eller en puls alternerende + 1,5V til -1,5v . I henhold til Elektriske egenskaber ved Arduinos controller , kan 1,5 V ikke garanteres at blive læst som “1”. Det skal være mindst 0,6 Vcc. Derfor er din irq pin kan ikke genkende kantovergange, i stedet læses det “0” hele tiden. Og det er ikke meningen, at du også skal køre -ve spænding til I / O-benene for at undgå skader !!
  2. Pulsfrekvensen er 20 Hz eller 20 impulser pr. sekund. Med 500ms forsinkelse tæller du, hvor mange impulser der opstår pr. halvt sekund, så result skal være af værdi 10. Det er det, du får vist på seriel skærm.

Svar

Fra “scope-billedet, signalets lave niveau er -1,5 volt, og det høje niveau er 1,5 volt. 1,5 volt er sandsynligvis for lav spænding til at blive anerkendt som en logik High af Arduino.

Arduino digitale indgange kan også blive beskadiget af den negative spænding. Indgangene på de fleste digitale ICer er designet til at acceptere indgange mellem jord og den positive forsyningsspænding.

Hvis Arduino betjenes fra +5 volt, skal du indstille signalgeneratoren til 5 Vpp med en +2,5 volt forskydning for at holde signalet inden for Arduino ” s indgangsspændingsgrænser.

For at blive anerkendt som en logik High skal indgangsspændingen være over 0,7 Vcc eller 3,5 volt – lavere spændinger genkendes muligvis ikke som High, så det udløser ikke en afbrydelse.

Kommentarer

  • Jeg har indstillet det til 5Vpp, men + 2.5V offset forårsager udsving i antallet af tællinger og uden forskydningen har jeg en konsekvent aflæsning af pulsantal, forventes det? det ville jeg tro
  • Kontroller inputniveauerne på Arduino. Det lave niveau skal være på (eller meget tæt på) jorden, mens det høje niveau skal være tæt på Arduino ' s positive forsyning, som jeg antager er 5 volt.

Svar

Du nulstiller IRQcount hver gang gennem løkken.

Kommentarer

  • Jeg tror, at ' er OK. Nulstill tælleren, aktiver afbrydelser, forsink og udskriv derefter antallet af afbrydelser i slutningen af forsinkelsen.
  • At ' ikke er et problem.
  • Hvad er enhederne med forsinkelse ()? Jeg programmerer ikke ' Audrino, men er det kryds eller ns?
  • @ mjh2007 millisekunder, så det ' er bestemt længe nok.
  • Arduino delay() findes i ms.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *