[resolu]fréquence minimale de tone() ?

bonjour à tous

j'essaye de trouver un moyen de faire clignoter une led sans monopoliser le processeur avec des delay(), et en lisant la documentation de tone(), je n'ai trouvé nulle part mention d'une fréquence minimale. Juste dans un des exemples la fréquence minimale est réglée à 10Hz, mais comme il s'agit de sortir sur un HP, c'est logique, en dessous on entendrait rien.

Alors je me suis dit banco, ça devrait aller.

Quelques essais plus tard, déception... en dessous de environ 100Hz, la fréquence obtenue est différente de celle demandée, par exemple voila ce qu'on a pour 10Hz demandés (le code arduino est réduit à sa plus simple expression, ce n'est donc pas lui qui interfère)

void setup(){
tone(9,10);
}
void loop(){
}

soit une période de 0,513ms, soit... 1,9kHz. Oups.

Là où je ne comprends vraiment plus rien, c'est que lorsque je demande un signal à 1Hz, j'obtiens ça :

Ce qui ressemble fichtrement à un carré à 1Hz, ou pas loin (0,92, en l'occurence). Très bien, super... sauf que la LED qui est connectée à la pin 9 délivrant ce signal reste allumée fixe.

Et si en fait on change la base de temps de l'oscillo, on obtiens ça :

soit un semblant de carré avec un décroché sur les front montants et descendants, qui se décale, formant ces sortes de triangle comme une modulation. D'après l'oscillo, ce signal est à environ 60Hz.

et si on réduit encore la période de balayage, on a alors ça :

soit un superbe carré à 60Hz, et cette fois si je réduit encore la période de balayage, ça en reste là. 60Hz, c'est cohérent avec le fait que le LED reste allumée fixe, à 60Hz on ne voit pas le clignotement.

Je suis assez perplexe également sur le fait que l'oscillo m'affiche en premier lieu un carré à 1Hz alors qu'il n'y est manifestement pas, mais je suppose que c'est du à une interférence entre la fréquence d'acquisition de l'oscillo et les petits décrochés qui semblent former la modulation en triangle.

J'ai fait ces essais avec une arduino Uno R2, et une Nano V3, le résultat est similaire.

L'oscillo utilisé est un DSO Quad DS203.

L'IDE arduino est le 1.0

Donc voila, je ne sais pas si c'est un bug de la fonction tone, mais en tout cas y'a un truc qui foire.

Bonsoir,

Pourquoi n'utilises tu pas une sortie PWM pour faire clignoter ta led ?
C'est vrai ça ne répond pas à ta question ! :grin:
icare

Bien tenté, mais non :stuck_out_tongue: parceque la PWM, tu peux faire varier le ratio, donc la luminosité de la LED, mais le fréquence reste de 490Hz dans tous les cas.

L'objectif étant d'avoir un clignotement visible pour signaler une erreur. Et d'avoir plusieurs vitesses de clignotement en fonction de la gravité de l'erreur, qui plus est.

Re,

Je re-tente ma chance tant que j'ai du crédit je re-joue !!! Soyons sérieux.

Tu peux dans ta boucle principale avoir une variable alimentée par millis() et en faisant un test a chaque passage (milli_actuel - milli_ancien) faire clignoter ta led. La vitesse de clignotement dépendra de la valeur que tu fixeras.
Ce principe ne surchargera pas le processeur :stuck_out_tongue:
icare

ouaip, c'est ce que je vais devoir faire. Mais des fonctions qui font déjà des trucs dans ce genre, j'en ai déjà un voyage, et ça me complique le code. Si a avait pu être déjà tout fait en bas niveau en utilisant les timers matériels de l'atmega, comme dans le cas de tone(), j'aurais bien aimé...

Bon, le forum anglais m'a donné la solution : en fait la fonction tone() inclue dans le code arduino de base est une version allégée de la librairie Tone.h disponible ici :
http://code.google.com/p/rogue-code/wiki/ToneLibraryDocumentation

et elle utilise seulement un timer 8 bits, ce qui ne permet pas de descendre en dessous de 31Hz. Ceci explique cela.

Pour aller jusqu'a 1Hz, il faut utiliser un timer 16bits, et pour cela il faut employer la version complète de Tone, disponible sur le lien précédent.

N’empêche que j'aimerai bien comprendre le bug d'affichage de mon oscillo, mais ça c'est une autre question.