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