68tjs:
Attention de ne pas généraliser, ce que tu dis n'est valable que si on reste dans l' "univers de programmation arduino".
Oui je reste dans le cadre "arduino", pour de la "vrai" PWM (fiable et bien conçu) on préférera des fréquences de plusieurs KHz pour quelle ne soit pas audible.
(Du reste en bricolant un peu dans le sens inverse il est possible de transformer n'importe quel moteur en instrument de musique ;))
68tjs:
En résumé il ressort de ces échanges très constructifs que mixer les univers arduino/avr-libc est super casse cou.
En résumé rien ne vaut eclipse, la toolchain avr-gcc et la doc de la avr-libc
Arduino c'est bien, mais dés que l'on veut faire quelques chose de plus poussé avr-c c'est bien mieux (et plus simple parfois).
MrAlexis44600:
Ok après relecture de la datasheet et un peu de réflexion, je pense avoir compris comment les dev ont fait pour gérer les millis() en même temps que la pwm...
Regarde dans wiring.c -> tu auras le fonctionnement de millis() et micros()
Regarde dans wiring_analog.c -> tu auras le fonctionnement de analogWrite()
Le principe est simple, le générateur de PWM est toujours en marche avec une interruption de type timer_overflow (disponible en mode FastPWM).
L'interruption incrémente le compteur de millis() et un compteur de "fraction de temps", millis() ne fait que lire son compteur, micros() lui se base sur le compteur de fraction de temps et l'état courant (à l'appel de micros()) du compteur du timer pour déduire un nombre de cycles, précis à 4µs prés.
AnalogWrite() ne fait qu'une seule chose, elle connecte la sortie du générateur de PWM à la broche OCxn en plaçant le "1" dans la case du registre qui va bien.
Et elle modifie le registre du générateur de PWM OCR0x en conséquence.
L'interruption de type 'overflow est donc toujours au même moment (à l'overflow du timer) quelque soit la valeur du générateur de PWM.
Une pierre, deux coups.
MrAlexis44600:
Et comme le dis 68tjs, si on touche à la fréquence de découpage, on touche (au moins?) aux fonctions millis, micros et delay; et je trouve dommage que le site Arduino ne donne pas plus de détails, je n'ai absolument pas le niveau pour relire le code source de analogWrite() et millis().
Le site arduino a un gros défaut, la documentation n'est que superficielle.
Pour un débutant c'est parfait, pour un utilisateurs expérimenté c'est insupportable.
En plus le code source en lui même contient des choses incohérente, des commentaires à faire pâlir un dév (du genre "this should works"), et mériterai une refonte complète sur certains points ...
MrAlexis44600:
Pour la coupe de robotique l'année prochaine je compte mélanger code Arduino et AVR, j'essaierai de penser à faire un retour d'expérience.
Mauvaise idée
Si le code doit être publié, soit tu écrit tout en arduino, soit tout en avr-c/c++ ne t'amuse pas à mélangé les genres ça ferait pas bonne figure.