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 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 :
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).
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.