bloksignaal meten
21 berichten
• Pagina 1 van 3 • 1, 2, 3
bloksignaal meten
Hoi,
in mijn arduino krijg ik een bloksignaal met duty cycle 50%. Nu wil ik zo snel mogelijk de periode meten. maar omdat de duty cycle 50% duurt het hoge gedeelte even lang als het lage gedeelte.
Deze meting moet op een onbekend moment gestart worden dus het slimste is om te starten wanneer er verandering in het signaal plaats vind totdat hij weer veranderd. alleen ik ben net begonnen met programmeren en weet niet hoe ik dit aan moet passen? kan iemand mij hierbij helpen
Groetjes KIp
in mijn arduino krijg ik een bloksignaal met duty cycle 50%. Nu wil ik zo snel mogelijk de periode meten. maar omdat de duty cycle 50% duurt het hoge gedeelte even lang als het lage gedeelte.
Deze meting moet op een onbekend moment gestart worden dus het slimste is om te starten wanneer er verandering in het signaal plaats vind totdat hij weer veranderd. alleen ik ben net begonnen met programmeren en weet niet hoe ik dit aan moet passen? kan iemand mij hierbij helpen
Groetjes KIp
Advertisement
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: bloksignaal meten
interrupt gebruiken. Bij de eerste change pak je de microseconds(). Bij de volgende change weer de microseconds(). De delta sla je op. Beide waarden als volatile unsigned long definieren als ook de delta.
In de loop kun je dan delta bekijken die de laatste waarde laat zien. Hoelang blijft het apparaat aanstaan?
In de loop kun je dan delta bekijken die de laatste waarde laat zien. Hoelang blijft het apparaat aanstaan?
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: bloksignaal meten
Om je op weg te helpen:
cpp code
De rest moet je zelf invullen. Hou er wel rekening mee dat je Serial niet de boventoon laat voeren. Anders kan er nog wel eens wat mis gaan. Je kan ook mllis() gebruiken dan krijg je de waarde in milliseconden. Ik heb deze oplossing toegepast in een programma dat zeepblokjes meet in Malawi (Afrika) en werkt inmiddels al iets van een jaar elke dag.
cpp code
/**
* @file frequentieMeter.ino
* @author Nico Verduin
* @date dd-mm-yyyy
*
* @mainpage frequentieMeter
* <Put your main text description here>
*
*
* @par Version Control
* | Revision | Author | Date |
* | :------- | :----- | :---- |
* | $Revision$ | $Author$ | $Date$ |
*
*
* @par License info
*
* <one line to give the program's name and a brief idea of what it does.>
*
* Copyright (C) 2014 Nico Verduin
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* Program : frequentieMeter Copyright (C) 2014 Nico Verduin
* This is free software, and you are welcome to redistribute it.
*
*/
#include "Arduino.h"
//
// Pin definitions
//
#define interruptPin 2 // pin met inkomende pulse
//
// global variables
//
volatile unsigned long vorigMoment; // laatste moment van interrupt
volatile unsigned long delta = 0; // verschil met de vorige
/**
* @name ISR_PulseIn()
* interrupt service routine voor de input pulsen
*/
void HandleEdgeChange() {
unsigned long nieuweMoment;
//
// haal het moment dat deze interrupt gebeurt op
//
nieuweMoment = micros();
//
// bereken verschil met vorige keer
//
delta = nieuweMoment - vorigeMoment;
//
// en bewaar voor de volgende keer
//
vorigeMoment = nieuweMoment;
}
/**
* @name setup()
* initialize the program
*/
void setup()
{
delta = 0;
//
// zet de ISR aan
//
attachInterrupt(0, HandleEdgeChange, CHANGE);
}
/**
* @name loop()
* main loop of program and runs endlessly
*/
void loop()
{
}
De rest moet je zelf invullen. Hou er wel rekening mee dat je Serial niet de boventoon laat voeren. Anders kan er nog wel eens wat mis gaan. Je kan ook mllis() gebruiken dan krijg je de waarde in milliseconden. Ik heb deze oplossing toegepast in een programma dat zeepblokjes meet in Malawi (Afrika) en werkt inmiddels al iets van een jaar elke dag.
Re: bloksignaal meten
nt ik vraag die functie dan aan vanuit een groter programma weet dus niet hoelang het duurt precies. maar waarom doe je vorigeMoment= nieuweMoment?
maar stel
signaal blijft lopen
hoofdprogramma vraagt waarde aan.
HandleEdgeChange gaat meting verrichten bij interrupt
kan die attachInterrupt(0, HandleEdgeChange, CHANGE); dan bij setup blijven staan? of moet die niet in de HandleEdgeChange functie zelf staan?
Het inputsignaal van de HandleEdgeChange function staat los van het hoofdprogramma
maar stel
signaal blijft lopen
hoofdprogramma vraagt waarde aan.
HandleEdgeChange gaat meting verrichten bij interrupt
kan die attachInterrupt(0, HandleEdgeChange, CHANGE); dan bij setup blijven staan? of moet die niet in de HandleEdgeChange functie zelf staan?
Het inputsignaal van de HandleEdgeChange function staat los van het hoofdprogramma
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: bloksignaal meten
kipkip schreef:nt ik vraag die functie dan aan vanuit een groter programma weet dus niet hoelang het duurt precies. maar waarom doe je vorigeMoment= nieuweMoment?
Anders kan je het verschil met de vorige keer niet bepalen. En daar jij een 50% Duty cycle hebt kun je (en dat doet dit programma ook) zowel de neergaande als opgaande tussenpozen meten
kipkip schreef:maar stel
signaal blijft lopen
hoofdprogramma vraagt waarde aan.
HandleEdgeChange gaat meting verrichten bij interrupt
Het hoofd programma hoeft alleen maar in delta te kijken daar staat het verschil in microseconden.
kipkip schreef:kan die attachInterrupt(0, HandleEdgeChange, CHANGE); dan bij setup blijven staan? of moet die niet in de HandleEdgeChange functie zelf staan?
Het inputsignaal van de HandleEdgeChange function staat los van het hoofdprogramma
Kijk en daar hebben ze nu een arduino site voor : http://arduino.cc/en/Reference/attachInterrupt
Een interrupt routine loopt gewoon door los van het hoofdprogramma. Zie het als een call center.... bovenin hangt een bord met wachtende klanten. Dat wordt los van de snelheid van de medewerkers bijgewerkt. Zo wordt ook de delta automatisch bijgehouden.
Re: bloksignaal meten
oke ik snap het programma bijna, maar hoe kan ik nu die waarde dan opvragen in het hoofdprogramma?
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: bloksignaal meten
Er is een variabele delta die het verschil uitrekent tussen de vorige change en nu. Dat is in microseconden. Er is dus gewoon een variabele "delta" die automatisch wordt bijgewerkt. Dat is dus de reden dat het zo belangrijk is om bij de Arduino reference te lezen over interrupt.......
Re: bloksignaal meten
dus als ik de functie aanroep vanaf het hoofdprogramma:
dan wil ik dus de tijd weten op een bepaalde periode:
Time=HandleEdgeChange;
dan krijg ik de delte:)?
dan wil ik dus de tijd weten op een bepaalde periode:
Time=HandleEdgeChange;
dan krijg ik de delte:)?
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: bloksignaal meten
Nu eerst het verhaal over interrupts lezen en dan je vraag nog eens bekijken...... blijf het niet zeggen.........
Re: bloksignaal meten
sorry ik klink misschien dom, maar ik snap nu denk wel hoe het werkt met die interrupts. het werkt dus als een soort callcenter alleen ik snap nog steeds niet hoe ik die callcenter kan aanroepen in de hoofdfunctie zodat ik delta doorkrijg. het is me gewoon niet duidelijk.
21 berichten
• Pagina 1 van 3 • 1, 2, 3
Wie is er online?
Gebruikers in dit forum: Geen geregistreerde gebruikers en 4 gasten