de tijd van een loop meten.
11 berichten
• Pagina 1 van 2 • 1, 2
de tijd van een loop meten.
Hoe kan ik zien hoe snel mijn loop is?
Ik vond een stukje code die het zou moeten kunnen ik krijg alleen vreemde waarden.
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
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
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: de tijd van een loop meten.
Wat is hier mis aan dan?
- albert-geert
- Berichten: 4
- Geregistreerd: 05 Dec 2013, 03:05
Re: de tijd van een loop meten.
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 ..........
}
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 ..........
}
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: de tijd van een loop meten.
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.
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.
Re: de tijd van een loop meten.
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
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.
- albert-geert
- Berichten: 4
- Geregistreerd: 05 Dec 2013, 03:05
Re: de tijd van een loop meten.
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:
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.
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);
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: de tijd van een loop meten.
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
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
- albert-geert
- Berichten: 4
- Geregistreerd: 05 Dec 2013, 03:05
Re: de tijd van een loop meten.
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.
Re: de tijd van een loop meten.
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.
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.
Re: de tijd van een loop meten.
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 ?
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
11 berichten
• Pagina 1 van 2 • 1, 2
Wie is er online?
Gebruikers in dit forum: idenebyitu en 12 gasten