...while/if... le problème ne s'est finalement pas posé. Je pense que ça s'explique par la gamme de (basse) fréquence qui m'intéresse.
Je reviens donc pour déposer le code final : ça va décidément très très vite : avec une fréquence bridée par interruptions à 60Hz vérifiés/oscillo et pour 40PWM, la loop tourne elle à ...160 kHz! (perso, avec un petit réseau école c'est vrai mais toutes les fonctions d'un grand, ma loop prend 6ms... 6 comparé à 160, y'a de la marge ! et je suis d'ailleurs de plus en plus étonné par ce qu'un Arduino Mega a dans le ventre).
D'autres paramètres (prescaler etc) permettraient une plage de fréquence bien plus haute sans étouffer le CPU ; je fais confiance à l'estimation l'analyseur logique à 10balles de Trimarco.
Le SPI étant largement susceptible d'avoir d'autres usages que de la PWM logicielle, pour l'exemple le code pilote en parallèle des registres indépendants de ceux de la PWM, par exemple pour les pins de polarisation des boosters, pour des signaux etc.
Juste dommage que tout ça ne puisse marcher qu'à condition de ne pas avoir besoin du (seul) SPI harware pour un bus CAN (et très dommage qu'il manque juste une broche au Mega pour pouvoir en créer un second). Mais un SPI logiciel, même moins véloce, pourra quand même abattre du boulot.
Le code en pièce jointe (encore merci à Trimarco)
Bien cordialement