de tijd van een loop meten.

Arduino specifieke Software
Berichten: 28
Geregistreerd: 30 Nov 2013, 23:49

de tijd van een loop meten.

Berichtdoor Luppie » 05 Dec 2013, 00:07

Hoe kan ik zien hoe snel mijn loop is?

Ik vond een stukje code die het zou moeten kunnen ik krijg alleen vreemde waarden.

Code: Alles selecteren
Define 2 variables:
unsigned long time0 = 0;
unsigned long time1 = 0;
unsigned long time_ms = 0;

at start of your loop, take a time measurement:
time0=millis();

at the end, take a 2nd:
time1=millis();

then subtract:
time_ms = time1 - time 0;


Code: Alles selecteren
9850752
9862313
9870709
9882249
9890664
9902221
9910644
9922197
9930034
9942245
9950005
9962217
9970633
9982225
9989861
10002217


Ik wil testen of ik voor het lezen van pwm ingangen beter PinChangeInt.h kan gebruiken ipv pulseIn. De loop moet zo snel mogelijk zijn

Advertisement

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

Re: de tijd van een loop meten.

Berichtdoor nicoverduin » 05 Dec 2013, 00:24

Wat is hier mis aan dan?
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 4
Geregistreerd: 05 Dec 2013, 03:05

Re: de tijd van een loop meten.

Berichtdoor albert-geert » 05 Dec 2013, 03:34

op zich zou de code moeten werken maar vind dat de volgende code nuttiger is.
verder heb ik het idee dat de code zoals weergegeven niet helemaal goed is gebruik want een loop tijd van ruim 2 uur lijkt me wel erg bijzonder "zelfs voor een arduino".

unsigned long time0= 0;

void setup() {
Serial.begin(115200); //definieer seriële poort en zet de seriële snelheid naar maximaal om de loop zo weinig mogelijk te vertragen.
}

void loop() {
time0=millis(); // sla aan het begin van de loop de milliseconden sinds de start van de arduino op

/*******************************/
/* voeg hier je eigen code toe */
/*******************************/
Serial.println(millis()-time0); // trek begin van einde af en verstuur dit via seriële poort naar ..........
}

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

Re: de tijd van een loop meten.

Berichtdoor nicoverduin » 05 Dec 2013, 08:26

Op het vullen dan de variabele is het toch gewoon hetzelfde?
Verder weet ik niet wat de eigenlijke code doet. Dus ik kan daar geen oordeel over geven vwb. de duur. Ik zou zelf trouwens microseconds() gebruiken. millis() is maar per msec. En als jij wil testen wat sneller is dan geeft dit nog een behoorlijke onnauwkeurigheid.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 108
Geregistreerd: 07 Aug 2013, 21:34

Re: de tijd van een loop meten.

Berichtdoor KrisG » 05 Dec 2013, 11:03

Als je de looptijd van een loop in de loop zelf meet zorg je toch intrinsiek zelf voor een bijkomende vertraging ?
Je zou het kunnen meten met een tweede arduino, die dan bvb gaat meten waneer een puls binnenkomt en die tijd weergeeft.

Kris
Als je het probleem gedetailleerd genoeg omschrijft, heb je meestal al de oplossing.

Berichten: 4
Geregistreerd: 05 Dec 2013, 03:05

Re: de tijd van een loop meten.

Berichtdoor albert-geert » 05 Dec 2013, 18:22

het is inderdaad zo dat het meten van de looptijd het programma vertraagt maar door de hoge snelheid van de seriële en een zo klein mogelijk aantal bewerkingen is die vertraging verwaarloosbaar.
verder is het zo dat voor het meten van de loop tijd het beter is om de micros() te gebruiken dat is inderdaad nauwkeuriger, de reden dat ik dat niet in het voorbeeld heb geprogrammeerd is omdat dat ook niet in het eerste voorbeeld werd gebruikt en het is een kwestie van hoe pressies je wil meten, verder is het van belang dat je bij een dergelijke code zo weinig mogelijk opdrachten programmeert omdat elke regel code moet worden uitgevoerd, werkt elke opdracht vertragend op de looptijd.


een voorbeeld van een dergelijke vertraging en onnodig gebruik van variabelen is:

Code: Alles selecteren
 time_ms = time1 - time 0;


wanneer de bovenstaande berekening hebt gedaan zul je nog steeds de berekening moeten weergeven op de een of andere manier.
in mijn voorbeeld gebruik ik maar 1 variabele en doe het weergeven en bereken van de loop tijd in 1 keer dit scheel geheugen de loop tijd word minder vertraagt.

Code: Alles selecteren
Serial.println(millis()-time0);

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

Re: de tijd van een loop meten.

Berichtdoor nicoverduin » 05 Dec 2013, 19:00

Als je werkelijk de loop zo snel mogelijk wilt maken (los van of je nu interrupt driven of niet) zul je eigenlijk naar de assembly moeten om daadwerkelijk het verschil te bepalen. En nu hou je ook nog de optimizer buiten beschouwing.
Overigens ik hoop dat je niet de Serial in de Interrupt handler ga gebruiken. die kan daar slecht tegen.
Overigens stel je ook nog dat de Serial erg snel is. Dat is een van de grootste vertragers. zelfs bij 250K
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 4
Geregistreerd: 05 Dec 2013, 03:05

Re: de tijd van een loop meten.

Berichtdoor albert-geert » 05 Dec 2013, 19:14

nicoverduin schreef:Als je werkelijk de loop zo snel mogelijk wilt maken (los van of je nu interrupt driven of niet) zul je eigenlijk naar de assembly moeten om daadwerkelijk het verschil te bepalen. En nu hou je ook nog de optimizer buiten beschouwing.
Overigens ik hoop dat je niet de Serial in de Interrupt handler ga gebruiken. die kan daar slecht tegen.
Overigens stel je ook nog dat de Serial erg snel is. Dat is een van de grootste vertragers. zelfs bij 250K


heb je inderdaad helemaal gelijk in maar ik heb de seriële poort gebruikt als voorbeeld om de data te kunnen lezen, je gaat nu een beetje voorbij aan wat ik al zij, namelijk wat heb je aan dat als je deze niet kan uitlezen of gebruiken, of je nu een lcd display, led display, serieel of welke andere methode je ook gebruikt je hebt niets aan data waar je niks mee doet.

Berichten: 28
Geregistreerd: 30 Nov 2013, 23:49

Re: de tijd van een loop meten.

Berichtdoor Luppie » 06 Dec 2013, 01:07

bedankt voor de reacties.

Ik was er achter dat ik inderdaad mircos moet gebruiken.
Ik las ergens dat de pulseIn die ik gebruik voor pwm lezen heel traag is. Bijvoorbeeld 4 kanalen lezen en weergeven op de seriele monitor ongeveer 250ms en met de PinChangeInt.h was dit ongeveer 50ms. Mijn loop zou in mijn geval op minimaal 50Hz tot 100 Hz moeten draaien maar het liefst 200Hz of meer.

het nadeel van PinChangeInt.h is dat het een behoorlijk stukje extra programmeerwerk oplevert en dat is niet handig voor een eerste project.

Berichten: 28
Geregistreerd: 30 Nov 2013, 23:49

Re: de tijd van een loop meten.

Berichtdoor Luppie » 07 Dec 2013, 23:38

het lijkt allemaal goed te werken maar nog even voor mijn volledigheid nog één (dom)vraagje.

Hij geeft 52740 micros of 52 millis weer. staat dit gelijk aan 0.05 seconden of 20Hz ?


Code: Alles selecteren
loopsnelheid:   52740   micros   
pitch:   1548    PWM   
nick:   1493    PWM   
roll:   1489    PWM   
yaw:   1477    PWM

Volgende

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: idenebyitu en 12 gasten