Malheureusement, les fonctions delay*() ne sont jamais très précises et chaotiques à la base. Ensuite, les digitalWrite() ne prennent pas forcément le même temps d'éxécution (j'ai déjà fait un relevé d'un simple ON/OFF sur une pin sans délai : le signal vibre, il est très loin d'être régulier). Les analogRead ne sont pas constants non plus.
Bref, je te propose de tout reprendre à zéro et de bien te prendre la tête (mais je t'aiderai si tu n'es pas trop pressé, ce week-end). Il va falloir que tu utilises un timer 16 bits (timer1 par exemple), et surtout que tu oublies toutes les fonctions déjà toutes faites du core arduino si tu cherches un minimum de précision.
Si j'ai bien compris, tu as un potar pour la fréquence et un autre pour le rapport cyclique? On utilisera donc le timer 4, qui possède une fonction PWM en hard (c'est-à-dire que c'est déjà électroniquement câblé dans la puce). Il va falloir configurer les registres du timer dans le setup, puis le reste se fera tout seul, tu n'auras à utiliser ni les fonctions delay(), ni digitalWite().
Ton loop ressemblera alors à ceci :
void Loop(){
f = analogRead(FPIN); // lecture de la fréquence
x = analogRead(RPIN); // lecture du rapport cyclique
calcul(f, x); // mise à jour du timer (quelques µs max)
// et c'est tout...
}
La fonction calcul() se contentera juste de trouver la bonne valeur à donner aux registres du timer4. Le timer4, une fois configuré se débrouillera tout seul pour que ton signal apparaisse en continu sur une pin (que tu ne pourras cependant pas choisir, puisque c'est déjà câblé dans la puce). Tu pourras donc rajouter tout ce que tu veux comme fonctions dans ton programme, car une fois que tu auras renseigné les registres du timer, il tournera en boucle tout seul dans son coin et de manière totalement transparente vis-à-vis du programme (ne ralentira donc pas du tout le programme).
J'espère que tu n'es pas allergique à l'anglais, il va falloir étudier un peu le datasheet du ATMEGA2560 que je te propose de télécharger dès maintenant sur le site de ATMEL (http://www.atmel.com/Images/doc2549.pdf) et de commencer à regarder un peu, je te guiderai au milieu des 448 pages, n'aies pas peur, c'est pas si compliqué...
J'ai choisi le timer 4, on aurait pu prendre le 1, 3 ou 5 aussi, mais c'est le 4 qui semble le moins contraignant si tu dois ajouter des fonctions à ton programme. Autant préparer le terrain, mais la config de ces 4 timers est identique (ce qui veut dire qu'avec 8 potars, tu pourrais générer 4 signaux PWM de fréquence et rapport cyclique indépendants).
on en reparle demain?