J-M-L:
Mettre la liaison série au minimum à 115200 voire 230400 avec Le PC aidera aussi à ne pas saturer le petit buffer de 64 octets en sortie. s'il est plein l'appel print devient bloquant (et print pas possible bien sûr dans une interruption)
D'accord j'ai cru lire que 250 000 baud était un quelque sorte une limite en USB mais je n'ai pas trop approfondi ma recherche pour le moment je me suis contenté des résultats de recherche de Google sans même ouvrir les pages :-[ . Donc je note pour le 230 400 baud.
Je viens de retrouver le bout de programme qu'on m'avait donné à l'époque ou je ne savais rien de rien concernant l'Arduino.
/*
mesure de fréquence avec envoi sur la liaison série0 TX0 -> USB
Frequency Input Pin : 49 (PL0, ICP4)timer4
Pins Unusable with analogWrite() : 6, 7 et 8 (OCR4 tmer4)
carte Mega 2569
*/
#include "FreqMeasure.h"
#define Led_13 13
unsigned long time ,
time_init;
String TEXTE;
void setup()
{
pinMode(Led_13,OUTPUT);
pinMode(49,INPUT_PULLUP);
Serial.begin(250000);
Serial.println("temps (s) ; frequence (Hz)");
FreqMeasure.begin();
}
void loop()
{
while(!FreqMeasure.available()) {} //attente première mesure
time = micros();
time_init = time;
//
double frequency = FreqMeasure.read();
frequency = F_CPU / frequency;
TEXTE = String(1e-6 * (time - time_init),6); //conversion un nombre à virgule en chaine (6 chiffres après la virgule)
TEXTE.replace(".",","); //remplace dans la chaine le caractère le "." en ","
Serial.print(TEXTE);
Serial.print(";");
TEXTE = String(frequency);
TEXTE.replace(".",",");
Serial.println(TEXTE);
while(1) { //boucle mesure de fréquence
if (FreqMeasure.available())
{
time = micros();
double frequency = FreqMeasure.read();
frequency = F_CPU / frequency;
TEXTE = String(1e-6 * (time - time_init),6); //conversion un nombre à virgule en chaine (6 chiffres après la virgule)
TEXTE.replace(".",","); //remplace dans la chaine le caractère le "." en ","
Serial.print(TEXTE);
Serial.print(";");
TEXTE = String(frequency);
TEXTE.replace(".",",");
Serial.println(TEXTE);
}
}
}
On avait des soucis d'acquisition à plus de 300 Hz pas avant (on avait comparé les valeurs avec celles d'un oscilloscope au lycée). Du coup au début n'ayant qu'un seul capteur je m'étais dis que ça irait et puis maintenant que je me débrouille plus avec Arduino et que je sais un peu me débrouiller avec le code quand je vois ce code ça me semble pas être le chemin le plus court.
Petite question, l'interruption nécessite apparemment 2 à 3 ms soit 0.002s à 0.003s seconde hors j'ai deux capteurs qui pourrait arriver à envoyer une information toutes les 0.004s. Ça va le faire?
trimarco232:
Bonjour,
il faudrait éviter de faire faire 99% du travail à l'appareil qui n'a que 1% de la puissance
remplace "Capteur_1 " par "C_1", puis fait Edition, Remplacer C_1 par Capteur_1 .
Cette partie du code est dans le setup au moment de l'initialisation de l'Arduino
. Pour la suite il ne m’envoie que la valeur de millis(). J'aime bien l'idée du 99% du travail à celui qui a 1% de puissance!
bricofoy:
l'interruption stoppe le compteur qui incrémente la valeur de millis(), mais millis() retournera toujours une valeur : la dernière à avoir été mise à jour juste avant l'interruption. ce sera donc quand même relativement précis.
le compteur repart ensuite dès que la routine d'interruption est terminée. Tu n'aura perdu que le nombre de cycles d'horloge necessaire à la routine d'interruption, d'où l'intéret de la rendre la plus courte possible.
et donc utiliser serial dans une routine d'interruption, il vaut mieux éviter, déja parceque c'est long, et puis aussi toujours parceque le passage en interruption désactive les interruptions, et que serial les utilise.
ce qui me semblerait plus fonctionnel serait que la routine d'interruption attribue la valeur de millis() à une variable (et c'est tout) et que ce soit ensuite dans ta boucle loop que tu te charge de faire l'envoi des données sur le port série si la variable a été modifiée. Ce serait également plus facile pour faire la mise en forme ainsi.
250Hz ce n'est pas énorme ça doit passer sans problèmes, en revanche le point limitant ici ça va être la vitesse de la liaison série, sinon tu va perdre des mesures.
D'accord, donc je vais modifier mon code en conséquence.
Du coup je m'y remet et je repasse pour voir avec vous si c'est bon
.