Prologue
Tout est parti d'un post de Sylvain sur les forums de Planete-sciences, à propos d'un générateur PWM Spread Spectrum pour moteur. Il proposait d'en coder un en VHDL. Seulement voilà, le VHDL, c'est comme croiser les rayons, c'est mal... Alors, en voici un, mais en Verilog !
Plus sérieusement, à quoi sert un modulateur SSPWM ? Les moteurs des robots sont généralement commandés en PWM (modulation de largeur d'impulsion). Pour faire varier la puissance moyenne envoyée au moteur, on les alimente par un créneau de fréquence constante dont on fait varier le rapport cyclique.
La fréquence de commande est choisie :
- au dessus d'une certaine valeur (pour que le courant moyen dans le
moteur ne varie pas trop) : si on accepte une variation de P% de
l'intensité dans le moteur sur une période, alors :
. On n'oubliera pas de prendre en compte dans R la résistance du moteur et celle des transistors du pont en H.
- au dessous d'une certaine valeur, pour limiter les pertes lors de la commutation des transistors du pont en H.
Le problème est que, si la fréquence choisie est plus petite que 20kHz, elle tombe dans le spectre audible : les moteurs sifflent. Ça peut être attractif et amusant pendant quelques minutes, ça devient vite énervant... La solution ? Utiliser une fréquence variable.
On fait varier rapidement la fréquence du PWM, tout en gardant le même rapport cyclique. Le bruit résultant est alors réparti sur plusieurs fréquences, de puissances plus faibles. Selon la répartition de ces fréquences, le bruit ressemble à un chuintement plus ou moins aigu. En d'autres termes, au lieu d'avoir un spectre sonore avec un grand pic, on a un spectre plus large, plus plat, et plus bas : il est étalé, d'où le nom du système (spread spectrum).

Spectre PWM (bleu) / spread spectrum idéal (rouge)
Comment fait-on un modulateur PWM spread spectrum (appelé aussi
Random PWM) ? Il existe des circuits intégrés ou des cartes toutes
faites, généralement utilisés pour le contrôle de moteurs alternatifs
puissants. Pour des robots, une solution existe : les FPGA.
Les FPGA
En deux mots, les FPGA sont des circuits programmables contenant des portes logiques en vrac. Lors de la programmation, on décrit la façon dont on va relier ces portes logiques entre elles. On peut ainsi implémenter la fonction logique que l'on souhaite.
La fonction à obtenir peut être décrite sous forme schématique, ou textuelle, à l'aide d'un langage spécialisé (Verilog, VHDL, SystemC, AHDL, Abel, ...). Les FPGA ont un intérêt tout particulier en robotique : ils permettent d'ajouter des fonctionnalités simples et pratiques à moindre frais à un micro-contrôleur :
- générateur PWM (pour tous les moteurs du robot, parce que ça ne nécessite que peu de portes)
- compteur d'impulsions et décodeur de quadrature des roues codeuses, au passage on peut même calculer la position du robot
- génération des signaux de contrôle des servos
- réception, filtrage, stockage et traitement de vidéo numérique
- contrôle des effecteurs, mise en forme des capteurs, ...
Ainsi le processeur peut être réservé à des tâches plus complexes (vision, intelligence, ...).
Cet article montre comment implémenter un modulateur PWM spread spectrum dans un FPGA. Le code est suffisamment générique pour être utilisé tel quel dans tout type de FPGA. Le langage choisi est Verilog. D'abord parce que c'est un langage simple et aussi puissant que VHDL, et surtout parce qu'il existe des simulateurs libres (GPL) de Verilog : Icarus Verilog et Cver. Si on utilise Cver, on fera attention à prendre au moins la version 2.11a. Si vous préférez VHDL, la traduction du code en VHDL est assez simple et directe.
Pour plus de détails sur Verilog et VHDL, on pourra se rapporter au cours en ligne de Verilog, VHDL et SystemC de l'ENST