Un variateur électronique pour mon vélo électrique


Comme vous avez pu le constater ici, je me déplace depuis quelque temps avec un vélo à assistance électrique. J'ai acheté un vélo standard que j'ai équipé d'un kit (moteur moyeu et batterie). J'aurai pu acheter le kit complet avec le contrôleur, mais j'ai préféré le faire moi même, pour le sport et pour pouvoir intégrer des fonctions intéressantes qui n'existent pas dans les contrôleur fourni avec ces kits.

Le moteur moyeu utilisé est un moteur à balais acheté chez Velectris. J'ai choisi un moteur à balais car ils n'ont que 2 fils et sont plus facile à piloter. Le revers de la médaille, c'est que le moteur est un peu plus large, et surtout a un rendement plus faible qu'un moteur sans balais (brushless).

Le moteur est alimenté en 36V par une batterie au lithium 14Ah. Le but du contrôleur est de pouvoir régler finement la puissance moteur grâce un accélérateur. Pour cela, on va hacher la tension batterie pour pouvoir envoyer au moteur une tension moyenne comprise entre 0 et 36V.
C'est ce que l'on appelle une commande PWM (Pulse Width Modulation : modulation par largeur d'impulsion).


Le schéma

Voici le schéma électronique du contrôleur :


Cliquez sur le schéma pour le voir en grand
Cliquez ici pour l'avoir au format pdf

Le coeur du contrôleur est un microcontrôleur PIC, le PIC16F819. Il possède en interne tout ce dont nous allons avoir besoin, notamment une sortie PWM, et des entrées analogiques. De plus, il est très économique.

L'alimentation est basée sur un régulateur linéaire standard LM7805. Une diode zener se charge de baisser la tension d'entrée, car le régulateur n'accepterait pas directement le 36V de la batterie (42V même quand elle est chargée à bloc!).

La mesure de la tension de la batterie s'effectue grâce un simple diviseur de tension par 10 et une entrée analogique du PIC.

La commande de puissance du moteur est faite grâce aux transistors MOS. J'en ai mis 2 en parallèle pour baisser la résistance interne totale et baisser la puissance à dissiper (en particulier les pertes dues aux commutations), mais finalement un seul MOS suffit s'il est bien choisi.
Le PIC ne peut sortir que quelques milliampères sur ses sorties, et ne peux pas piloter directement la gate du MOS à la fréquence de découpage qui sera utilisée (environ 8khz). En effet, la gate du MOS se comporte comme un petit condensateur, qu'il faut charger et décharger à chaque commutation. Et il faut le faire le plus vite possible pour que le MOS fonctionne au maximum en tout ou rien pour limiter les pertes et donc les échauffements. J'ai donc intercalé entre le PIC et la gate du MOS un composant spécialisé, le TC4420. Il sera capable de débiter le courant nécessaire pour piloter la gate du MOS. Vous aurez remarqué la présence d'une diode de roue libre aux bornes du moteur, indispensable si on ne veut pas exploser le MOS à cause des surtensions provoquées par les bobinages du moteur.

Pour mesurer le courant débité par la batterie, j'utilise un shunt de 10 milliohms. Un amplificateur avec un gain de 10 permet de ramener le signal à une valeur mesurable par le PIC. Les AOP ayant toujours une tension de déchet près des tensions d'alimentation (en l'occurence 0V et 5V), j'ai rajouté un offset sur l'entrée grâce à la résistance R7.

Par exemple, si aucun courant ne circule dans le shunt, la tension à ses bornes est de 0V. Sur l'entrée + de l'AOP, on va donc avoir (10K/(10K+490K))*5V = 0.1V.
Comme l'ampli à un gain de 10, on aura en sortie 1V.

Si un courant de 20A circule dans le shunt, la tension à ses bornes sera de 0.2V (U=RxI=0.01x20).
Sur l'entrée + de l'AOP, on va donc avoir (10K/(10K+490K))*(5V-0.2V)+0.2V = 0.296V. Avec le gain de 10, on aura en sortie 2.96V.

Il faut toutefois choisir un AOP qui accepte en entrée et qui puisse fournir en sortie des tensions proche de l'alim. C'est ce qu'on appelle des AOP rail to rail.

Pour connecter l'accélérateur, j'ai prévu 3 entrées analogiques identiques. Le signal est simplement filtré par un filtre passe bas RC. Une seule servira pour le moment, mais il m'en restera 2 de libres si dans le futur je veux par exemple connecter un capteur de pédalage ou autre.

Note : il y a une petite erreur sur le schéma : R5 doit se trouver AVANT le driver de MOS, et doit donc être connectée entre le signal 'PWM' et la masse. Peut être qu'un jour je modifierai le schéma et le routage...


La réalisation

La réalisation de ce contrôleur ne devrait pas poser de problème aux électroniciens bricoleurs avertis. En plus je vous ai mâché le boulot ! Voici mon pcb et l'implantation :


Cliquez sur les images pour les voir en grand
Cliquez ici pour avoir le pcb au format pdf

Le pdf est à l'échelle 1, donc si vous l'imprimez avec Acrobat Reader en désactivant les options agrandir ou réduire au format de la page, ça devrait sortir pile poil à l'échelle 1.

J'ai défini la taille de mon circuit par rapport à mon boîtier, et j'ai fait en sorte que les composants qui chauffent (MOS, diode de roue libre et shunt) soient vissés au boîtier, qui est en aluminium et qui servira donc de dissipateur thermique. Attention, ne pas oublier de les isoler du boîtier !
Pour la diode, il faut la visser au boîtier et faire la connexion au pcb avec 2 fils, car sa disposition ne permet pas de la fixer directement au boîtier.

Voilà ce que ça donne :


Cliquez sur la photo pour la voir en grand



Le logiciel

Et oui, il est beau ce contrôleur, mais sans logiciel à l'intérieur, il ne sert pas à grand chose !! La tâche du programme est simple, il doit venir lire l'entrée analogique de l'accélérateur, et piloter le signal PWM du moteur de 0 à 100% en fonction de sa position.

Mais j'ai quand même rajouté un peu d'intelligence :

Je limite la puissance envoyée au moteur pour que le courant tiré sur la batterie ne dépasse jamais un certain seuil, que j'ai fixé à 20A. C'est déjà un courant assez important, lorsque la batterie est chargée plein pot ça nous fait quand même environ 800W !!

Je limite la puissance envoyée au moteur pour que la tension batterie ne passe jamais en dessous d'un certain seuil. En effet, la batterie possède des protections, et si elle passe en dessous d'un seuil (3V par élément), elle se met en protection. J'ai donc fixé mon seuil à 32V, car la batterie possède 10 éléments de 3.6V, et même si je demande de la puissance alors que la batterie est presque vide, le contrôleur limitera la puissance à la valeur maximum admissible pour ne pas passer en dessous des 32V. Du coup ça permet d'exploiter à fond l'énergie restante et gagner quelques kilomètres d'autonomie.

Pour éviter les accidents débiles, le contrôleur se met en mode OFF au bout d'un certain temps de non utilisation, au bout duquel la commande d'accélérateur n'a plus d'effet (1 minute). Pour réactiver le contrôleur, il faut entrer un code grâce à l'accélérateur. Au début il était à 4 chiffres, puis j'ai réduis à 3, puis maintenant à 2 ;) Pour les entrer, il faut donner X coups d'accélérateur pour le 1er chiffre, faire une petite pause, donner X coups pour le 2ème chiffre, etc...
Cette fonction était utile au départ car le contrôleur était alimenté en permanence, mais maintenant j'ai un contacteur à clé pour couper le contact. Donc cette fonction risque de disparaître dans une prochaine version.

Voici l'archive du logiciel, qui comprend les sources (en C) et le fichier HEX pour programmer le PIC (Fichier controleurVelo.hex dans le répertoire Release).

controleurVelo10A.zip

Pour développer (et pour tout le reste aussi d'ailleur!), je travaille sous Linux avec le compilateur hi-tech, qui tourne dans le fabuleux environnement de développement Eclipse (un peu lourd cependant, car il est fait en Java). J'utilise une version démo gratuite du compilateur, limitée à quelques PIC et limitée en taille de code exécutable. Théoriquement, ce compilateur en version démo ne peut pas compiler pour un PIC16F819 ! Mais en feintant un peu, on y arrive quand même....
Ceux qui se pencheront dans les sources verront que j'utilise une méthode de programmation un peu spéciale, qui permet de faire du multi-tâche sans OS. Et surtout, je code à la manière de la programmation objet, ce qui permet de faire des programmes bien propres et bien structurés. Vous ne trouverez jamais de variables globales dans mes programmes !

Si vous avez besoin de plus de renseignements, contactez moi par mail, je vous répondrai avec grand plaisir.