bloksignaal meten

Arduino specifieke Software
Berichten: 11
Geregistreerd: 28 Nov 2014, 16:48

bloksignaal meten

Berichtdoor kipkip » 28 Nov 2014, 16:53

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

Advertisement

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: bloksignaal meten

Berichtdoor nicoverduin » 28 Nov 2014, 18:25

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?
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: bloksignaal meten

Berichtdoor nicoverduin » 28 Nov 2014, 18:39

Om je op weg te helpen:
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.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 11
Geregistreerd: 28 Nov 2014, 16:48

Re: bloksignaal meten

Berichtdoor kipkip » 28 Nov 2014, 18:49

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

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: bloksignaal meten

Berichtdoor nicoverduin » 28 Nov 2014, 19:31

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.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 11
Geregistreerd: 28 Nov 2014, 16:48

Re: bloksignaal meten

Berichtdoor kipkip » 30 Nov 2014, 14:41

oke ik snap het programma bijna, maar hoe kan ik nu die waarde dan opvragen in het hoofdprogramma?

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: bloksignaal meten

Berichtdoor nicoverduin » 30 Nov 2014, 20:10

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.......
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 11
Geregistreerd: 28 Nov 2014, 16:48

Re: bloksignaal meten

Berichtdoor kipkip » 30 Nov 2014, 21:15

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:)?

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: bloksignaal meten

Berichtdoor nicoverduin » 30 Nov 2014, 23:48

Nu eerst het verhaal over interrupts lezen en dan je vraag nog eens bekijken...... blijf het niet zeggen.........
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 11
Geregistreerd: 28 Nov 2014, 16:48

Re: bloksignaal meten

Berichtdoor kipkip » 02 Dec 2014, 03:02

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.

Volgende

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 4 gasten