Université de Liège Faculté des Sciences Appliquées Année académique 1997-1998 02'(/,6$7,21'(/ (7$7'(&+$5*('(6 %$77(5,(6'(9(+,&8/(6(/(&75,48(6 Travail de fin d'études proposé par Mr Colson Jean-François pour l'obtention du grade légal d'ingénieur Civil Electricien et Mécanicien tendance électricité.
Table des matières : 1. Introduction...6 1.1. Définition Des Objectifs :... 7 1.2. Véhicules Electriques :... 9 1.3. Raisons Ecologiques :... 13 1.3.a. Emissions Gazeuses :... 13 1.3.b. Pollution Sonore :... 18 1.4. Place Dans Le Réseau Electrique :... 19 1.5. Indicateurs Et SOC :... 21 2. Batteries...24 2.1. Types Principaux De Batteries :... 25 2.1.a. Préambule :... 25 2.1.b. Liste Des Accumulateurs Principaux :... 25 2.1.c. Calcul De La Capacité :... 27 2.1.d. Constition Des Accumulateurs:... 29 2.2. Accumulateurs Au Plomb :... 33 2.2.a. Historique Des Accumulateurs Au Plomb :... 33 2.2.b. Caractéristiques :... 33 2.2.c. Réactions Electrochimiques Dans Les VRLA :... 35 2.2.d. Schémas :... 38 2.2.e. Constitution :... 38 2.3. Accumulateurs alcalins :... 42 2.3.a. Introduction :... 42 2.3.b. Avantages Et Inconvénients :... 43 2.3.c. Accumulateurs Nickel - Cadmium:... 44 2.3.d.Réactions Chimiques :... 45 2.3.e. Additifs :... 46 2.3.f. Accumulateurs Nickel Métal Hydrure :... 48 2.3.g. Réactions Chimiques :... 50 2.3.h. Comparaison entre Ni-Cd et Ni-MH:... 51 2.4. Accumulateurs Au Lithium :... 52 2.4.1. Mécanisme D'Intercalage :... 52 3. Modélisation de l état de charge des batteries au plomb....54 3.1. Définition Et Grandeurs Associées :... 55 3.2. Modèle chimique... 63 3.2.a. Conductivité :... 63 3.2.b. Nombre De Transport Et Mobilité Ionique :... 65 3.2.c. Force Electromotrice Des Piles :... 66 3.2.d. Phénomène De Polarisation :... 67 3.2.e. Polarisation d Activation :... 69 3.2.f. Polarisation de Concentration :... 70 3.2.g. Polarisation Résistive :... 71 3.2.h. Double Couche Electronique :... 71 3.3. Modèle électrique :... 73 3.3.a. Introduction :... 73 3.3.b. Mesure A Partir Du Rendement :... 73 3.3.c. Parametres :... 74 3.3.d. Influence De La Recharge Pendant Le Freinage :... 77 3.3.e. Mesure De La Tension :... 77 3.3.f. Modèle équivalent électrique :... 78 3.3.g. Mesure de l Impédance :... 80 4. Expériences et perspectives...83 4.1. Mesures sur batterie au nickel :... 84
4.2. perspectives:... 88 5. Annexes et Bibliographie...89 5.1. Bibliographie:... 90 5.2. Programmes:... 92
Avant toute chose, je veux remercier les personnes qui ont rendu ce travail possible: Tout d'abord Mr Jean-Louis Lilien, pour sa présence et sa porte toujours ouverte. Son esprit de synthèse aura j'espère éclairé ce travail. Je tiens également à remercier Mr le Professeur Maggetto ainsi que Mr Beya du service d'électrotechnique de la Vrije Universiteit Brussels pour leur accueil et soutien pendant ce travail. Je tiens aussi à signaler qu'ils ont fait preuve d'une grande patience et compréhension lorsque nous avons rencontré des problèmes dans la chaîne de mesure. Je n'aurais pas pu faire ce travail, et d'ailleurs aussi mes études si je n'avais pas eu ma famille qui m'a soutenu pendant ces années et m'a donné la motivation de toujours continuer. A Isabelle Drapier, ma fiancée, pour son aide tant au niveau académique que pour son soutien moral, et ce, malgré son emploi d'enseignante et ses études complémentaires en gestion à l'université. A Fabrice Delfosse, grâce à qui j'ai eu l'occasion de choisir ce travail et pour les nombreuses recherches que nous avons effectuées en commun. A mes amis de la section 3 ième "Elec-Mec-Elec", et à Olivier Houet plus particulièrement, pour une solidarité que je n'avais jamais connu auparavant. A tous ceux que je n'ai pas cité mais que je n'oublie pas. Merci, Jean-François Colson.
Préface: Les batteries, dans le domaine des véhicules électriques (VE) plus particulièrement, sont d'une importance capitale pour assurer à ceux-ci un développement important. Malgré les progrès réalisés dans d'autres domaines, les phénomènes associés au processus chimique sont pourtant très peu compris ou utilisés. La modélisation de l'état de charge, qui est le but de ce TFE, est un domaine où peu de recherches ont étés effectuées et les résultats de celles-ci n'ont été que très faiblement utilisés dans l'industrie. L'indicateur de charge est pourtant un des points faibles des VE car son imprécision rend le véhicule très peu fiable. Ce travail reprendra donc, après quelques rappels sur les technologies de batteries utilisées actuellement pour les VE, les différents phénomènes intervenant dans les réactions électrochimiques des accumulateurs. Colson Jean-François
,1752'8&7,21
1.1. DÉFINITION DES OBJECTIFS : Dans ce travail, je ferai quelque fois allusion à nous, ce pronom reprend généralement Fabrice Delfosse et moi-même car la majorité du travail effectué ici a été réalisé avec sa collaboration. En effet nos deux travaux, même s'ils sont différents, portent sur le même domaine. Nos recherches à la Vrije Universiteit Brussels (VUB) ainsi que nos recherches à Liège sont en général basées sur les mêmes sources. La différenciation des travaux étant à l origine que Fabrice s orienterait plus vers le modèle électrique voir une implémentation électronique et moi-même vers une analyse du modèle de la batterie par des identifications de systèmes avec une approche plus chimique. Ces objectifs originaux ont cependant dû être malheureusement changés dans les derniers mois car un problème matériel de la chaîne automatique de mesure ne nous a pas permis de continuer dans ce sens. Mon objectif est donc de déterminer le modèle de l état de charge des batteries électriques avec une orientation vers les phénomènes chimiques intervenant dans le processus. Vu que les batteries au plomb forment la majeur partie des batteries pour véhicules électriques, c est vers ce type d accumulateur que mes travaux se sont naturellement orientés. Comme dit précédemment, je n ai pu obtenir les résultats prévus à la VUB pour, à partir de ceux-ci, appliquer des théories d identification de systèmes ainsi que l application de l apprentissage inductif. Il est noter que ces méthodes permettraient d obtenir un modèle précis car basé sur l expérience. Des arbres de décision permettraient aussi de facilement implémenter un indicateur d état de charge correct. Ces dernières remarques étant pour le lecteur qui désirerait approfondir des recherches dans ce domaine. C est donc principalement à partir de modèles et de raisonnements ainsi qu à quelques expériences que je justifie mes conclusions. Il est à noter que dans le cadre d une reprise de ce sujet, une approche orientée sur des résultats expérimentaux me semble très importante et après maintes recherches sur le sujet, très peu d études ont étés réalisées dans ce sens. En chapitre 4, je donnerai l état de mes travaux dans cette orientation, principalement l élaboration de la chaîne de mesures, afin de faciliter l avancement dans cette voie qui était celle prévue pour ce travail. La modélisation de l état de charge doit à mon sens apporter des renseignements utilisables pour l implémentation dans un module électronique embarquable. C est pourquoi je cherche à expliquer un modèle électrique équivalent qui, à partir de mesures simples de courants et de tensions, ainsi que leurs évolutions temporelles, me fournirait une image correcte de l état de charge (S.O.C.). Les méthodes actuellement utilisées ne tiennent pas ou très peu compte de caractéristiques, pourtant très importantes, telles que le courant nominal retiré à la batterie, la température ou l état de vieillissement de la batterie. C est pourquoi je montrerai des correspondances entre certaines caractéristiques chimiques et électriques de la batterie car le modèle chimique est le seul élément fiable sur lequel on peut se baser et non sur un modèle purement électrique.
Sachant que les seuls tests sur batteries que nous avons pu réaliser ont été effectués sur des accumulateurs au Ni/Cd que le service de thermodynamique de Monsieur le Professeur Lebrun nous a généreusement laissé utiliser, je reprendrai les correspondances entre ces deux types de batteries.
1.2. VÉHICULES ELECTRIQUES : En 100 ans, les véhicules électriques (V.E.) ont énormément évolués. L image habituelle des VE est un véhicule lent, qui ressemble plus à un jouet qu à une voiture. Or, le premier véhicule à dépasser les 100 km/h (105.85 km/h exactement) était un VE, cette voiture s appelait la «jamais contente» et elle avait été créée par un Belge, Camille Jenatzy. Actuellement, on en est arrivé à des voitures principalement urbaines qui apportent une absence presque totale de pollution par les gaz et par le bruit. Ces dernières années, suite au développement de ces véhicules pour des raisons écologiques et aux recherches de solutions alternatives au pétrole, les performances de ces VE ont largement évolué pour arriver en directe concurrence avec les véhicules thermiques classiques. Il est à noter que le nombre d initiatives dans le domaine des VE ne cesse d augmenter, comme exemple nous pouvons citer ZEV (Zero Emission Vehicle), ZEUS (Zero Emission Vehicle in Urban Societies), ZEBRA (Zero Emission Battery Research Activity), Citelec ou encore le célèbre symposium sur les véhicules électriques (EVS) qui se tiendra cette année à Bruxelles. Fig.1 La "Jamais contente" Dans quelques années, lorsqu'il y aura des productions en série, le prix de ces véhicules sera totalement équivalent à une voiture actuelle car ces voitures, batteries mises à part, sont de conception plus simple que les voitures thermiques. En effet, la plupart des VE fonctionnent sur un seul rapport et donc il n y a pas besoin de boîte de vitesses. De plus, vu l absence d explosion dans le moteur, la
difficulté de réaliser des cylindres et des pistons n existe plus ainsi que toute la problématique des gaz d échappement, de la circulation du carburant, On estime que la vie d un VE n est pas définie sur l âge du moteur mais bien sur le nombre de cycles que les batteries peuvent supporter A titre d exemple, voici le modèle actuel de Peugeot, la 106 électrique : Fig.2 la "106 Electric", avril 1998 Ce véhicule qui nous a été prêté pendant une semaine afin d en faire la présentation à l Université, est une preuve que ces véhicules sont une réalité et non un projet et que dès à présent, ils ont leur place dans le réseau routier. Afin d illustrer l évolution des performances des VE, voici un graphique montrant l évolution des autonomies et des vitesses maximales entre les Symposiums sur les Véhicules Electriques (EVS) de 1994 et 1996 :
Fig.3 évolution des vitesses Fig.4 évolution des autonomies
Ces évolutions montrent que les VE vont devenir de plus en plus présents dans notre environnement. Un autre avantage des VE est le prix d utilisation. En effet, lorsque le supplément de prix que l on doit actuellement payer pour les prototypes aura nettement diminué, aussi bien lors de l achat que pour l utilisation, on aura des prix inférieurs aux véhicules classiques. Ceci est dû au fait que la conception des VE est plus simple. Le moteur thermique est un ensemble complexe comportant un bloc où circulent des gaz portés à des températures dépassant les 1000 C. Les pièces qui le constituent (pistons, boîte de vitesses, bielles, soupapes, organes de commande et de distribution) sont toutes animées de mouvements alternatifs engendrant des forces d'inertie qui ne sont que partiellement équilibrables. Les fonctions annexes (carburation, graissage, refroidissement) exigent l'utilisation d'un matériel compliqué, en constante évolution. Sa réalisation est donc onéreuse car les opérations d'entretien sont multiples et les révisions périodiques nombreuses. Le moteur électrique par contre est beaucoup plus simple car il peut se schématiser à une seule pièce tournante; l'induit. Voilà donc pourquoi la voiture électrique semble idéale si on ne tient pas compte des batteries qui, malgré les progrès réalisés, ne donnent pas une puissance suffisante. Un dernier point qu'il ne faut pas négliger est que, au total du bilan, l on a besoin de moins d énergie pour obtenir le mouvement avec un VE par rapport à l'énergie totale utilisée par le moteur thermique. (voir chapitre 1.3)
1.3. RAISONS ECOLOGIQUES : La principale raison d être des VE est d ordre écologique. Vu l augmentation du trafic dans les villes, il est nécessaire d apporter des solutions à la pollution urbaine, inévitablement croissante. Dans la majorité des trajets effectués en Belgique, des autonomies de plus de 100 kilomètres ne sont pas nécessaires et donc des véhicules urbains non polluants, avec un absence presque totale de bruits mécaniques sont fortement indiqués pour diminuer les inconvénients liés à l augmentation inévitable du trafic urbain. 1.3.A. EMISSIONS GAZEUSES : Afin de donner quelques ordres de grandeurs, voici quelques chiffres de différentes études menées sur le sujet. Diminution des émissions dans l'air (South Coast, L.A.) Etude HC CO NOx SOx Hwang & Al. 1990 Total 95% - 96% 99% 56% -78% - Hwang & Al. 1994 Local 99,4 %-99,9% 99,4%-99,9% 98,5%-98,7% 99,4% Total 98,9%-99,6% 98,6%-99,7% 59,6%-79,9% 17% Austin & Caretto 1995 Total 92% 98% 4% CARB. 1996 Local 98,3% - 93% Total 95% - 47% Ces études ont étés réalisées aux Etats-Unis dans le South Coast (EVS 14 : «Evaluation of Methods Used in South Coast Air Basin Studies» ). La différence entre émissions locales et totales provient du fait que dans le cas où les VE sont utilisés, les gaz sont émis aux sites de productions d électricité et donc en-dehors des villes ce qui permet une plus grande dissolution au contraire des véhicules classiques qui provoquent une forte concentration de gaz dans les villes. Il faut aussi ajouter que dans les pays où l'énergie nucléaire est présente, une nouvelle diminution de production de gaz polluant est à considérer.
Comparaison d'émissions de gaz g/km 3 2,5 2 1,5 1 0,5 0 CO NMHC Nox SO2 Fig.5 Comparaison d'émissions gazeuses Petrol diesel CNG electric Il est à noter que l on a «zéro» émissions locales pour les VE. Comme dernier exemple, examinons les résultats d'une étude visant à analyser les variations d'émissions gazeuses quand la totalité des véhicules thermiques d'afrique du Sud est remplacée par des EV: Fig.6 comparaison d'émissions pour un remplacement total par des VE
Cette diminution de pollution provient principalement du fait que moins d énergie est gaspillée dans le processus. Le rendement énergétique global des véhicules thermiques très faible est à comparer au rendement énergétique des centrales et du rendement élevé du VE (en tenant compte des pertes de la batterie et du moteur électrique) Voici un dessin qui explique ce processus : Fig.7 comparaison pertes énergétiques Le bilan énergétique est aussi très important, il conditionne la quantité d énergie nécessaire et donc la quantité de CO 2 produite : énergie dans le transport du carburant énergie dans la chaîne de traction énergie perdue à la production (centrale) énergie pour le mouvement Fig.8 balance de l'énergie
On voit donc qu une plus petite énergie est nécessaire, ce qui induit une diminution de la production de CO 2 qui est en grande partie responsable de «l effet de serre». Les émissions ne donnent pas directement l indice de la qualité de l air, d autres facteurs entrent en compte dans l évaluation de celui-ci. Il faut donc tenir compte de la location, du «timing», de l altitude et du climat. Ces deux derniers paramètres ne peuvent être modifiés mais dans le cas où les VE sont utilisés, les deux premiers paramètres ont une influence positive sur la pollution. L activité humaine (transport et industrie) émet dans l atmosphère des gaz dits polluants tels que les oxydes d azote (NO x ), les hydrocarbures imbrûlés ( -CH) ainsi que du monoxyde et du dioxyde de carbone qui, s'il n est pas toxique, est cependant dangereux pour l environnement à cause de «l effet de serre» qu il provoque. Les polluants primaires (NO x, -CH, CO) interviennent dans la création d une pollution secondaire, la pollution photochimique. Sous l influence d'un rayonnement ultraviolet, il se produit diverses réactions chimiques qui conduisent à la formation d ozone ( O 3 ) et de peroxyacétylnitrate (PAN). Ces deux composés sont très nocifs pour la santé ; en effet, l ozone est responsable d un nombre croissant d affections respiratoires surtout chez les enfants et les personnes sensibles et le PAN quant à lui est irritant pour les yeux et les poumons. De plus, ces composés chimiques sont générateurs du «smog» caractéristique des grandes agglomérations et peuvent causer de sérieux dommages écologiques par les pluies acides. C est donc le processus de création de la pollution photochimique qu il faut étudier : NO 2 -> NO+ O 1. ( avec UV) O +O 2 -> O 3 2. NO + O3 -> NO 2 + O 2 3. -CH +NO 2 -> PAN 4. ( avec UV) NO 2 + H 2 O -> H 2 NO 3 5. Il est à noter que dans le cas où il existe une présence d hydrocarbures dans l air, il est généré des radicaux péroxy R-O-O qui réagissent avec NO : NO + R-O-O -> NO 2 + RO 6. Cependant, la réaction 6. étant plus rapide que la réaction 3. l ozone n est plus consommé et s accumule avec les conséquences qui y sont attachées. Les quantités de NOx et de HC nous permettent donc de savoir quelles mesures prendre. Dans les zones urbaines, il faut diminuer le taux de NOx et de -CH car on a une concentration des deux gaz au même endroit. Le déplacement des émissions de NOx et de HC vers des centrales distantes des villes apporte donc une nette diminution de la création d ozone.
Le «timing» est lui aussi très important car si l on se dirige vers une recharge principalement nocturne des VE, On aura un dispersion plus grande et donc une diminution de la création d ozone car alors on aura des émissions de gaz qui auront le temps de se dissiper avant que le soleil ne puisse provoquer la création d ozone. Photographie de Paris dans un "smog"
1.3.B. POLLUTION SONORE : Le premier sentiment que l on ressent quand on tourne la clef d un moteur d un VE est une crainte que le moteur n aie pas démarré, sentiment vite disparu lorsque l on appuie sur l accélérateur. En effet, il est difficile d imaginer que le moteur puisse fournir son énergie presque sans entendre un seul bruit mécanique. Après avoir conduit quelques temps un de ces véhicules, on a difficile de revenir vers un véhicule thermique classique qui désormais semble très bruyant. Cette caractéristique est très importante quand on sait que la pollution par le bruit est très intense dans les régions urbaines. Lors d études menées sur le sujet, on a constaté que les véhicules roulant provoquent deux types de bruits ; les bruits mécaniques et les bruits de roulage. Les bruits mécaniques sont dus au moteur à explosion qui malgré un progrès dans l insonorisation, provoque tout de même un bruit non-négligeable à l intérieur et à l extérieur du véhicule. Les bruits de roulage sont inévitables et sont dus au contact entre les pneus et la route. En-dessous de 90 km/h, les bruits mécaniques sont les plus importants. Les VE, étant donné que leur utilisation est principalement urbaine, diminuent donc de façon significative le bruit du trafic routier dans les villes.
1.4. PLACE DANS LE RÉSEAU ELECTRIQUE : Le diagramme de charge du réseau est bien connu, il a la forme suivante : Fig.9 diagramme de charge
Sachant que les groupes de production d électricité ayant les meilleurs rendements (coûts) sont ceux qui ont une période de lancement plus longue, on sait que le fond énergétique est assuré par les grands groupes (nucléaire, hydraulique) et que les fluctuations sont suivies par des groupes thermiques à rendement nettement inférieur. Afin de réduire cet aspect, on utilise des centrales de pompage (comme à Coo) qui permettent de prendre de l énergie quand elle est disponible et de la rendre lorsqu on en a besoin pour «lisser» les pics de demandes de puissance. Une utilisation plus importante des VE permettrait de réguler ce diagramme. En effet, les VE étant rechargés principalement pendant la nuit, c est à ce moment que la production est la plus basse. C est grâce à ce principe que l on sait que la mise en service de 1 million de VE en Belgique (ce qui est une vue extrêmement optimiste) n aurait besoin que d une augmentation de production de 1%. De plus, des études sont en cours pour déterminer des systèmes de communication bidirectionnelle entre les producteurs et les utilisateurs (plus spécialement les rechargeurs) pour pouvoir gérer cette production en fonction des demandes et disponibilités. A titre indicatif, voici la répartition d énergie si on considérait 1 million de VE en France : Influence des EV sur la production Privé 36% Pertes 7% EV 1% Bureaux 25% Industrie 31% Fig.10 Influence des EV sur la production
1.5. INDICATEURS ET SOC : Dans les VE, l existence d un indicateur de charge est un problème crucial car il détermine la confiance que l on a dans l utilisation du véhicule. Dans les voitures classiques, la réalisation d une jauge n est pas un grand problème car le niveau de carburant restant est univoquement mesurable et donne une valeur exacte. Pour les VE, la caractérisation de l état de charge (aussi appelé SOC, «State Of Charge») des batteries est loin d être aussi facilement identifiable. Celle-ci est pourtant très importante et pas uniquement dans les VE mais aussi dans un grand nombre d applications, par exemple dans le domaine de la téléphonie mobile dont on connaît la croissance. Malheureusement, dans ces applications, très peu d indicateurs apportent une grande précision, en général l estimation du SOC est valable à moins de 20 % près. De plus, cette précision diminue beaucoup lorsque l on est dans des profondeurs de décharge (DOD : Depth Of Discharge ) importantes, alors que c est à ce moment que cette estimation doit être fiable. En effet, le phénomène de décharge est complexe et beaucoup de paramètres sont importants. Des paramètres physiques, températures, tension aux bornes de la batterie, courant et même des paramètres prévoyant la manière dont va évoluer la demande en énergie. En effet, si la surveillance de la tension à vide aux bornes de la batterie, ainsi que son évolution au cours du temps donne une bonne indication de l état de la batterie, elle est nettement insuffisante pour déterminer avec précision la quantité d énergie encore disponible dans la batterie. Actuellement, on utilise des méthodes dites Ampèremétriques qui comptent la quantité de courant donnée pendant la charge et la décharge. La quantité d énergie disponible peut alors être déduite en calculant expérimentalement un rendement entre la quantité d énergie donnée pendant la charge et celle restituée pendant la décharge. Comme exemple d indicateur existant et le plus performant jusqu à présent, voici le projet de Honda : «The Honda EV Plus» :
Fig.11 indicateur Honda EV+ Fig.12 exemples: Honda EV+ Comme on le voit sur ces dessins, cet indicateur ne se limite pas à donner un état de la batterie mais renseigne le pilote sur le nombre de kilomètres qu il est encore possible de parcourir et cette estimation est établie en fonction de la conduite du pilote. Avec un tel compteur, Honda a montré que non seulement on pouvait avoir une meilleure précision mais qu en plus, la présence de cet économètre incite les utilisateurs de VE à une conduite moins nerveuse car le pilote «voit» que les grands courants diminuent considérablement le SOC de la batterie. Cette approche a d ailleurs été adoptée par plusieurs constructeurs et notamment par Peugeot car la 106 Electrique que nous avons pu essayer était pourvue de cet «économètre». La raison pour laquelle le rendement diminue fortement avec le courant provient de la polarisation qui augmente les pertes dans des phénomènes secondaires (voir Chapitre 3). Exemple de l indicateur de la «106 Electric» :
Fig.13 indicateur 106 électrique
%$77(5,(6
2.1. TYPES PRINCIPAUX DE BATTERIES : 2.1.A. PRÉAMBULE : Dans ce chapitre 2, les types de batteries le plus utilisés seront présentés. Malgré le nombre d années de recherches dans les batteries, celles-ci restent le point le plus faible dans l ensemble des éléments qui forment un VE. En effet, l autonomie totale d un VE est déduite de la durée de vie de ses accumulateurs. Les progrès réalisés dans ce domaine ont apporté des gains appréciables en capacités et en durée de vie mais le coût supplémentaire associé est beaucoup trop important pour être applicable dans un projet commercial. De plus, la comparaison des carburants et des batteries n est pas très favorable pour les VE car en termes de poids, facilité de recharge et d encombrement, le pétrole reste le plus avantageux. Finalement, le prix des véhicules électriques est conditionné par le prix des batteries, c est pourquoi les VE actuellement sur le marché sont principalement vendus sans batteries et celles-ci sont fournies avec une formule de location pour amortir leur prix. Afin de pouvoir analyser un type de batterie voici un tableau expliquant les caractéristiques principales : Caractéristique Energie Spécifique (Wh/kg) Puissance spécifique (W/kg) Nombre de cycles avant remplacement Coût énergétique ($/kwh) Température de fonctionnement ( C) Grandeur(s) associée(s) Autonomie quotidienne (km) Performances, accélération Durée de vie du véhicule, Coût d'achat Coût d'utilisation Facilité d'utilisation 2.1.B. LISTE DES ACCUMULATEURS PRINCIPAUX : voici un tableau reprenant un ensemble non-exhaustif des batteries utilisées dans l industrie et dans les VE ainsi que leurs caractéristiques principales: VOIR FIN DOCUMENT
Il est à noter que l autonomie est caractérisée par l énergie spécifique (Wh/kg) et que l accélération est donnée par la puissance spécifique (W/kg). On voit bien sur ces graphiques que les accumulateurs au plomb sont les moins performants mais pourtant, ils sont toujours les plus utilisés! Ceci provient du fait que d autres paramètres sont à prendre en compte : principalement le coût mais aussi le mode de fonctionnement, la T d utilisation, le cycle de vie, l'effet mémoire Dans la suite, seuls les accumulateurs au plomb et alcalins (principalement Ni-Cd) seront explicités. En effet, la plupart des réactions sont différentes entre batteries distinctes et donc je dois me limiter à un nombre restreint pour réaliser ma modélisation. Il est à noter que même si certains types de batteries sont absents, les analyses et les remarques peuvent généralement être appliquées à d'autres accumulateurs car souvent les mêmes phénomènes apparaissent (T, polarisation) 2.1.C. CALCUL DE LA CAPACITÉ : La capacité théorique, contrairement à la capacité réelle qui est déterminée expérimentalement, correspond à la quantité totale d électricité qui peut être produite par la réaction électrochimique. Elle est définie en coulombs ou en ampères-heures. Elle est déterminée à partir du poids de matériaux actifs disponibles participant à la réaction dans la cellule. La batterie sera donc limitée par le matériau qui aura la plus petite quantité de matériel électrochimique (généralement la borne positive). Dans certains cas, l électrolyte fait partie de la réaction de la cellule et limite la réaction. Théoriquement, 1 gramme équivalent (1 gramme divisé par le nombre de charges) donne 96 487 Coulombs (26.8 Ah) et donc : Capacité en densité d'énergie Ah/kg : Capacité théorique ( Ah / kg) = n 26.8 Ah Poids du composant actif Capacité en densité de puissance Wh/kg : n 26.8 E0 Capacité théorique( Wh / kg) = Poids du composant actif Afin de savoir quelles sont les perspectives d avenir dans ce domaine, on peut regarder les perspectives américaines : EMBED
Fig.14 objectifs de United States Advanced Battery Consortium
Pour avoir une comparaison, une puissance spécifique de 400 W/kg représente l accélération d une Volkswagen Golf classique. Il faut aussi remarquer qu une capacité de 1000 cycles de recharge, avec une autonomie d un VE de 100 km, amène une autonomie totale du VE de 100 000 km. Il est à noter également qu'étant donné que le moteur électrique est très fiable, c est la batterie qui caractérise le risque majeur de.panne et la durée de vie du véhicule. 2.1.D. CONSTITION DES ACCUMULATEURS: Pour pouvoir construire une batterie, il ne suffit pas de plonger des électrodes dans une cuve, de nombreux éléments sont indispensables pour avoir une utilisation optimale, une grande facilité d'emploi et des risques minimes. Si on considère les batteries en général, des constituants récurants apparaissent qu'il faut considérer: À Les électrodes: élément crucial de la batterie, elles nécessitent des études poussée pour obtenir une surface de contact la plus grande possible avec parfois des catalyseurs permettant de favoriser la reconstitution des électrodes pendant la charge. À L'électrolyte: existe sous forme liquide ou en gel pour emprisonner les émissions gazeuses (principalement en cas de surcharge). À Les séparateurs: empêche que les électrodes ne se touchent avec une croissance anormale lors de la charge, ce qui amène un court-circuit et un risque de surchauffe. il peut aussi avoir un rôle de filtreur pour les éléments qui ne doivent pas passer. À Les connecteurs: Ceux-ci doivent être les plus standards possibles. À L'emballage: En matériaux plastiques généralement, doit assurer une protection optimale contre les agressions (choc, isolation, ) et ne pas alourdir l'ensemble. À Autres: comme les pompes, circuit interne pour la recharge,.. exemple de constitution d'une batteries au plomb:
Fig.15 accumulateur au plomb
exemple de plaque: Fig.16 zoom d'une électrode tubulaire Quand on assemble une série de cellules de base afin d'obtenir la tension et la puissance voulue, deux possibilités sont possibles : Fig.16 montage bipolaire et monopolaire
Avantages du montage bipolaire: simple moins de pertes plus grandes densités d'énergie Désavantages: doit être complètement hermétique risque de court circuit en cas de fuite d'électrolyte chaque gaz doit être recombiné dans sa cellule
2.2. ACCUMULATEURS AU PLOMB : 2.2.A. HISTORIQUE DES ACCUMULATEURS AU PLOMB : 1789 Expérience de Galvani 1800 Volta crée la première pile 1854 Sinstede utilise des plaques en plomb dans acide sulfurique 1859 Planté améliore la capacité des batteries au plomb 1881 Faure crée de nouvelles plaques avec un alliage d antimoine 1910 Les plaques tubulaires sont introduites 1915 Willard introduit des séparateurs en plastique 1958 Jache crée les batteries au gel VRLA 1965 Utilisation des batteries pour l allumage des moteurs 1968 Les batteries sans entretien sont développées 1980 Les batteries VRLA sur gel AGM sont en production 1990 Utilisation des batteries pour les VE, GSM, 2.2.B. CARACTÉRISTIQUES : Les accumulateurs au plomb sont les plus répandus dans les VE, ceci provient du fait de leur coût très faible ainsi qu à leur bonne connaissance car ils existent depuis plus de cent ans. Leur prix très faible provient des matériaux utilisés qui sont relativement abondants (Pb et H 2 SO 4 ). Le type d accumulateur au plomb qui nous intéresse est du type accumulateur au plomb VRLA (Valve Regulated Lead Acid) qui ne nécessite aucun entretien. En effet, celui-ci est clos et l électrolyte est sous forme de gel, ce qui permet d immobiliser les gaz produits (O 2 et H 2 ) afin de pouvoir être redissolus au prochain cycle. Il est à noter que actuellement, on utilise la technologie AGM (Absorbptive Glass Mat) pour emprisonner les émissions gazeuses.
Avantages et inconvénients : Voici dans un tableau les avantages et les inconvénients principaux des accumulateurs au plomb de type VRLA: Avantages Sans maintenance Coût faible Pas d effet mémoire Capacité de subir des grands courants Diminution du risque d explosion Facilement portable Inconvénients Densité d énergie relativement faible Difficile à miniaturiser La charge doit être surveillée Chargeur coûteux Durée de vie moyenne Pression doit être maintenue Bonnes performances à basses T Caractéristiques des batteries VRLA : Tension en circuit ouvert 2.1V Tension en circuit fermé (à C/5) 1.98V Tension en fin de décharge 1.75V Tension de recharge 2.35V Self-Discharge (à 20 C) 3% par mois Ecart de capacité par rapport à 20 C 0 C -35 % 40 C +13% Zone de fonctionnement en T -18 C 50 C Nbr de cycles max (à C/5 et à 100 % 800 DOD) jusque 80 % capacité Jusque arrêt 1750 durée de vie (100 cycles /ans) 8 ans Perte de capacité par 100 cycles 2.5% Recharge time 8 à 24 heures Possibilité de Fast Charging Oui
2.2.C. RÉACTIONS ELECTROCHIMIQUES DANS LES VRLA : Dans les réactions suivantes, le sens de la décharge a été indiqué, il suffit, pour obtenir les réactions pendant la charge, d inverser les sens des équations étant donné que nous sommes en présence de batteries de type secondaire et donc de processus réversible. Réactions primaires : Borne positive : PbO 2 (s) + 4 H + (aq) + SO 4 2- + 2e - PbSO 4 (s) + 2 H 2 O (l) Décharge En pratique, l ion bisulfate HSO 4 - est un acide faible (pka = 1.99 à 20 C) et donc l équation : PbO 2 (s) + 3 H + (aq) + HSO 4 - + 2e - PbSO 4 (s) + 2 H 2 O (l) Décharge Donne une description plus précise de la réaction à l électrode. On a donc : 3RT Er 2F E = 1.639V pourα PbO E 0 0 = E0 + ln( ah + ) + ln( ahso4 = 1.631V pourβ PbO 2 2 3RT 2F 3RT ) ln( a 2F H 2O ) Borne négative : Pb(s) + SO 4 2- (aq) PbSO 4 + 2 e - Décharge Ou, en tenant compte de la même remarque que pour la borne positive : Pb(s) + HSO 4 - (aq) PbSO 4 + 2 e - + H + (aq) Décharge Où : E r RT RT 0.302 + ln( ah + ) ln( a 4 ) 2F 2F = HSO
Global : Pb(s) + PbO 2 (s) + 2H 2 SO 4 (aq) 2PbSO 4 (s) + 2 H 2 O(l) Décharge Il est à noter que l on donne généralement la tension pour une dissociation 2,1 de H 2 SO 4 : et H 2 SO 4 2H + + SO 4 2- RT ah Vr = V0 + ln F a avec V = 2.047 0 2SO4 H 2O A partir de ces équations, on obtient un V r moyen de 2.1 V. Au fur et à mesure que la cellule se décharge, l acide sulfurique est consommé et de l eau est formée. En conséquence, la densité de l électrolyte varie de 40% en passant de 1.30 kg dm -3 à 1.10 kg dm -3. Il est à noter que la formation de sulphate de plomb insoluble sur les électrodes peut freiner la réaction car celui-ci est très peu soluble. Cet effet est surtout marqué pour les grands courants où la capacité réelle peut diminuer de près de 10% de la valeur théorique. Afin de diminuer cet effet indésirable, il est nécessaire d avoir la structure la plus poreuse possible afin d augmenter la surface de contact entre le solide et l électrolyte et permettre l accroissement de volume associé à la transformation du dioxyde de plomb en sulfate de plomb. Le dioxyde de plomb existe sous deux formes cristallines ; rhombic (α) et tétragonale (β). Vu que le α-pbo 2 est isomorphique au sulfate de plomb, on arrive très facilement à un recouvrement total et donc à une passification de la réaction. Heureusement, le β-pbo 2 est thermodynamiquement plus stable que la forme α-pbo 2 et donc il y a une réaction spontanée de transformation vers la forme tétragonale. Ceci implique pourquoi, lors de courants plus forts, les performances de la batterie sont réduites car cette transformation ne peut avoir lieu. Réactions secondaires : 1. Gassing / perte d eau : Si la charge se prolonge, il y a émission d oxygène et d hydrogène : Borne positive :
H 2 O 2 H + + ½ O 2 + 2 e - Charge Borne négative : Global : 2 H 2 O + 2 e - H 2 + 2 OH - Charge H 2 O + 2 e - H 2 + ½ O 2 Charge 2. Recombinaison de l oxygène (VRLA) : Borne positive : H 2 O ½ O 2 + 2 H + + 2 e - Charge Borne négative : Global : Pb + ½ O 2 + H 2 SO 4 PbSO 4 + H 2 O PbSO 4 + 2 H + + 2 e - Pb + H 2 SO 4 Charge Pas de réaction nette
2.2.D. SCHÉMAS : ceci : Les batteries au plomb peuvent êtres schématiquement représentées comme CHARGEE DECHARGEE 2.15 V, Densité : 1.30 kg/dm³ 1.75V Densité : 1.10 kg/dm³ 2.2.E. CONSTITUTION : Les batteries destinées aux VE doivent posséder les caractéristiques suivantes : Résistance aux températures extrêmes Résistance aux vibrations DOD très importants Charges importantes / moyennes Possibilité d obtenir des courants très importants Les batteries utilisées alors sont de constitution :
Elément constitution Raison Plaque Plaques épaisses + Durée de vie Durificateur des grilles Antimoine faible / Calcium + nombre de cycles Plomb Densité moyenne + capacité, + grands courants Poids spécifique de l acide 1.250 Tension pour la recharge 2.50 V / Cell Cycles de décharge 1500 2000 Durée de vie 6-8 ans Exemples de construction des plaques : a. Construction de Planté b. Construction en tube c. Construction plane d. Construction poreuse Fig.17 plaques
Fig.17 plaque Planté Agrandissement de la plaque de Planté pour remarquer les ondulations qui augmentent la surface de contact. Exemples de batteries au plomb :
Fig.18 batterie au plomb avec électrodes tubulaires Vue éclatée d'un accumulateur au plomb (Propriété de Chloride Industrial Batteries)
2.3. ACCUMULATEURS ALCALINS : 2.3.A. INTRODUCTION : Comme montré précédemment, les accumulateurs au plomb offrent des caractéristiques très intéressantes pour les VE (coûts faibles, recharge rapide,..). Malgré cela, les performances en termes de puissance spécifiques et de densité d énergie sont trop faibles pour assurer au véhicule des performances comparables aux voitures thermiques. Les batteries de type alcalins sont les batteries où le plus grand nombre de recherches sont effectuées et leur utilisation dans les VE est déjà très importante. Ces batteries sont de types différents : Nickel Cadmium Nickel Métal hydrure Manganèse dioxyde zinc qui sont déjà en grande production Mais il existe aussi des systèmes très prometteurs Nickel hydrogène Nickel - Zinc Nickel- Fer Argent- Zinc Zinc air qui ne sont produits qu à petite échelle. Tous ces types de batteries peuvent être résumés dans le diagramme sur la page suivante :
Fig.19 possibilités d'électrodes pour las accumulateurs alcalins Combinaisons d'électrodes possibles pour les batteries alcalines, l'élément dans le cercle est l'électrode négative, les traits épais sont les systèmes en production, les traits fins sont ceux en développement et les pointillés les systèmes théoriques. 2.3.B. AVANTAGES ET INCONVÉNIENTS : AVANTAGES Parfait pour très grands courants Très facilement «emballable» Grande marge de température d utilisation Grande durée de vie Grande densité d énergie INCONVENIENTS Coûts élevés des matériaux Effet mémoire Risque de pollution, recyclage (Cd, Hg) Comme montré auparavant, les accumulateurs au nickel offrent des performances largement supérieures aux accumulateurs au plomb. Ceci est malheureusement compensé par un accroît de coût important. En effet les accumulateurs sont en moyenne trois fois plus chers que leurs équivalents au plomb.
2.3.C. ACCUMULATEURS NICKEL - CADMIUM: Contrairement aux accumulateurs au plomb, l électrolyte (KOH) ne participe pas aux réactions dans les cellules. Cette caractéristique implique que la conductivité (très élevée) et la densité de courant restent constantes pour tout SOC. Chaque élément d accumulateur nickel-cadmium présente une force électromotrice voisine de 1.3 V. L'électrolyte, contrairement aux batteries au plomb, ne participe pas directement à la réaction aux électrodes. Il est composé en général d'une solution de KOH de concentration spécifique de 30% à 35%. Réaction simplifiée : 2 NiOOH + 2 H 2 O + Cd 2 Ni(OH) 2 + Cd(OH) 2 Mais il faut tenir compte des réactions annexes suivantes : Réaction implique une diffusion de protons à l état solide. Les additifs structuraux (Co, Li) influencent le transfert de charge et la formation des cristaux. Des transformations apparaissent dans la solution de KOH. Structure de l hydroxyde de Nickel : est de valence 2 à l état déchargé. est de valence 3 (approximation) pendant la charge.. a une différence de densité de 15 % entre chargée / déchargée. est organisé en bandes :
Fig.20 structure de l hydroxyde de nickel 2.3.D.RÉACTIONS CHIMIQUES : Réactions primaires : Borne positive : NiOOH(s) + e - + H 2 O Ni(OH) 2 (s) + OH - Décharge
Borne négative : Cd(s) + 2OH - Cd(OH) 2 (s) + 2e - Décharge Equation globale : 2 NiOOH(s) + Cd + 2 H 2 O 2 Ni(OH) 2 (s) + Cd(OH) 2 Décharge Equations de recombinaison : Si la charge se prolonge, il y a aussi émission d oxygène et d hydrogène : Borne positive : 2 OH - H 2 O + ½ O 2 + 2 e - Charge Borne négative : 2 H 2 O + 2 e 2 OH - + H 2 Charge Equation globale : H 2 O + ½ O 2 + H 2 Charge 2.3.E. ADDITIFS : La transformation en hydroxyde de nickel provoque une augmentation de volume d'environ 14 %. Cet effet est néfaste car ne permet pas de reformer exactement les électrodes après quelques cycles.
Fig.21 expansion due à l'hydroxyde de Ni On ajoute donc quelques additifs pour: a. diminuer l'expansion volumétrique: lithium b. améliorer la fixation des matériaux actifs: cobalt Il est à noter que c'est la raison principale qui interdit d'utiliser les batteries de type Nickel-Cadmium à des DOD trop importants.
Exemple d accumulateur Ni-Cd: Fig.21 exemple de batterie Ni-Cd Il est à remarquer que l'utilisation de poudres d'hydroxyde de nickel à haut taux de porosité permet d'obtenir une surface apparente plus importante et donc de capacité plus importante. 2.3.F. ACCUMULATEURS NICKEL MÉTAL HYDRURE : Ces nouveaux accumulateurs alcalins offrent de très bonnes performances mais ont un taux de «self-discharge» très important. Ils sont semblables aux batteries Ni-Cd où l'électrode négative est remplacée par un alliage métallique.
Pour les alliages de métaux, on utilise : Mm: Mischmetal, mélange de métaux lanthanides. Ceux-ci permettent de considérablement augmenter la durée de vie des accumulateurs comme on le voit sur le graphique suivant: Fig.22 influence des alliages
2.3.G. RÉACTIONS CHIMIQUES : Ces réactions sont analogues aux réactions des accumulateurs Ni-Cd. Réactions primaires : Borne positive : NiOOH(s) + e - + H 2 O Ni(OH) 2 (s) + OH - Borne négative : Décharge MH(s) + OH - M(s) + H 2 O + 2e - Décharge Equation globale : NiOOH(s) + MH Ni(OH) 2 (s) + M Décharge Equations de recombinaison : Si la charge se prolonge, la batterie MH réagit comme les batteries Ni-Cd : Borne positive : 4 OH - 2H 2 O + O 2 + 4 e - Charge Borne négative : 2 H 2 O + 2 e 2 OH - + H 2 Charge Equation globale : H 2 O + ½ O 2 + H 2 Charge
2.3.H. COMPARAISON ENTRE NI-CD ET NI-MH: Fig.23 comparaison entre Ni-Cd et Ni-MH
2.4. ACCUMULATEURS AU LITHIUM : Pour conclure le chapitre sur les principales batteries existantes, il faut parler des batteries au lithium qui semblent être l'avenir de la batterie pour les VE. Le lithium est un métal très léger, avec une masse atomique de 6.94, son énergie spécifique est très importante et son potentiel de réduction vaut 3.045 V. De plus, son point de fusion est assez haut (180 C) ce qui permet une facile adaptation à différents modes de fonctionnement. Une autre qualité très importante également est que le lithium est un métal très facilement usinable en fines couches. Vu que l'oxydation du lithium n'implique qu'un seul électron, sa capacité volumique est intérieure à d'autres types de batteries mais son poids très faible et son grand potentiel lui procure une densité d'énergie spécifique très importante. Jusque très récemment, les seuls accumulateurs au lithium disponible étaient à haute température mais des batteries au lithium fonctionnant à température ambiante apparaissent. 2.4.A. MÉCANISME D INTERCALAGE : Le point de départ du développement des batteries au lithium est la découverte par Whittingham du "mécanisme d'intercalage". Celui-ci consiste en une incorporation d'ions Li + dans certaines structures inorganiques (comme TiS 2 ). Cet intercalage ne produit que peu de changements dans la structure cristallographique du récepteur. On peut alors obtenir la réaction suivante: xli + + TiS 2 + xe - Li x TiS 2 avec 0<x<1 Cette réaction est réversible et rapide. Elle peut donc servir de borne positive pouvant recevoir des courants importants. l'électrolyte utilisé fut le LiClO 4 dans du dioxolane qui s'avéra adéquat pour assurer un processus réversible au Li et au TiS 2 mais malheureusement, cet électrolyte se révéla instable. Des solutions furent trouvées en utilisant une nouvelle structure hôte (NbSe 3 ). De nouveau progrès furent réalisés avec les batteries de type lithium-ion. Celles-ci se caractérisent par des intercalation de lithium dans les deux électrodes. Ceci est possible en prenant des couples lithium électrodes ayant des différences d'énergie libre suffisantes pour assurer une différence de potentiel suffisante aux bornes de la batterie. Schéma de batterie lithium-ion :
Fig.24 schéma d'un accumulateur lithium-ion Tension aux bornes d un accumulateur au lithium : Fig.25 évolution de la tension d'une batterie au lithium Comme on le voit sur ce graphique, la tension varie de façon analogue aux accumulateur au plomb ou alcalin. il est noter qu'ici l'impédance de la batterie ne varie pas beaucoup car l'électrolyte ne participe pas à la réaction et qu'il n'y a pas précipitation aux électrodes mais bien intercalage dans l'électrode.
02'e/,6$7,21'(/ e7$7 '(&+$5*('(6%$77(5,(6 $83/20%
3.1. DÉFINITION ET GRANDEURS ASSOCIÉES : Définition : L état de charge (en anglais S.O.C., State Of Charge) d une batterie est la quantité d énergie pouvant encore être utilisée, celle-ci est relative à la capacité totale de l accumulateur. Le S.O.C. est lié principalement à la quantité de matériaux encore actifs dans la batterie. Il est à noter que l on recherche l énergie pouvant encore être utilisée et non l énergie totale se trouvant dans la batterie car il nous faut un état de charge nous donnant une image de l énergie réellement exploitable dans la batterie. Afin de déterminer ce soc, deux approches sont possibles : À À Méthodes physiques : basées sur les changements chimiques et physiques apparaissant dans la batterie. Méthodes électriques : basées sur le suivi de grandeurs électriques de la batterie (tension, impédance). Une mesure de concentration ou de densité d électrolytes dans le cas d accumulateurs au plomb est la méthode donnant la meilleure estimation du SOC car c est la seule méthode donnant avec exactitude la quantité de matériaux actifs encore présents dans la batterie. Fig.26 densité, tension et capacité
Il est à noter que la température influence ces courbes, on peut donc corriger la tension à l aide de coefficients. L évolution de ceux-ci dépend de la température et du poids spécifique de l électrolyte : Fig.27 influence de la température sur la densité On peut également étudier l'influence de l'indice de réfraction en fonction de la capacité: Fig.28 influence du soc sur l'indice de réfraction
L utilisation de fibres optiques permettrait donc une mesure continue de la capacité. Malheureusement, les dépôts sur l'indicateur inévitables avec l'âge, les formations de bulles dans l'électrolyte introduisent des erreurs systématiques. De plus il faudrait pouvoir en incorporer dans plusieurs cellules et dans plusieurs endroits car la concentration n'est pas homogène. Ceci n'est donc pas réalisable du point de vue économique. Au cours de la décharge la tension aux bornes de l accumulateur varie, pour voir cette évolution, voici un graphique de la tension aux bornes d une batterie au plomb : Fig.29 tension en fonction du temps "coup de fouet" : lors de la décharge d'une batterie complètement chargée, il apparaît une légère chute de tension pendant les premiers instants, cette variation disparaît assez vite et est inexistante si la décharge se produit à partir d'un état déchargé (même légèrement). Ce phénomène est dû à la germination de sulfate de plomb sur les électrodes qui introduit une surtension supplémentaire. On peut aussi regarder l évolution de la tension à vide :
Fig.30 évolution de la tension à vide On remarque donc une évolution linéaire, ceci provient principalement de l'absence des phénomènes de polarisation lorsque l'on mesure la tension de la batterie sans décharge. Pour les accumulateurs de type Nickel-cadmium, on a une évolution identique de la tension en fonction du SOC :
Fig.31 tension en fonction du temps pour un accumulateur au nickel Grâce à la loi de Nernst, nous connaissons la relation qui existe entre cette tension aux bornes de l accumulateur et la concentration de l électrolyte. En corrélant la tension à vide et la densité d électrolytes nous obtenons une relation sensiblement linéaire comme on le voit sur la figure 28. La tension est donc une image valable de l état de charge. Les constructeurs d'ailleurs se basent dessus pour indiquer à l'utilisateur la tension de fin de charge Malheureusement, vu l allure de la courbe de tension en fonction de la décharge, on voit qu une légère erreur sur la tension amène une erreur très importante sur le soc :
Fig.32 erreur sur tension Afin de corriger ce problème, une mesure de la quantité d énergie (en ampères heures) peut être réalisée afin d estimer la quantité d énergie restante en tenant compte du rendement de la batterie. Malheureusement dans ces mesures d énergie, le rendement est loin d être constant et il est utile de remarquer que lorsque l on retire de l énergie à haut courant, comme dans le cas d une accélération importante, la capacité de la batterie diminue très fortement. Grâce à Peukert, une loi expérimentale nous permet de quantifier ce phénomène que l'on peut voir sur le graphique suivant: Capacité Vs Taux de décharge 120 100 % Capacité 80 60 40 20 0 C/40 C/10 C/2,5 2,5C 10C 40C 160C Décharge à courant constant Fig.33 influence du courant sur la capacité
Il faut aussi tenir compte que dans le cycle de charge / décharge de la batterie, la température est loin d être constante. On peut le voir grâce à ces courbes réalisées à l ULg sur des batteries au nickel : Recharge normale: Recharge rapide Fig.34 influence du courant sur la capacité Fig.35 influence du courant sur la capacité (charge rapide)
Pour la décharge, la réaction étant exothermique, la température intervient de façon importante. De plus, lorsque la batterie débite des grands courants, nous avons un apport de chaleur important dû à l effet joule. Dans le cas de la recharge la réaction étant endothermique la température reste assez basse sauf dans le cas de charge rapide où les grands courants apportent une quantité de chaleur significative. Il faut savoir aussi que lorsque la batterie est rechargée l apport d énergie supplémentaire est intégralement transformée en chaleur et en réactions secondaires, ce qui se voit dans les graphiques précédents par des augmentations importantes de températures. Pour une analyse thermodynamique plus détaillée de la batterie, j'invite le lecteur à lire le TFE de Jean-Michel Mottard. Un autre paramètre important est l âge de la batterie, après quelques centaines de cycles, la capacité de la batterie a diminué, et donc il faut que, dans la mesure de l état de charge, l état initial, la capacité totale de la batterie, soient pris en compte pour donner la valeur réelle de cette capacité.
3.2. MODÈLE CHIMIQUE Afin de pouvoir comprendre les grandeurs extérieures (électriques ou physiques) et leur évolution dans le temps, il nous faut partir des équations de base du processus de la charge et de la décharge et donc nous devons partir du modèle chimique. Tout d abord, il faut analyser le phénomène de conduction : 3.2.A. CONDUCTIVITÉ : Un courant électrique peut être porté par des électrons (comme dans les métaux et la plupart des semi-conducteurs) ou par le mouvement d ions. Dans les électrolytes, la conduction est essentiellement ionique. On peut utiliser les lois d Ohm et de Pouillet : U = R = où RI l 1 l ρ k = = A ρ RA R :résistance [Ohm] ρ : résistivité [Ohm x m] κ : conductivité [Siemens x m -1 ] Avec les solutions d électrolytes, la conductance est une quantité à utiliser plus naturelle que la résistance vu qu elle est liée directement au nombre d ions présents et leur capacité au mouvement. Le solvant seul n est presque pas conducteur et donc la conduction provient entièrement des ions de l électrolyte dissolu. Si la concentration de la solution est c g équivalent par litre, la conductance spécifique (k en ohm -1 cm -1 ) est clairement due à c /1000 g équivalents et la conductance théorique pour un g équivalent serait k x 1000/c= Λ, la conductivité équivalente. La conductivité équivalente, Λ, d une solution est une mesure du nombre et du taux de migration des anions et des cations d un gramme équivalent de la solution. Les expériences montrent que Λ augmente quand la solution est diluée (ou k bien sûr diminue ) cette augmentation de Λ avec la dilution provient d une augmentation relative d ions présents ou d une augmentation du taux de mouvement de ces ions. Debye et Huckel et Onsager ont obtenus une relation de la conductivité pour les solutions diluées : ( aλ b) C Λ c = Λ 0 0 + Où C est la concentration, Λ 0 est la conductivité limite de la solution complètement dissociée et a et b sont des constantes qui sont évaluées à partir de la théorie. En pratique, les graphiques de Λ vs la racine carrée de c sont approximativement linéaires.
Fig.36 influence de la concentration sur la conductivité Par contre des écarts importants apparaissent pour des concentrations moyennes à fortes. Pour ces concentrations, il est plus juste d utiliser l équation empirique: = Λ aλ + b I C ( ) I Λc 0 0 +
où I représente la force ionique ( I = 2 1/ 2 C z s i, où C s est la concentration molaire). l'introduction d'un terme supplémentaire permet de tenir compte du rayon de moindre approche (cfr théorie de Debye-Hückel). En exemple, voici la conductivité de H 2 SO 4 pour des concentrations que l on trouve dans les batteries au plomb : Fig.37 influence de la densité sur la conductivité 3.2.B. NOMBRE DE TRANSPORT ET MOBILITÉ IONIQUE : Quand un courant passe dans un électrolyte, le changement de concentration aux électrodes n est en général pas le même. Alors que des quantités équivalentes d ions positifs et négatifs sont nécessairement déchargés aux électrodes (Loi de Faraday), la vitesse à laquelle les ions se déplacent est différente. En conséquence, la quantité d électricité apportée par les cations est différente de la quantité d anions dans l autre direction. Ces deux quantités sont dans le rapport de la mobilité des cations et anions respectivement. Leurs différences proviennent principalement dans les solutions des différents rayons hydratés des ions.
Le courant total passant dans la solution est égal à la somme des mobilités ioniques : u+ + u-. On appelle les nombres de transports (t) les fractions de mobilités des cations et des anions : u + t + =, u+ + u u t = et t + + t - = 1 u+ + u La relation entre nombre de transport et la mobilité ionique est obtenue de la façon suivante. Si un ion à la concentration c g équivalent/litre a un nombre de transport de t, et que la conductivité spécifique de la solution est k ohm -1 cm -1, alors dans 1 cm 3 de solution soumit à un gradient de tension de 1 V/cm, un courant de k ampères va circuler. La quantité d électricité transportée par les ions en 1 seconde vaudra donc t*k coulombs, ce qui correspond à tk/96500 g équiv. La solution contient c/1000 g équiv par ml et donc la mobilité des ions est donnée par : u=(1000 tk)/(96500c) cm/sec 3.2.C. FORCE ELECTROMOTRICE DES PILES : Théoriquement, si la tension (force électromotrice) aux bornes d une cellule vaut E, le travail maximum pouvant en être retiré vaut :E*Q joules, où Q est le nombre de coulombs pouvant être retirés de la cellule. Si on exprime cette quantité par grammes équivalents, on obtient nef (ù F = Faraday = 96500 coulombs). Ce travail est égal à la diminution d énergie libre(- G) de Gibbs dans la réaction d oxydo-réduction. De plus, une étude de la f.e.m. à différentes températures donne d G l entropie de la réaction ( S) vu que : = S. La chaleur de la réaction peut dt donc être estimée par : H = G + T S Dés 1889, Nernst a obtenu la relation liant la tension à vide et la concentration des constituants de la cellule : RT ax z + E = E + 0 ln zf ax pour Me Me z+ + z e - Chaque accumulateur est constitué de deux électrodes ou «demi-» cellules qui sont reliées par l électrolyte. En général on considère que chaque électrode a son propre potentiel par rapport à l électrolyte. Ces potentiels ne peuvent être mesurés séparément mais leur différence donne la f.e.m. de la batterie ( E 0 = E 1 -E 2 ). Chaque électrode peut être considérée comme le siège d une réaction électrochimique où un (ou plusieurs) électron(s) passe(nt) de l électrode vers l électrolyte et inversement.
Fig.38 schéma d'une batterie Dans une batterie, l électrode qui a le plus grand potentiel est appelé la borne positive et l autre électrode est la borne négative. Il est à noter que l on parle aussi de cathode et d anode. On appelle la cathode la borne où l'électrode apporte des électrons pour réduire la solution. Inversement, l anode est définie comme la borne où la solution est oxydée pour donner des électrons à l électrode. Pendant la charge, la cathode est la borne positive et pendant la décharge c est l inverse. Vu que le nom de l électrode change lorsque l on passe de la charge à la décharge, on préfère parler de bornes positives et négatives. Pour un accumulateur complet, l équation de Nernst devient : E = E 0 RT nf ln ( activites des produits) ( activites des réactifs) Malheureusement, dans cette équation, les concentrations doivent être remplacées par les activités. En effet, les fortes concentrations ainsi que les gradients qui apparaissant en charge nous obligent à tenir compte de la concentration réellement utilisable : l activité. Celle-ci tendant vers la concentration pour des solutions diluées. µ=µ 0 +RTln(a), avec µ 0 étant le potentiel standard a=γ x, avec γ 1 et γ -> 1 pour a <<< Cette activité ne peut malheureusement être facilement déterminable car ce qui nous intéresse, c est l activité locale au niveau des électrodes qui est donc non homogène et dépendante du courant retiré de la batterie. 3.2.D. PHÉNOMÈNE DE POLARISATION :
Lorsqu un courant passe dans l accumulateur, la tension varie de l équilibre du circuit ouvert vers une valeur plus faible. Ce phénomène est appelé la polarisation. Voici sur un graphique les effets de la polarisation sur la tension : Fig.39 potentiels d'électrodes et polarisation Cette polarisation diminue les performances des batteries, même si toutes les charges sont récupérées. Cette polarisation peut être divisée entre trois parties distinctes :
1. Polarisation d activation : reprend l énergie nécessaire pour vaincre la barrière d énergie d activation. Elle reprend aussi les processus limités comme l électrolysation. 2. Polarisation de concentration : représente la variation du potentiel d électrode apportée par des changements locaux de concentration. 3. Polarisation résistive : représente la chute de potentiel due aux pertes résistives dans la cellule. Au total, la tension apparaissant aux bornes de la batterie vaut : E = E 0 η η η a c r On voit donc que la polarisation est inévitable et nuisible au rendement car elle apporte des pertes d énergie. Vu que la polarisation est dépendante principalement du courant traversant l accumulateur, les constructeurs ont élaboré les plus grandes surfaces possibles pour pouvoir avoir des densités de courant les plus faibles possibles pour obtenir une polarisation réduite. C est à cause de ces effets que la capacité des batteries au plomb varie avec le courant selon la loi de Peukert. (voir 3.3.b) 3.2.E. POLARISATION D ACTIVATION : Pour qu une réaction puisse se dérouler, les lois de la cinétique imposent que les réactifs surmontent des barrières d énergie. Cette énergie nécessaire peut provenir d une origine thermique ou électrique dans le cas d une électrode. L énergie nécessaire est liée à une diminution du potentiel d électrode, cette variation est dépendante du courant circulant et d après la relation de Butler-Volmer, on peut obtenir cette polarisation (η a ). η η a a i RT = i n F 0 pour de faibles courants RT RT = ln( i) ln( i0 ) α n F α n F pourη a > 200 mv où α est une constante liée à la forme de la barrière de potentiel et i 0 représente la densité de courant existant dans les deux directions à l équilibre (sans courant net circulant), de 10-1 à 10-5 A/cm 2 pour des batteries. Ces relations peuvent être résumées selon la loi de Tafel : ηa = a + bln ( i)
Fig.40 polarisation d activation 3.2.F. POLARISATION DE CONCENTRATION : Le courant dans la batterie implique que la concentration des réactifs diminue et que la concentration des produits de la réaction augmente. Cette variation de concentration implique donc, selon la loi de Nernst, une variation du potentiel d électrode. La polarisation va donc varier au cours de la réaction et en fonction du courant circulant dans la batterie. La théorie de la diffusion indique que vu que la couche d électrolyte en contact avec l électrode devenant vide de réactifs, le courant maximal est caractérisé par la capacité de diffusion des réactifs près de cette couche. Le transfert de réactifs vers l électrode est assuré par la diffusion des ions ainsi que l électromigration de ceux-ci dans le champ électrique. Dans le cas d un seul réactif, la polarisation de concentration est donnée par : RT 1 ηc = ln (1 + ) nf Y a n F D Y = nt δ (1 + ) z où a : activité de la solution D : coefficient de diffusion δ : épaisseur de la couche d électrode t : nombre de transport n : charge du réactif Il est à noter que si on a un courant trop important, le transport d ions vers l électrode ne peut être assuré et on a une augmentation abrupte de η c qui freine ou arrête la réaction.
3.2.G. POLARISATION RÉSISTIVE : Tous les composants d une batterie ont une conductivité finie et donc il apparaît une chute de potentiel ohmique lorsqu un courant la traverse. Il est à noter que les séparateurs, qui existent pour éviter que les électrodes ne se touchent, apportent une résistance supplémentaire. Pour les accumulateurs au plomb, la création de sulfate de plomb sur les électrodes introduit une augmentation de la résistance également. η r = I R 3.2.H. DOUBLE COUCHE ELECTRONIQUE : L application d un potentiel à une électrode dans un électrolyte provoque un courant transitoire qui modifie la répartition des charges dans celui-ci. En effet, la couche de solution immédiatement adjacente à l électrode acquiert la charge opposée au potentiel de l électrode et il apparaît une région où la décroissance de potentiel est décroissante. Cette couche est appelée double couche électronique Voici un schéma qui explique ce phénomène :
Fig.41 double couche électronique
3.3. MODÈLE ÉLECTRIQUE : 3.3.A. INTRODUCTION : Dans ce chapitre, les différentes méthodes actuelles et futures de détermination du SOC des batteries à partir de mesures électriques seront présentées. 3.3.B. MESURE A PARTIR DU RENDEMENT : Le processus chimique des batteries étant réversible, il est possible, si la DOD ( Depth Of Discharge ) n est pas trop importante, de reproduire l état initial des électrodes en appliquant aux bornes une tension opposée. Pour ce cycle, on peut définir des rendements associés : Rendement Coulombique ρ q : rapport de la quantité d électricité restituée par rapport à celle apportée pendant la charge : ρ q = déch arg e Idt ch arg e Rendement énergétique ρ w : rapport de la quantité d énergie restituée par rapport à l énergie apportée pendant la charge : ρ w = déch arg e ch arg e UIdt UIdt = Idt décharg e ch arg e ( E RI) dt ( E + RI) dt Des mesures de ces rendements peuvent donner une bonne estimation de la quantité d énergie restante dans l accumulateur pour des courants faibles. Lorsque que l on considère une charge réelle et donc des courants importants qui varient beaucoup pendant le temps, il faut faire des corrections importantes. En effet, pour ces grands courants, le rendement diminue fortement vu que l on approche de la capacité maximum de la batterie et que les phénomènes de polarisation, de mobilité maximum des ions, de la diffusion qui ne peut amener assez de nouveaux ions, de la déposition d'oxydes non conducteurs (de PbSO 4 pour les batteries au plomb) sur les électrodes et de l apport de chaleur important de la réaction ne permettent pas de faire la réaction dans des conditions idéales.
Fig.42 tension en fonction du courant de décharge Dés 1897, Peukert a quantifié ce phénomène par une loi expérimentale qui quantifie la non-linéarité de la variation de la capacité avec le courant : K C = où p et K sont des constantes, ( p 1) I I le courant et C la capacité en Ah p vaut de 1.3 à 1.4 K est une image de la capacité de la batterie. Il est à noter que la loi de Peukert est limitée car elle ne tient pas compte de la température et que celle-ci perd sa précision pour des courants très forts et très faibles. 3.3.C. PARAMETRES : Compensation de la température : Comme on le voit sur ce graphique, la température influence beaucoup la capacité. En effet, la température modifie l équilibre de la réaction d oxydo-réduction des piles (par la loi de Nernst) et donc modifie aussi la capacité.
De plus, l'augmentation de température diminue la viscosité de l'électrolyte et donc aussi la résistance de l'élecrolyte ce qui modifie la polarisation résitive. Fig.43 effet de la température sur une batterie au plomb L International Electrotechnical Commission (IEC) a élaboré la formule suivante pour déterminer l influence de la température sur la capacité. Capacity(T)= Capacity 30 x (1 + 0.008 x (T 30)) Celle-ci étant valable pour des températures courantes.
Compensation de l âge : Avec le temps, la capacité théorique diminue et il faut en tenir compte dans l évaluation du SOC. Cette diminution avec l âge provient du fait qu'il peut y avoir une perte de matériaux actifs si le sulfate de plomb ne se fixe pas assez solidement sur les électrodes lors de la décharge. Dans ce cas, il y a une diminution de capacité car des réactifs sont perdus dans l électrolyte. Les électrodes évoluent aussi et malgré les recherches dans la forme à leur donner, celles-ci ne reprennent pas exactement leur constitution optimale après reconstitution. Pour quantifier cette diminution, on utilise un facteur linéaire en fonction du nombre de cycles. Compensation de la «self-discharge» : Quand la batterie reste inutilisée, la capacité diminue lentement en fonction du temps. Cet effet est dû à des réactions chimiques internes. Il faut donc tenir compte de ce paramètre en analysant les courbes de self-discharge de l accumulateur en fonction du temps et de la température moyenne. Il faut remarquer que si cette décharge apparaît à des DOD importants, il apparaît des cristaux durs de PbSO 4 qui ne se dissocient plus et donc la capacité de la batterie en est diminuée définitivement. Fig.44 effet de la température sur la "self discharge" des batteries VRLA
3.3.D. INFLUENCE DE LA RECHARGE PENDANT LE FREINAGE : Dans les VE actuels, afin d améliorer le rendement énergétique global, on utilise une partie du freinage afin de rendre une partie de l énergie cinétique à la batterie. Ceci complique sensiblement le modèle car le rendement énergétique doit en tenir compte. Ceci est difficile à estimer car le rendement du processus de restitution pendant le freinage est loin d être constant et dépend principalement du courant avec lequel la batterie est rechargée. Celui-ci dépendant bien sûr du taux de freinage. Ceci explique pourquoi les mesures énergétiques ne sont pas facilement réalisables pour la détermination du SOC des accumulateurs. Dans les perspectives d avenir, on parle beaucoup de super-capacités et de volants d inertie qui pourraient diminuer les fluctuations du courant demandé à la batterie. Ceci permettrait d augmenter le rendement de la batterie en évitant les pointes de courant et permettrait de mieux estimer le SOC par des mesures énergétiques compensées par la loi de Peukert. 3.3.E. MESURE DE LA TENSION : Vu les problèmes rencontrés dans l estimation du SOC par des mesures énergétiques, des recherches ont été effectuées pour pouvoir, à partir de mesures directes, déterminer le SOC. Dans cette optique, la tension a bien évidemment été la première mesure à être utilisée par sa simplicité de mise en œuvre. Récemment d autres mesures ont été proposées et principalement la mesure de l impédance (réelle et imaginaire). Afin d estimer le SOC, on a donc vu que des mesures de la tension aux bornes de la batterie pouvaient en donner une estimation (voir 3.1, Fig. 27). En effet, regardons l évolution au cours du temps de la tension : Une fois que la décharge est commencée, la tension chute instantanément à cause de la chute de potentiel due à la résistance interne. Le coup de fouet, diminution de la tension pendant les premiers instants après la décharge, est dû à un phénomène de cristallisation pour les batteries complètement rechargées. Après ce coup de fouet, une diminution plus ou moins linéaire de la tension est observée. Il est à noter que la chute ohmique dépend du courant et donc il faut pouvoir la soustraire si on analyse la courbe pour des courants différents. Ce problème est résolu si on fait une mesure de la tension à vide qui permet aussi de s affranchir des problèmes de polarisation et de concentrations non uniformes aux bornes de la batterie.
Malheureusement vu l allure presque horizontale de la tension, on voit bien qu une erreur de position induit une erreur importante dans la détermination du SOC. ( voir Fig. 30) 3.3.F. MODÈLE ÉQUIVALENT ÉLECTRIQUE : Vu les phénomènes chimiques apparaissant dans l accumulateur, on peut essayer de modéliser la batterie à partir d éléments simples comme des résistances, inductances et condensateurs équivalents. On a vu en 3.2.d que l on avait : E = E 0 η η η a c r Nous allons donc utiliser un modèle qui va au mieux reprendre les différentes polarisations. Un modèle général est de considérer une électrode de la batterie comme une combinaison de tous les éléments électriques possibles : R : Résistance de l életrolyte et des électrodes L : Inductance caractérisée par forme des plaques C : Condensateur reprenant la double couche Ce modèle simpliste doit être éliminé car la capacité n est pas linéaire et on doit donc la modifier. L inductance ne nous intéresse pas ici car celle-ci ne dépend que du chemin pris par les électrons et n est pas fonction de l état de charge. Dans les modèles suivants nous n en tiendrons donc pas compte et les mesures que nous ferons seront toujours à des fréquences relativement faibles pour que l inductance ne perturbe pas les résultats. En effet, on peut lire dans les articles sur le sujet qu il existe une fréquence en-dessous de laquelle le modèle est presque uniquement résistif et capacitif (en-dessous de quelques centaines de Hz pour les batteries Ni-Cd).
On peut donc plus justement modéliser l électrode par un modèle différent : Rm : résistance de l électrode Ra : résistance de l acide (de l électrolyte) R : résistance non linéaire (polarisation) C : capacité (due à la double couche) Le montage en parallèle provient du fait que le courant total traversant la cellule peut être considéré comme la somme de contributions distinctes. le courant passant dans la résistance est appelé le courant faradaïque car il est égal au courant produit par la réaction à l'électrode, l'autre courant étant le courant de charge du pseudo condensateur représentant la double couche. La résistance faradaïque n'est pas un élément idéal, celle-ci peut généralement être décomposée en une somme d'élément: où R : Résistance de charge Z w : impédance de Warburg, tenant compte des limitations de transfert de masses. Cette impédance est fonction de ω. Pour la batterie complète, on obtient :
Fig.45 schéma de la batterie et de sa modélisation Ce modèle étant basé sur les réactions chimiques, on peut donc déterminer des phénomènes internes à partir de mesures électriques. 3.3.G. MESURE DE L IMPÉDANCE : Au vu du modèle obtenu, il semble logique de chercher une relation entre l impédance et le SOC. En effet, au fur et à mesure que la décharge se prolonge, l impédance augmente jusqu'à la fin de la décharge. Cet effet, principalement dû à une diminution d ions porteurs de charges dans les accumulateurs au plomb est également dû à la déposition aux électrodes de précipités résistifs. Lorsque l on arrive à des DOD importants, les phénomènes de polarisation augmentent également car il est de moins en moins facile de continuer la réaction lorsque la quantité de matériaux réactifs est nettement réduite. En effet, la surface disponible
pour continuer la réaction diminue avec la déposition du précipité (du sulfate de plomb pour les batteries au plomb). Ceci augmente donc la densité de courant et donc le phénomène de polarisation. Malheureusement, même si la résistance varie relativement plus que la tension ce qui permet d obtenir une erreur moindre sur le SOC, les impédances sont de l ordre du mω ce qui est très faible. En effet, comme on le voit sur les mesures effectuées sur les batteries Ni-Cd au Laboratoire de Thermodynamique de Mr le professeur Lebrun, la dispersion des mesures est assez importante. Fig.46 variation de la tension et de l'impédance en fonction du temps
R as a function of DOD (FOURIER) - measures:mes 2 804 2.2 2.1 2 R [mohm] 1.9 1.8 1.7 1.6 0 10 20 30 40 50 60 70 80 90 100 DOD [%] Fig.47 mesure d'impédance sur accumulateur Ni-Cd Il faut donc s assurer que les mesures soient prises dans les conditions les plus identiques possibles et dans le cas contraire, prendre des facteurs de correction correspondant sur l impédance. Dans la mesure d impédance, on peut dissocier les parties réelles et imaginaires. La partie réelle étant de loin la plus importante et représentant principalement la résistance des électrodes et de l électrolyte. Cette résistance globale varie avec le SOC comme le module de l impédance complexe car elle en représente la plus grosse partie. La partie imaginaire, beaucoup plus petite, reprend la polarisation de la cellule par apparition de la double couche aux électrodes. Celleci varie aussi en fonction du SOC mais vu l ordre de grandeur (moins de 10-4 Ohm) et les effets non-linéaires qui y sont associés, il est très difficile de l exploiter. Il faut bien remarquer aussi que l on est loin d un condensateur classique vu que l électrolyte est loin d être un diélectrique (celui-ci étant très bon conducteur) et que les phénomènes de polarisation ne sont pas linéaires. Les mesures d impédance de batteries sont déjà utilisées mais principalement dans un but de fiabilité. En effet l impédance est un moyen très adapté pour déterminer les cellules défectueuses. Un court-circuit entre électrodes est ainsi directement détecté ainsi qu un problème dû à l usure des accumulateurs vu que l impédance des batteries varie en fonction de l âge de celles-ci. En effet, lors de la charge et de la décharge, la formation et la dissolution des électrodes induit inévitablement une perte de matériaux actifs ainsi que des précipités durs qui ne se dissolvent pas facilement au cycle suivant (voir chapitre 3.3.c), ce qui en diminue d autant la capacité et augmente l impédance.
(;3e5,(1&(6(7 3(563(&7,9(6
4.1. MESURES SUR BATTERIE AU NICKEL : Vu que nous n'avons pas pu réaliser de mesures dans le service d'électrotechnique de la VUB à cause d'un problème matériel dans la chaînes d'acquisition de mesures, nous avons cherché d'autres possibilités pour obtenir des résultats. Par chance, nous avons pu réaliser quelques mesures au dernier moment sur des batteries de traction Ni-Cd dans le laboratoire de thermodynamique de Mr le professeur Lebrun. Les mesures qui ont été réalisées (pour détails, voir TFE: " Détermination de l'état de charge des batteries d'un véhicule électrique" de Fabrice Delfosse, 1998) ont permis de quantifier et justifier les phénomènes qui ont été décris dans le chapitre précédent. Afin de ne pas tenir compte de l'impédance de déchargequi variait continuellement et pour assurer au circuit de mesure de ne pas subir de courants trop importants, les mesures sont effectuées à courant continu nul. La décharge était donc interrompue pendant 30 secondes avant que l'on injecte un signal alternatif à 50 Hz (provenant du réseau) et que, à l'aide de deux mesures de tension sur un oscilloscope numérique, on puise obtenir l'impédance complexe (module et phase) de la batterie. Vu le temps limité dont nous disposions, le nombre de mesures était très limité mais heureusement, les mesures successives donnèrent des résultats sensiblement équivalents. Nous avons donc obtenu les courbes suivantes:
Zabs as a function of DOD (FOURIER) - measures:mes 305 2.2 x 0 10-3 2.15 2.1 2.05 Zabs [mohm] 2 1.95 1.9 1.85 1.8 1.75 1.7 0 10 20 30 40 50 60 70 80 90 100 DOD [%] Fig.48 mesure d'impédance complexe 1 2.15 x 10-3 Zabs as a function of DOD (FOURIER) - measures:mes 2 804 2.1 2.05 2 Zabs [mohm] 1.95 1.9 1.85 1.8 1.75 1.7 1.65 0 10 20 30 40 50 60 70 80 90 100 DOD [%] Fig.49 mesure d'impédance complexe 2
Les différences entre les deux courbes proviennent de l'état initial qui était différent et on voit que les courbes reprennent la même évolution après le début de la décharge. Au début de la décharge, on voit une légère diminution de l'impédance. Ceci est dû au fait que le début de la décharge induit une augmentation de la température (voir chapitre 3.1) qui diminue la viscosité et donc augmente la conductivité de la solution. Vu qu'au début de la décharge, les électrodes sont presque totalement dépourvues d'hydroxyde de nickel, l'impédance totale de la batterie s'en trouve affectée. Pour des DOD plus importants, l'augmentation d'impédance est due majoritairement à la déposition d'hydroxyde de nickel qui diminue la surace de contact entre l'électrode et l'électrolyte et donc augment la résistance interne de la batterie. Cet effet est d'autant plus marqué que le DOD devient important. Il est à noter que la variation d'impédance est très faible (de l'ordre du mω) et donc que des erreurs de mesure sont inévitables. Ceci se voit par la dispersion des mesures réalisées qui doit être corrigée par la recherche d'une courbe de moindre erreur. Dans les mesures effectuées le 3 avril, la diminution d'impédance pour les faibles DOD s'explique par une température initiale plus élevée et donc une variation monotone croissante de l'impédance avec l'avancée du processus et la déposition d'hydroxyde sur les électrodes. Si on décompose l'impédance complexe en ses parties réelles et imaginaires, on obtient: 2.25 R as a function of DOD (FOURIER) - measures:mes 0 305 2.2 2.15 2.1 R [mohm] 2.05 2 1.95 1.9 1.85 1.8 1.75 0 10 20 30 40 50 60 70 80 90 100 DOD [%] Fig.50 mesure d'impédance, partie réelle
5 x 10-4 I as a function of DOD (FOURIER) - measures:mes 0 305 4.5 4 3.5 I [m O hm ] 3 2.5 2 1.5 1 0 10 20 30 40 50 60 70 80 90 100 DOD [%] Fig.51 mesure d'impédance, partie imaginaire La partie réelle est la caractéristique la plus importante de l'impédance complexe comme on le voit dans les graphiques. En effet, l'impédance est presque purement résistive car la mesure "ouverte" (en continu) ne permet pas à la polarisation d'être très importante. La partie réelle montre ainsi une évolution avec le DOD comme explicité avant. La partie imaginaire est donc presque négligeable dans ces mesures. Ceci est logique vu que celle-ci est fortement associée à la double couche électronique et qu celle-ci ne peut être importante sans courant continu et sous un courant alternatif de 50 Hz. En effet, l'inversion régulière de la tension ne permet pas à la double couche de prendre une taille suffisante. Il est donc très difficile d'obtenir des résultats avec des valeurs aussi faibles (10-4 Ω). On peut toute fois supposer que la chute de la réactance est due à une diminution de la surface de contact.
4.2. PERSPECTIVES: Comme il a été dit dans l'introduction, ce travail n'est pas l'image des objectifs initiaux que nous avions choisi. J'estime donc qu'il serait logique de reprendre ces orientations pour continuer les recherches. Ce travail a donc été réalisé pour expliciter une partie importante des effets associés aux accumulateurs afin de pouvoir donner une justification à des mesures prises sur des batteries. Afin de quantifier et d'obtenir des informations importantes sur les paramètres intervenant dans les phénomènes associés à l'utilisation de batterie, il serait logique de réaliser une identification de ces systèmes. Je conseille donc l'utilisation de méthodes d'identification de systèmes linéaires (par exemples celles de Mr Professeur J. Schoukens: "System Identification, A Frequency Domain Modeling Approach) afin d'obtenir un modèle dans le domaine fréquenciel. Suite au cours d'apprentissage inductif de Mr Wehenkel (Ulg, Montéfiore) et les résultats que cette méthode apporte à des problèmes complexes ayant beaucoup de paramètres, je conseille au lecteur d'essayer ces méthodes expertes afin de déterminer des arbres de régression ou de décision (en fonction de l'état de charge ou de la tension par exemple) qui seraient facilement implémentables dans des modules électroniques embarquables dans des véhicules. Pour faciliter le lecteur qui voudrait reprendre ces recherches, je fournis en annexe les programmes sur lesquels nous avons beaucoup travaillé pour réaliser notre chaîne de mesures.
$11(;(6(7 %,%/,2*5$3+,(
5.1. BIBLIOGRAPHIE: 1. ASVER (Association Suisse des VE routiers), "Mobil E n 4", Organe officiel de l'avere décembre 1997. 2. ATKINS P. W., "Physical Chemistry 5 th Edition", Oxford University Press, ISBN 0198557310, 1994 3. BOULANGER P., "Le véhicule électrique : état de l'art", Travail de fin d'études Université de Liège, 1997. 4. CERAOLO M., GIGLIOLI R., PEDE G., CASAVOLA G., CONTE M., GRANELLA S., "State of charge estimation for improving management of EV lead-acid batteries during charge and discharge", Proceedings EVS-13, pages 659-665. 5. FUGER J., GILBERT B., "Méthodes électrochimiques d'analyse", Notes de cours à l'usage des étudiants en première licence chimie, 1991. 6. GUOGUANG Qi, JIANMING L., HANG J., "A new battery state of charge indicator for electric vehicles", Proceedings EVS-13, pages 631-635. 7. HATTORI T., ANDO K., IMAI H., IWAMURA I., HOSHIHARA N., "Development of a valve regulated lead acid battery for small EV's", Proceedings EVS-14. 8. HAWKINS J.M., "Some field experience with battery impedance as a useful maintenance tool", Proceedings IEEE-1994, pages 263-269. 9. HAWKINS J.M., BARLING L.O., "Some aspects of battery impedance characteristics", Proceedings INTELEC '94, pages 271-276. 10. HEINEMANN D., NAUNIN D., "A new design of a battery management system including a range forecast", Proceedings EVS-14. 11. HLAVAC M.J., FEDER D., "On-line state of health monitoring and thermal runaway detection/prevention", Proceedings IEEE-1995, pages 284-291. 12. JOHANSSON A.O., ANDERSSON B., "Battery module diagnostics based on the IEC/TC 69 load profile", Proceedings EVS-14. 13. JOUBERT F., BOUET J., FAUVARQUE J-F., "Microcalorimetric studies of commercial Ni/Cd and Ni/MH cells", Electrochemical society Proceedings Volume 97-18, pages 837-855. 14. KATO N., YAMAMOTO K., "Estimation of the capacity of nickel cadmium batteries by measuring impedance using electrolyte deficient battery characteristics", Proceedings IEEE-1995, pages 772-777. 15. KAYANO M., HARA K., PARYANI A., "Battery SOC and distance to empty meter of the Honda EV plus", Proceedings EVS-14. 16. MARIEN J., "Chimie générale et chimie physique", Notes de cours à l'usage des étudiants Candidats Ingénieurs Civils, 1993. 17. MARKLE G.J., "Variables that influence results of impedance testing for valve regulated cells", Proceedings INTELEC '93, pages 444-448. 18. MISRA S., NOVESKE T., HOLDEN L., MRAZ S., "Use of AC impedance/conductance and DC resistance for determining the reliability of VRLA battery systems", Proceedings INTELEC '93, pages 384-391.
19. NEDUNGADI A., "A hybrid electric vehicle modeling and simulation toolbox", Proceedings EVS-14. 20. NUGUES S., RULLIERE E., YONNET J-P, "State of charge measurement by impedance spectroscopy for traction batteries", Proceedings EVS-13, pages 653-658. 21. RAND D.A.J., WOODS R., DELL R.M., "Batteries for Electric Vehicles", Research Studies Press Ltd., 1997. 22. REASBECK P., SMITH J.G., "Batteries for automotive use", Research Studies Press Ltd., 1997. 23. ROBINSON Tony, "Electric & Hybrid Vehicle Technology 95", UK & International Press, 1995. 24. S.R.B.E. A.S.B.E., "Symposium des Véhicules Electriques: EVS-13 à Osaka, EVS-14 à Orlando Synthèse", Symposium donné le 10 mars 1998 à Liège. 25. The Center for Professional Advancement,"Batteries for automotive use", Cours donné en 1996, Amsterdam. 26. VAN MIERLO J., DELOOF W., MAGGETTO G., "Development of a software tool to evaluate the energetic and environmental impact of electric and hybrid vehicles in Brussels", Proceedings EVS-14. 27. VANDERSCHUEREN H.W., "Mesures électriques", Notes de cours à l'usage des étudiants Ingénieurs Civils, 1995. 28. YAMANAKA M., IKUTA K., MATSUI T., NAKASHIMA H., TOMOKUNI Y., "A life indicator of stationary type sealed lead-acid battery", Proceeding INTELEC '91, pages 202-208. 29. YOSHINO M., SADAHIRA S., "The effects on EV performance by battery temperature and depth of discharge", Proceedings EVS-13, pages 688-693.
5.2. PROGRAMMES: E1431 main: Voici le programmes en C++ sur lequel nous avons travaillé principalement: permet de commander le bus et retirer les données du bus VXI à partir de menus graphiques: // *************************************************** // // * Command windows for HP E1431A acquisition cards * // // *************************************************** // // ** Include libraries // ******************** // - view libraries #include "shell.h" #include "compview.h" #include "buttonv.h" #include "doublevw.h" #include "listview.h" // - E1431A libraries // PUT E1431 LIBRARIES DECLARATIONS HERE //#include "e1431.h" // ** Global variables declarations and initializations // **************************************************** //!! CAST TO SHORTSIZ16, FLOATSIZ32,... WHEN SENDING COMMANDS // rajouter GLOBAL! //ANALOG INPUTS // - command e1431_set_analog_input double set_analog_input_id = -1; double set_analog_input_mode = 1; double set_analog_input_source = 2; double set_analog_input_state = 3; double set_analog_input_ground = 4; double set_analog_input_coupling = 5; double set_analog_input_range = 10; // definitions of e1431..., should be replaced as e1431... = E1431... double e1431_input_source_bnc=1; double e1431_input_source_zero=1; double e1431_input_source_sumbus=1; double e1431_anti_alias_analog_on=1; double e1431_anti_alias_analog_off=1; double e1431_input_floating=1; double e1431_input_grounded=1; double e1431_coupling_dc=1; double e1431_coupling_ac=1; double e1431_time_domain=1; double e1431_freq_domain=1; double e1431_block_mode=1; double e1431_continuous_mode=1; double e1431_append_status_on=1; double e1431_append_status_off=1;
double e1431_anti_alias_digital_on=1; double e1431_anti_alias_digital_off=1; double e1431_manual_trigger=1; double e1431_auto_trigger=1; double e1431_auto_arm=1; double e1431_manual_arm=1; double e1431_channel_on=1; double e1431_channel_off=1; double e1431_trigger_slope_pos=1; double e1431_trigger_slope_neg=1; double e1431_trigger_mode_bound=1; double e1431_trigger_mode_level=1; //command 1431_auto_zero_and_phase double auto_zero_and_phase_calmode = 1; //command e1431_auto_range double auto_range_time = 1; // FORMATTING DATA //command e1431_set_data_format double set_data_format_id = 1; double set_data_format_blocksize = 1024; // should be longsiz32 double set_data_format_size = 1; double set_data_format_mode = 1; double set_data_format_append = 1; // DIGITAL PROCESSING // command e1431_set_anti_alias_digital double set_anti_alias_digital_id = -1; double set_anti_alias_digital_state = 1247; //command e1431_set_center_freq double set_center_freq_freq = 1300; //command e1431_set_span double set_span_span = 100; // TRIGGERING //command e1431_set_auto_trigger double set_auto_trigger_id = 1; double set_auto_trigger_trigstate = 1; //command e1431_set_auto_arm double set_auto_arm_armstate = 1; //command e1431_set_trigger double set_trigger_chanstate= 1; double set_trigger_delay = 2; //Longsiz32 double set_trigger_lowlevel = 1; //Floatsiz32 double set_trigger_highlevel = 1; //Floatsiz32 double set_trigger_slope = 1; double set_trigger_mode = 1; // ** Callbacks declarations // ************************* void exitcb( Widget, caddr_t, caddr_t ) ; void messagecb( Widget, caddr_t, caddr_t ) ; void noexitcb( Widget, caddr_t message, caddr_t ); void updatecb( Widget, caddr_t, caddr_t); // "exit from program" callback // "send message to command shell" callback // no exit callback // "update parameter" callback //declaration of shell callbacks void exit_shellcb ( Widget, caddr_t, caddr_t ); // fenetre de confirmation callback void measure_shellcb ( Widget, caddr_t, caddr_t ); // fenetre de lancement de mesure void groupons_shellcb( Widget, caddr_t, caddr_t ); // "general groupons shell" callback void set_analog_shellcb( Widget, caddr_t, caddr_t ); // "analog inputs configuration" callback void data_formatting_shellcb( Widget, caddr_t, caddr_t ); // data formatting shell callback void digital_processing_shellcb( Widget, caddr_t, caddr_t) ; // digital processing shell callback
void triggering_shellcb ( Widget, caddr_t, caddr_t ); // triggering shell callback void measurement_controlling_shellcb ( Widget, caddr_t, caddr_t );// measurement controlling shell callback void clock_source_shellcb ( Widget, caddr_t, caddr_t ); // clock source shell callback //declaration of e1431 commands callback void e1431_set_analog_inputcb( Widget, caddr_t, caddr_t ); // analog inputs configuration" callback void e1431_auto_rangecb( Widget, caddr_t, caddr_t ); // auto_range void e1431_auto_zero_and_phasecb( Widget, caddr_t, caddr_t ); // auto_zero_and_phase void e1431_set_data_formatcb( Widget, caddr_t, caddr_t ); // set parameters of data callback void e1431_set_anti_alias_digitalcb( Widget, caddr_t, caddr_t ); // set_anti_alias_digital void e1431_set_center_freqcb( Widget, caddr_t, caddr_t ); // set_center_freq void e1431_set_spancb( Widget, caddr_t, caddr_t ); // set_span void e1431_set_auto_triggercb( Widget, caddr_t, caddr_t ); // set auto trigger void e1431_set_auto_armcb( Widget, caddr_t, caddr_t ); // set auto arm void e1431_set_triggercb( Widget, caddr_t, caddr_t ); // set trigger /**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**/ /** Main program **--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**/ /**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**/ main() { // ** Initialization of E1431A library with default parameters // *********************************************************** // Initialize the e1431 library // int error=e1431_init_io_driver(); // if(error) printf("e1431_init_io_driver() failed, error: %d\n", error); // Turn on debugging prints, this is a good idea while developing // e1431_print_errors(1); // Change this 0 to 1 to see call tracing // e1431_trace_level(0); // ** Creation of main window // ************************** Shell main_shell( "E1431A Command Window", "File Edit" ); // a 300x200 shell main_shell.setsize( 500, 300 ); // modify shell s size CompositeView main_window( main_shell ); // "the whole main shell" is a compositeview int relh=0; // *** DECLARATIONS OF MAIN WINDOW BUTTONS HERE // Create a button that launches the groupons shell main_window.setrootwidget( 0, relh, -250, -(relh+25) ); // params:left,top,right,bottom attachment ButtonView groupons_button( main_window,"groupons assignments", groupons_shellcb ); relh=relh+25; // Create a button that launches the analog inputs configuration shell main_window.setrootwidget( 0, relh, -250, -(relh+25) ); ButtonView set_analog_button( main_window,"analog inputs configuration", set_analog_shellcb ); relh=relh+25; // Create a button that launches the data formatting shell main_window.setrootwidget( 0, relh, -250, -(relh+25) ); ButtonView data_formatting_button( main_window,"data Formatting", data_formatting_shellcb ); relh=relh+25; // Create a button that launches the digital processing shell main_window.setrootwidget( 0, relh, -250, -(relh+25) ); ButtonView digital_processing_button( main_window,"digital processing", digital_processing_shellcb ); relh=relh+25; // Create a button that launches the triggering shell main_window.setrootwidget( 0, relh, -250, -(relh+25) ); ButtonView triggering_button( main_window," Triggering", triggering_shellcb ); relh=relh+25; // Create a button that launches the measurement controlling shell main_window.setrootwidget( 0, relh, -250, -(relh+25) );
ButtonView measurement_controlling_button( main_window," Measurement controlling", measurement_controlling_shellcb ); relh=relh+25; } // Create a button that launches the clock source shell main_window.setrootwidget( 0, relh, -250, -(relh+25) ); ButtonView clock_source_button( main_window," Clock Source", clock_source_shellcb ); // Create a measure Button to launch mesure main_window.setrootwidget( -250, 0, 0, -(relh+25) ); ButtonView measure_button( main_window," Begin Measure ", measure_shellcb); // Create exit Button to open exit_shell main_window.setrootwidget( 0, -25, -100, 0 ); ButtonView exit_button( main_window," Exit ", exit_shellcb); main_shell.show(); mainloop(); /**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**/ /**- End main program *--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**/ /**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**/ // ** Parameters update callbacks // ****************************** /**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**-**/ void set_analog_input_sourcecb( Widget, caddr_t stateptr, caddr_t ) { set_analog_input_source = *((double*)stateptr) ; printf( "set_analog_input_source = %f\n",set_analog_input_source ); } /**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**-**/ void set_analog_input_statecb( Widget, caddr_t stateptr, caddr_t ) { set_analog_input_state = *((double*)stateptr) ; printf( "set_analog_input_state = %f\n",set_analog_input_state ); } /**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**-**/ void set_analog_input_groundcb( Widget, caddr_t stateptr, caddr_t ) { set_analog_input_ground = *((double*)stateptr) ; printf( "set_analog_input_ground = %f\n",set_analog_input_ground ); } /**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**-**/ void set_analog_input_couplingcb( Widget, caddr_t stateptr, caddr_t ) { set_analog_input_coupling = *((double*)stateptr) ; printf( "set_analog_input_coupling = %f\n",set_analog_input_coupling); } /**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**-**/ void auto_zero_and_phase_calmodecb( Widget, caddr_t stateptr, caddr_t ) { auto_zero_and_phase_calmode = *((double*)stateptr) ; printf( " auto_zero_and_phase_calmode = %f\n", auto_zero_and_phase_calmode); } /**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**-**/ void set_data_format_modecb( Widget, caddr_t stateptr, caddr_t ) { set_data_format_mode = *((double*)stateptr) ; printf( " set_data_format_mode = %f\n",set_data_format_mode); } /**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**-**/ void set_data_format_appendcb( Widget, caddr_t stateptr, caddr_t ) { set_data_format_append = *((double*)stateptr) ; printf( " set_data_format_append = %f\n",set_data_format_append); } /**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**-**/ void set_anti_alias_digital_statecb( Widget, caddr_t stateptr, caddr_t ) { set_anti_alias_digital_state = *((double*)stateptr) ; printf( " set_anti_alias_digital_state = %f\n",set_anti_alias_digital_state); }
/**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**-**/ void set_auto_trigger_trigstatecb( Widget, caddr_t stateptr, caddr_t ) { set_auto_trigger_trigstate = *((double*)stateptr) ; printf("set_auto_trigger_trigstate = %f\n",set_auto_trigger_trigstate); } /**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**-**/ void set_auto_arm_armstatecb( Widget, caddr_t stateptr, caddr_t ) { set_auto_arm_armstate = *((double*)stateptr) ; printf("set_auto_arm_armstate = %f\n",set_auto_arm_armstate); } /**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**-**/ void set_trigger_chanstatecb( Widget, caddr_t stateptr, caddr_t ) { set_trigger_chanstate = *((double*)stateptr) ; printf("set_trigger_chanstate = %f\n",set_trigger_chanstate); } /**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**-**/ void set_trigger_slopecb( Widget, caddr_t stateptr, caddr_t ) { set_trigger_slope = *((double*)stateptr) ; printf("set_trigger_slope = %f\n",set_trigger_slope); } /**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**-**/ void set_trigger_modecb( Widget, caddr_t stateptr, caddr_t ) { set_trigger_mode = *((double*)stateptr) ; printf("set_trigger_mode = %f\n",set_trigger_mode); } /**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**-**/ // ** Callback functions definitions // ********************************* /**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**/ // "Exit program" callback // ----------------------- void exitcb( Widget, caddr_t message, caddr_t ){ printf(" %s\n", (char*)message); exit(1); } /**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**/ //"No exit callback" // if no is selected when confirmation of exit, hide exit_shell (SHOULD CLOSE AND NOT HIDE) void noexitcb( Widget, caddr_t, caddr_t ){ //exit_shell.hide(); //doesnt work } /**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**/ // "Send message in command shell" callback // ---------------------------------------- void messagecb( Widget, caddr_t message, caddr_t ){ printf(" %s\n", (char*)message ); } /**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**/ // "Update" callback // ----------------- void updatecb( Widget, caddr_t, caddr_t){ //update.var_to_update; } /**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**/ //exit_shell to confirm exit void exit_shellcb( Widget, caddr_t, caddr_t ){ Shell exit_shell( "exit confirmation", "" ); // a 300x200 shell exit_shell.setsize( 200, 50 ); CompositeView exit_window( exit_shell );
exit_window.setrootwidget( 0, 0, -99, 0 ); ButtonView exit_yes( exit_window,"yes", exitcb, "Have a nice day!" ); exit_window.setrootwidget( 101, 0, -200, 0 ); ButtonView exit_no( exit_window,"no", noexitcb, ); exit_shell.show(); mainloop(); } /**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**/ void measure_shellcb( Widget, caddr_t, caddr_t){ // measure shell callback Shell measure_shell( "measure", "File Edit" ); // a 300x200 shell measure_shell.setsize( 300, 200 ); CompositeView measure_window(measure_shell ); measure_shell.show(); mainloop(); } /**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**/ // "Groupons initialization" shell creation void groupons_shellcb( Widget, caddr_t, caddr_t ) { Shell groupons_shell( "Groupons and channel list creation", "File Edit" ); // a 300x200 shell groupons_shell.setsize( 400, 400 ); CompositeView groupons_window( groupons_shell ); //creation d une liste contenant le nbr de goupons et les listes de channels groupons_window.setrootwidget(0,0,100,150); ListView groupons_list ( groupons_window, "Please enter groupons parameters" ); //nbr de groupons -> double (nbr of groupons) Shell groupons_list_1_shell( "Nbr of groupons"); CompositeView groupons_list_1_window (groupons_list_1_shell, " Nbr of groupons / view"); groupons_list_1_shell.setmodal(); groupons_list_1_window.setrootwidget(0,0,-150,-100); DoubleView groupons_list_1_nbr (groupons_list_1_window); //rappel du pointeur a inserer pour l utiliser groupons_list_1_nbr.setbasicoptionsbuttons(); // Set the update/undo/clear/close button groupons_list.additemtolist(" Nbr of groupons", &groupons_list_1_window ); // channel list -> double (nbr of channels) and a list of the channels in the groupon //pour l instant = double channellist1 Shell groupons_list_2_shell( "Groupon1"); CompositeView groupons_list_2_window (groupons_list_2_shell, " list of channels 1"); groupons_list_2_shell.setmodal(); groupons_list_2_window.setrootwidget(0,0,-150,-100); DoubleView groupons_list_2_window_chanlist1 (groupons_list_2_window); groupons_list_2_window_chanlist1.setbasicoptionsbuttons(); groupons_list.additemtolist(" chanlist 1", &groupons_list_2_window); // channel list -> double (nbr of channels) and a list of the channels in the groupon //pour l instant = double channellist2 Shell groupons_list_3_shell( "Groupon1"); CompositeView groupons_list_3_window (groupons_list_3_shell, " list of channels 2"); groupons_list_3_shell.setmodal(); groupons_list_3_window.setrootwidget(0,0,-150,-100); DoubleView groupons_list_2_window_chanlist2 (groupons_list_3_window); groupons_list_2_window_chanlist2.setbasicoptionsbuttons(); groupons_list.additemtolist(" chanlist 2", &groupons_list_3_window); groupons_window.setrootwidget( 300, 100, 0, 200 ); ButtonView groupon_new( groupons_window,"create current groupon", messagecb, "il faut assigner... -> recuperer liste pour creer groupon" ); //ici inserer CB to launch e1431_create_channel... groupons_shell.show(); mainloop(); } /**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**/ // "Set analog inputs configuration" shell creation
// ------------------------------------------------ void set_analog_shellcb( Widget, caddr_t, caddr_t ) { Shell set_analog_shell( "Analog inputs configuration", "File Edit" ); // a 300x200 shell set_analog_shell.setsize( 500, 800 ); CompositeView set_analog_window( set_analog_shell ); // create a list view which contains variables and a button to send command to the card set_analog_window.setrootwidget( 0, 0, -250, -700 ); // params:left,top,right,bottom attachment ListView set_analog_list (set_analog_window, "select variables to change"); // list -> double (ID) Shell set_analog_list_1_shell( "ID of Groupon"); CompositeView set_analog_list_1_window (set_analog_list_1_shell, "ID of groupon"); set_analog_list_1_shell.setmodal(); set_analog_list_1_window.setrootwidget(0,0,-150,-100); DoubleView set_analog_list_1_window_id (set_analog_list_1_window); set_analog_list_1_window_id.setsemanticptr( set_analog_input_id ); set_analog_list_1_window_id.setbasicoptionsbuttons(); set_analog_list.additemtolist("id of groupon", &set_analog_list_1_window); // input mode is ALWAYS BNC. // list -> double (source) Shell set_analog_list_2_shell( "Source"); set_analog_list_2_shell.setsize( 500, 400 ); CompositeView set_analog_list_2_window (set_analog_list_2_shell, "source"); set_analog_list_2_shell.setmodal(); set_analog_list_2_window.setrootwidget(0,0,0,200); ListView set_analog_list_2_window_source_list (set_analog_list_2_window,"choose parameter"); set_analog_list_2_window_source_list.additemtolist( "E1431_INPUT_SOURCE_BNC", (FunctionToCall)set_analog_input_sourceCB, (caddr_t)&e1431_input_source_bnc ); set_analog_list_2_window_source_list.additemtolist( "E1431_INPUT_SOURCE_ZERO", (FunctionToCall)set_analog_input_sourceCB, (caddr_t)&e1431_input_source_zero ); set_analog_list_2_window_source_list.additemtolist( "E1431_INPUT_SOURCE_SUMBUS", (FunctionToCall)set_analog_input_sourceCB, (caddr_t)&e1431_input_source_sumbus ); set_analog_list.additemtolist("source", &set_analog_list_2_window); // list -> double anti alias analog state Shell set_analog_list_3_shell( "anti alias analog state"); set_analog_list_3_shell.setsize( 500, 400 ); CompositeView set_analog_list_3_window (set_analog_list_3_shell, "state"); set_analog_list_3_shell.setmodal(); set_analog_list_3_window.setrootwidget(0,0,0,200); ListView set_analog_list_3_window_state_list (set_analog_list_3_window,"choose parameter"); set_analog_list_3_window_state_list.additemtolist( "E1431_ANTI_ALIAS_ANALOG_ON", (FunctionToCall)set_analog_input_stateCB, (caddr_t)&e1431_anti_alias_analog_on ); set_analog_list_3_window_state_list.additemtolist( "E1431_ANTI_ALIAS_ANALOG_OFF", (FunctionToCall)set_analog_input_stateCB, (caddr_t)&e1431_anti_alias_analog_off ); set_analog_list.additemtolist("anti alias analog state", &set_analog_list_3_window); // list -> double - grounding Shell set_analog_list_4_shell( "grounding"); set_analog_list_4_shell.setsize( 500, 400 ); CompositeView set_analog_list_4_window (set_analog_list_4_shell, "grounding"); set_analog_list_4_shell.setmodal(); set_analog_list_4_window.setrootwidget(0,0,0,200); ListView set_analog_list_4_window_ground_list (set_analog_list_4_window,"choose parameter"); set_analog_list_4_window_ground_list.additemtolist( "E1431_INPUT_FLOATING", (FunctionToCall)set_analog_input_groundCB, (caddr_t)&e1431_input_floating ); set_analog_list_4_window_ground_list.additemtolist( "E1431_INPUT_GROUNDED", (FunctionToCall)set_analog_input_groundCB, (caddr_t)&e1431_input_grounded ); set_analog_list.additemtolist("grounding", &set_analog_list_4_window); // list -> double - coupling Shell set_analog_list_5_shell( "coupling"); set_analog_list_5_shell.setsize( 500, 400 ); CompositeView set_analog_list_5_window (set_analog_list_5_shell, "coupling"); set_analog_list_5_shell.setmodal(); set_analog_list_5_window.setrootwidget(0,0,0,200); ListView set_analog_list_5_window_coupling_list (set_analog_list_5_window,"choose parameter"); set_analog_list_5_window_coupling_list.additemtolist( "E1431_COUPLING_DC", (FunctionToCall)set_analog_input_couplingCB, (caddr_t)&e1431_coupling_dc);
set_analog_list_5_window_coupling_list.additemtolist( "E1431_COUPLING_AC", (FunctionToCall)set_analog_input_couplingCB, (caddr_t)&e1431_coupling_ac ); set_analog_list.additemtolist("coupling", &set_analog_list_5_window); // list -> double - range Shell set_analog_list_6_shell( "range"); CompositeView set_analog_list_6_window (set_analog_list_6_shell, "range"); set_analog_list_6_shell.setmodal(); set_analog_list_6_window.setrootwidget(0,0,-150,-100); DoubleView set_analog_list_6_window_range (set_analog_list_6_window); set_analog_list_6_window_range.setsemanticptr( set_analog_input_range ); set_analog_list_6_window_range.setbasicoptionsbuttons(); set_analog_list.additemtolist("range", &set_analog_list_6_window); // Create button to send command to the cards set_analog_window.setrootwidget( 0, 700, -250, 0 ); ButtonView apply_set_analog_input( set_analog_window,"set analog input", e1431_set_analog_inputcb ); // list auto range set_analog_window.setrootwidget( 250, 0, 0, -300 ); // params:left,top,right,bottom attachment ListView auto_range_list (set_analog_window, "select variables to change"); // list -> double (ID) Shell auto_range_list_1_shell( "ID of Groupon"); CompositeView auto_range_list_1_window (auto_range_list_1_shell, "ID of groupon"); auto_range_list_1_shell.setmodal(); auto_range_list_1_window.setrootwidget(0,0,-150,-100); DoubleView auto_range_list_1_window_id (auto_range_list_1_window); auto_range_list_1_window_id.setsemanticptr( set_analog_input_id ); //set_analog_input_id car mm pointeur auto_range_list_1_window_id.setbasicoptionsbuttons(); auto_range_list.additemtolist("id of groupon", &auto_range_list_1_window); // list -> double - auto_range Shell auto_range_list_2_shell( "range time"); CompositeView auto_range_list_2_window (auto_range_list_2_shell, "range"); auto_range_list_2_shell.setmodal(); auto_range_list_2_window.setrootwidget(0,0,-150,-100); DoubleView auto_range_list_2_window_time (auto_range_list_2_window); auto_range_list_2_window_time.setsemanticptr( auto_range_time ); auto_range_list_2_window_time.setbasicoptionsbuttons(); auto_range_list.additemtolist("auto_range_time", &auto_range_list_2_window); // Create button to send command to the cards set_analog_window.setrootwidget( 250, 300, 0, -400 ); //a modifier ButtonView apply_set_auto_range( set_analog_window,"set auto range", e1431_auto_rangecb ); // list auto_zero_and_phase set_analog_window.setrootwidget( 250, 400, 0, -700 ); // params:left,top,right,bottom attachment ListView auto_zero_and_phase_list (set_analog_window, "select variables to change"); // list -> double (ID) Shell auto_zero_and_phase_list_1_shell( "ID of Groupon"); CompositeView auto_zero_and_phase_list_1_window (auto_zero_and_phase_list_1_shell, "ID of groupon"); auto_zero_and_phase_list_1_shell.setmodal(); auto_zero_and_phase_list_1_window.setrootwidget(0,0,-150,-100); DoubleView auto_zero_and_phase_list_1_window_id (auto_zero_and_phase_list_1_window); auto_zero_and_phase_list_1_window_id.setsemanticptr( set_analog_input_id ); //set_analog_input_id car mm pointeur auto_zero_and_phase_list_1_window_id.setbasicoptionsbuttons(); auto_zero_and_phase_list.additemtolist("id of groupon", &auto_zero_and_phase_list_1_window); // list -> auto_zero_and_phase calmode Shell auto_zero_and_phase_list_2_shell( "Set cal. mode"); auto_zero_and_phase_list_2_shell.setsize( 500, 400 ); CompositeView auto_zero_and_phase_list_2_window (auto_zero_and_phase_list_2_shell, "Set cal. mode"); auto_zero_and_phase_list_2_shell.setmodal(); auto_zero_and_phase_list_2_window.setrootwidget(0,0,0,200); ListView auto_zero_and_phase_list_2_window_calmode_list (auto_zero_and_phase_list_2_window,"choose parameter"); auto_zero_and_phase_list_2_window_calmode_list.additemtolist( "E1431_TIME_DOMAIN", (FunctionToCall)auto_zero_and_phase_calmodeCB, (caddr_t)&e1431_time_domain ); auto_zero_and_phase_list_2_window_calmode_list.additemtolist( "E1431_FREQ_DOMAIN", (FunctionToCall)auto_zero_and_phase_calmodeCB, (caddr_t)&e1431_freq_domain ); auto_zero_and_phase_list.additemtolist("set cal. mode", &auto_zero_and_phase_list_2_window); // Create button to send command to the cards set_analog_window.setrootwidget( 250, 700, 0, 0 );
ButtonView apply_set_auto_zero_and_phase( set_analog_window,"set auto 0 and phase", e1431_auto_zero_and_phasecb ); set_analog_shell.show(); mainloop(); } /**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**/ void data_formatting_shellcb( Widget, caddr_t, caddr_t ) // data formatting shell callback { Shell set_data_format_shell( "data formatting configuration", "File Edit" ); // a 300x200 shell set_data_format_shell.setsize( 250, 700 ); CompositeView set_data_format_window(set_data_format_shell ); //e1431_set_dataformat // create a list view which contains variables and a button to send command to the card set_data_format_window.setrootwidget( 0, 0, 0, -600 ); // params:left,top,right,bottom attachment ListView set_data_format_list (set_data_format_window, "select variables to change"); // list -> double (ID) Shell set_data_format_list_1_shell( "ID of Groupon"); CompositeView set_data_format_list_1_window (set_data_format_list_1_shell, "ID of groupon"); set_data_format_list_1_shell.setmodal(); set_data_format_list_1_window.setrootwidget(0,0,-150,-100); DoubleView set_data_format_list_1_window_id (set_data_format_list_1_window); set_data_format_list_1_window_id.setsemanticptr( set_data_format_id ); set_data_format_list_1_window_id.setbasicoptionsbuttons(); set_data_format_list.additemtolist("id of groupon", &set_data_format_list_1_window); // list -> double blocksize Shell set_data_format_list_2_shell( "blocksize"); CompositeView set_data_format_list_2_window (set_data_format_list_2_shell, "blocksize"); set_data_format_list_2_shell.setmodal(); set_data_format_list_2_window.setrootwidget(0,0,-150,-100); DoubleView set_data_format_list_2_window_blocksize (set_data_format_list_2_window); set_data_format_list_2_window_blocksize.setsemanticptr( set_data_format_blocksize ); set_data_format_list_2_window_blocksize.setbasicoptionsbuttons(); set_data_format_list.additemtolist("blocksize", &set_data_format_list_2_window); // list -> double size Shell set_data_format_list_3_shell( "size"); CompositeView set_data_format_list_3_window (set_data_format_list_3_shell, "size"); set_data_format_list_3_shell.setmodal(); set_data_format_list_3_window.setrootwidget(0,0,-150,-100); DoubleView set_data_format_list_3_window_size (set_data_format_list_3_window); set_data_format_list_3_window_size.setsemanticptr( set_data_format_size ); set_data_format_list_3_window_size.setbasicoptionsbuttons(); set_data_format_list.additemtolist("size", &set_data_format_list_3_window); // list -> double mode Shell set_data_format_list_4_shell( "mode"); set_data_format_list_4_shell.setsize( 500, 400 ); CompositeView set_data_format_list_4_window (set_data_format_list_4_shell, "mode"); set_data_format_list_4_shell.setmodal(); set_data_format_list_4_window.setrootwidget(0,0,0,200); ListView set_data_format_list_4_window_mode_list (set_data_format_list_4_window,"choose parameter"); set_data_format_list_4_window_mode_list.additemtolist( "E1431_BLOCK_MODE", (FunctionToCall)set_data_format_modeCB, (caddr_t)&e1431_block_mode); set_data_format_list_4_window_mode_list.additemtolist( "E1431_CONTINUOUS_MODE", (FunctionToCall)set_data_format_modeCB, (caddr_t)&e1431_continuous_mode ); set_data_format_list.additemtolist("mode", &set_data_format_list_4_window); // list -> double append Shell set_data_format_list_5_shell( "append"); set_data_format_list_5_shell.setsize( 500, 400 ); CompositeView set_data_format_list_5_window (set_data_format_list_5_shell, "append"); set_data_format_list_5_shell.setmodal(); set_data_format_list_5_window.setrootwidget(0,0,0,200); ListView set_data_format_list_5_window_append_list (set_data_format_list_4_window,"choose parameter"); set_data_format_list_5_window_append_list.additemtolist( "E1431_APPEND_STATUS_ON", (FunctionToCall)set_data_format_appendCB, (caddr_t)&e1431_append_status_on); set_data_format_list_5_window_append_list.additemtolist( "E1431_APPEND_STATUS_OFF", (FunctionToCall)set_data_format_appendCB, (caddr_t)&e1431_append_status_off);
set_data_format_list.additemtolist("append", &set_data_format_list_5_window); // Create button to send command to the cards (e1431_set_dataformat) set_data_format_window.setrootwidget( 0, 600, 0, 0); ButtonView apply_set_data_format( set_data_format_window,"apply set data format", e1431_set_data_formatcb ); set_data_format_shell.show(); mainloop(); } /**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**/ // digital processing configuration shell void digital_processing_shellcb( Widget, caddr_t, caddr_t) // digital processing shell callback { Shell digital_processing_shell( "digital processing configuration", "File Edit" ); // a 300x200 shell digital_processing_shell.setsize( 500, 800 ); CompositeView digital_processing_window(digital_processing_shell ); // create a set_anti_alias_digital_list digital_processing_window.setrootwidget( 0, 0, -250, -300 ); // params:left,top,right,bottom attachment ListView set_anti_alias_digital_list (digital_processing_window, "select variables to change"); // list -> double (ID) Shell set_anti_alias_digital_list_1_shell( "ID of Groupon"); CompositeView set_anti_alias_digital_list_1_window (set_anti_alias_digital_list_1_shell, "ID of groupon"); set_anti_alias_digital_list_1_shell.setmodal(); set_anti_alias_digital_list_1_window.setrootwidget(0,0,-150,-100); DoubleView set_anti_alias_digital_list_1_window_id (set_anti_alias_digital_list_1_window); set_anti_alias_digital_list_1_window_id.setsemanticptr( set_anti_alias_digital_id ); set_anti_alias_digital_list_1_window_id.setbasicoptionsbuttons(); set_anti_alias_digital_list.additemtolist("id of groupon", &set_anti_alias_digital_list_1_window); // list -> double (set_anti_alias_digital_state) Shell set_anti_alias_digital_list_2_shell( "anti_alias_digital_state"); set_anti_alias_digital_list_2_shell.setsize( 500, 400 ); CompositeView set_anti_alias_digital_list_2_window (set_anti_alias_digital_list_2_shell, "anti_alias_digital_state"); set_anti_alias_digital_list_2_shell.setmodal(); set_anti_alias_digital_list_2_window.setrootwidget(0,0,0,200); ListView set_anti_alias_digital_list_2_window_state_list (set_anti_alias_digital_list_2_window,"choose parameter"); set_anti_alias_digital_list_2_window_state_list.additemtolist( "E1431_ANTI_ALIAS_DIGITAL_ON", (FunctionToCall)set_anti_alias_digital_stateCB, (caddr_t)&e1431_anti_alias_digital_on); set_anti_alias_digital_list_2_window_state_list.additemtolist( "E1431_ANTI_ALIAS_DIGITAL_OFF", (FunctionToCall)set_anti_alias_digital_stateCB, (caddr_t)&e1431_anti_alias_digital_off ); set_anti_alias_digital_list.additemtolist("anti_alias_digital_state", &set_anti_alias_digital_list_2_window); // Create button to send command to the cards (e1431_set_anti_alias_digital) digital_processing_window.setrootwidget( 0, 300, -250, -400); ButtonView apply_anti_alias_digital( digital_processing_window,"set filter", e1431_set_anti_alias_digitalcb ); // create a set_center_frequency list digital_processing_window.setrootwidget( 0, 400, -250, -700 ); // params:left,top,right,bottom attachment ListView set_center_freq_list (digital_processing_window, "select variables to change"); // list -> double (ID) Shell set_center_freq_list_1_shell( "ID of Groupon"); CompositeView set_center_freq_list_1_window (set_center_freq_list_1_shell, "ID of groupon"); set_center_freq_list_1_shell.setmodal(); set_center_freq_list_1_window.setrootwidget(0,0,-150,-100); DoubleView set_center_freq_list_1_window_id (set_center_freq_list_1_window); set_center_freq_list_1_window_id.setsemanticptr(set_anti_alias_digital_id ); set_center_freq_list_1_window_id.setbasicoptionsbuttons(); set_center_freq_list.additemtolist("id of groupon", &set_center_freq_list_1_window); // list -> double freq Shell set_center_freq_list_2_shell( "frequency"); CompositeView set_center_freq_list_2_window (set_center_freq_list_2_shell, "frequency"); set_center_freq_list_2_shell.setmodal(); set_center_freq_list_2_window.setrootwidget(0,0,-150,-100); DoubleView set_center_freq_list_2_window_freq ( set_center_freq_list_2_window); set_center_freq_list_2_window_freq.setsemanticptr( set_center_freq_freq ); set_center_freq_list_2_window_freq.setbasicoptionsbuttons(); set_center_freq_list.additemtolist("frequency", &set_center_freq_list_2_window); // Create button to send command to the cards (e1431_set_center_freq) digital_processing_window.setrootwidget( 0, 700, -250, 0);
ButtonView apply_set_center_freq( digital_processing_window,"set center frequency", e1431_set_center_freqcb ); // create a set_span list digital_processing_window.setrootwidget( 250, 0, 0, -300 ); // params:left,top,right,bottom attachment ListView set_span_list (digital_processing_window, "select variables to change"); // list -> double (ID) Shell set_span_list_1_shell( "ID of Groupon"); CompositeView set_span_list_1_window (set_span_list_1_shell, "ID of groupon"); set_span_list_1_shell.setmodal(); set_span_list_1_window.setrootwidget(0,0,-150,-100); DoubleView set_span_list_1_window_id (set_span_list_1_window); set_span_list_1_window_id.setsemanticptr(set_anti_alias_digital_id ); set_span_list_1_window_id.setbasicoptionsbuttons(); set_span_list.additemtolist("id of groupon", &set_span_list_1_window); // list -> set_span span Shell set_span_list_2_shell( "set span"); CompositeView set_span_list_2_window (set_span_list_2_shell, "set span"); set_span_list_2_shell.setmodal(); set_span_list_2_window.setrootwidget(0,0,-150,-100); DoubleView set_span_list_2_window_span (set_span_list_2_window); set_span_list_2_window_span.setsemanticptr(set_span_span ); set_span_list_2_window_span.setbasicoptionsbuttons(); set_span_list.additemtolist("set span", &set_span_list_2_window); // Create button to send command to the cards (e1431_set_span) digital_processing_window.setrootwidget( 250, 300, 0, -400); ButtonView apply_set_span( digital_processing_window,"set span", e1431_set_spancb ); digital_processing_shell.show(); mainloop(); } /**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**/ void triggering_shellcb ( Widget, caddr_t, caddr_t ) // triggering shell callback { Shell triggering_shell( "triggering configuration", "File Edit" ); // a 300x200 shell triggering_shell.setsize( 500, 900 ); CompositeView triggering_window(triggering_shell ); // create a set_auto_trigger list triggering_window.setrootwidget( 0, 0, -250, -300 ); // params:left,top,right,bottom attachment ListView set_auto_trigger_list (triggering_window, "select variables to change"); // list -> double (ID) Shell set_auto_trigger_list_1_shell( "ID of Groupon"); CompositeView set_auto_trigger_list_1_window (set_auto_trigger_list_1_shell, "ID of groupon"); set_auto_trigger_list_1_shell.setmodal(); set_auto_trigger_list_1_window.setrootwidget(0,0,-150,-100); DoubleView set_auto_trigger_list_1_window_id (set_auto_trigger_list_1_window); set_auto_trigger_list_1_window_id.setsemanticptr(set_auto_trigger_id ); set_auto_trigger_list_1_window_id.setbasicoptionsbuttons(); set_auto_trigger_list.additemtolist("id of groupon", &set_auto_trigger_list_1_window); // list -> double (set_auto_trigger_trigstate) Shell set_auto_trigger_list_2_shell( "trigstate"); set_auto_trigger_list_2_shell.setsize( 500, 400 ); CompositeView set_auto_trigger_list_2_window (set_auto_trigger_list_2_shell, "trigstate"); set_auto_trigger_list_2_shell.setmodal(); set_auto_trigger_list_2_window.setrootwidget(0,0,0,200); ListView set_auto_trigger_list_2_window_trigstate_list (set_auto_trigger_list_2_window,"choose parameter"); set_auto_trigger_list_2_window_trigstate_list.additemtolist( "E1431_MANUAL_TRIGGER", (FunctionToCall)set_auto_trigger_trigstateCB, (caddr_t)&e1431_manual_trigger); set_auto_trigger_list_2_window_trigstate_list.additemtolist( "E1431_AUTO_TRIGGER", (FunctionToCall)set_auto_trigger_trigstateCB, (caddr_t)&e1431_auto_trigger ); set_auto_trigger_list.additemtolist("trigstate", &set_auto_trigger_list_2_window); // Create button to send command to the cards (e1431_set_auto_triggercb) triggering_window.setrootwidget( 0, 300, -250, -400); ButtonView apply_set_auto_trigger( triggering_window,"set auto trigger", e1431_set_auto_triggercb ); // create a set_auto_arm list triggering_window.setrootwidget( 0, 400, -250, -700 ); // params:left,top,right,bottom attachment
ListView set_auto_arm_list(triggering_window, "select variables to change"); // list -> double (ID) Shell set_auto_arm_list_1_shell( "ID of Groupon"); CompositeView set_auto_arm_list_1_window (set_auto_arm_list_1_shell, "ID of groupon"); set_auto_arm_list_1_shell.setmodal(); set_auto_arm_list_1_window.setrootwidget(0,0,-150,-100); DoubleView set_auto_arm_list_1_window_id (set_auto_arm_list_1_window); set_auto_arm_list_1_window_id.setsemanticptr(set_auto_trigger_id ); set_auto_arm_list_1_window_id.setbasicoptionsbuttons(); set_auto_arm_list.additemtolist("id of groupon", &set_auto_arm_list_1_window); // list -> double (set_auto_arm_armstate) Shell set_auto_arm_list_2_shell( "armstate"); set_auto_arm_list_2_shell.setsize( 500, 400 ); CompositeView set_auto_arm_list_2_window (set_auto_arm_list_2_shell, "armstate"); set_auto_arm_list_2_shell.setmodal(); set_auto_arm_list_2_window.setrootwidget(0,0,0,200); ListView set_auto_arm_list_2_window_armstate_list (set_auto_arm_list_2_window,"choose parameter"); set_auto_arm_list_2_window_armstate_list.additemtolist( "E1431_AUTO_ARM", (FunctionToCall)set_auto_arm_armstateCB, (caddr_t)&e1431_auto_arm); set_auto_arm_list_2_window_armstate_list.additemtolist( "E1431_MANUAL_ARM", (FunctionToCall)set_auto_arm_armstateCB, (caddr_t)&e1431_manual_arm ); set_auto_arm_list.additemtolist("armstate", &set_auto_arm_list_2_window); // Create button to send command to the cards (e1431_set_auto_armcb) triggering_window.setrootwidget( 0, 700, -250, -800); ButtonView apply_set_auto_arm( triggering_window,"set auto arm", e1431_set_auto_armcb ); // create a set_trigger list triggering_window.setrootwidget( 250, 0, 0, -800 ); // params:left,top,right,bottom attachment ListView set_trigger_list(triggering_window, "select variables to change"); // list -> double (ID) Shell set_trigger_list_1_shell( "ID of Groupon"); CompositeView set_trigger_list_1_window (set_trigger_list_1_shell, "ID of groupon"); set_trigger_list_1_shell.setmodal(); set_trigger_list_1_window.setrootwidget(0,0,-150,-100); DoubleView set_trigger_list_1_window_id (set_trigger_list_1_window); set_trigger_list_1_window_id.setsemanticptr(set_auto_trigger_id ); set_trigger_list_1_window_id.setbasicoptionsbuttons(); set_trigger_list.additemtolist("id of groupon", &set_trigger_list_1_window); // list -> double (set_trigger_chanstate) Shell set_trigger_list_2_shell( "chanstate"); set_trigger_list_2_shell.setsize( 500, 400 ); CompositeView set_trigger_list_2_window (set_trigger_list_2_shell, "chanstate"); set_trigger_list_2_shell.setmodal(); set_trigger_list_2_window.setrootwidget(0,0,0,200); ListView set_trigger_list_2_window_chanstate_list (set_trigger_list_2_window,"choose parameter"); set_trigger_list_2_window_chanstate_list.additemtolist( "E1431_CHANNEL_ON", (FunctionToCall)set_trigger_chanstateCB, (caddr_t)&e1431_channel_on); set_trigger_list_2_window_chanstate_list.additemtolist( "E1431_CHANNEL_OFF", (FunctionToCall)set_trigger_chanstateCB, (caddr_t)&e1431_channel_off ); set_trigger_list.additemtolist("chanstate", &set_trigger_list_2_window); // list -> double (set_trigger_delay) Shell set_trigger_list_3_shell( "delay"); CompositeView set_trigger_list_3_window (set_trigger_list_3_shell, "delay"); set_trigger_list_3_shell.setmodal(); set_trigger_list_3_window.setrootwidget(0,0,-150,-100); DoubleView set_trigger_list_3_window_delay (set_trigger_list_3_window); set_trigger_list_3_window_delay.setsemanticptr(set_trigger_delay); set_trigger_list_3_window_delay.setbasicoptionsbuttons(); set_trigger_list.additemtolist("delay", &set_trigger_list_3_window); // list -> double (set_trigger_lowlevel) Shell set_trigger_list_4_shell( "lowlevel"); CompositeView set_trigger_list_4_window (set_trigger_list_4_shell, "lowlevel"); set_trigger_list_4_shell.setmodal(); set_trigger_list_4_window.setrootwidget(0,0,-150,-100); DoubleView set_trigger_list_4_window_lowlevel (set_trigger_list_4_window); set_trigger_list_4_window_lowlevel.setsemanticptr(set_trigger_lowlevel); set_trigger_list_4_window_lowlevel.setbasicoptionsbuttons(); set_trigger_list.additemtolist("lowlevel", &set_trigger_list_4_window);
// list -> double (set_trigger_highlevel) Shell set_trigger_list_5_shell( "highlevel"); CompositeView set_trigger_list_5_window (set_trigger_list_5_shell, "highlevel"); set_trigger_list_5_shell.setmodal(); set_trigger_list_5_window.setrootwidget(0,0,-150,-100); DoubleView set_trigger_list_5_window_highlevel (set_trigger_list_5_window); set_trigger_list_5_window_highlevel.setsemanticptr(set_trigger_highlevel); set_trigger_list_5_window_highlevel.setbasicoptionsbuttons(); set_trigger_list.additemtolist("highlevel", &set_trigger_list_5_window); // list -> double (set_trigger_slope) Shell set_trigger_list_6_shell( "slope"); set_trigger_list_6_shell.setsize( 500, 400 ); CompositeView set_trigger_list_6_window (set_trigger_list_6_shell, "slope"); set_trigger_list_6_shell.setmodal(); set_trigger_list_6_window.setrootwidget(0,0,0,200); ListView set_trigger_list_6_window_slope_list (set_trigger_list_6_window,"choose parameter"); set_trigger_list_6_window_slope_list.additemtolist( "E1431_TRIGGER_SLOPE_POS", (FunctionToCall)set_trigger_slopeCB, (caddr_t)&e1431_trigger_slope_pos); set_trigger_list_6_window_slope_list.additemtolist( "E1431_TRIGGER_SLOPE_NEG", (FunctionToCall)set_trigger_slopeCB, (caddr_t)&e1431_trigger_slope_neg); set_trigger_list.additemtolist("slope", &set_trigger_list_6_window); // list -> double (set_trigger_mode) Shell set_trigger_list_7_shell( "mode"); set_trigger_list_7_shell.setsize( 500, 400 ); CompositeView set_trigger_list_7_window (set_trigger_list_7_shell, "mode"); set_trigger_list_7_shell.setmodal(); set_trigger_list_7_window.setrootwidget(0,0,0,200); ListView set_trigger_list_7_window_mode_list (set_trigger_list_7_window,"choose parameter"); set_trigger_list_7_window_mode_list.additemtolist( "E1431_TRIGGER_MODE_BOUND", (FunctionToCall)set_trigger_modeCB, (caddr_t)&e1431_trigger_mode_bound); set_trigger_list_7_window_mode_list.additemtolist( "E1431_TRIGGER_MODE_LEVEL", (FunctionToCall)set_trigger_modeCB, (caddr_t)&e1431_trigger_mode_level); set_trigger_list.additemtolist("mode", &set_trigger_list_7_window); // Create button to send command to the cards (e1431_set_triggercb) triggering_window.setrootwidget( 250, 800, 0, 0); ButtonView apply_set_trigger( triggering_window,"set trigger", e1431_set_triggercb ); triggering_shell.show(); mainloop(); } /**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**/ void measurement_controlling_shellcb ( Widget, caddr_t, caddr_t )// measurement controlling shell callback { Shell measurement_controlling_shell( "measurement controlling configuration ", "File Edit" ); // a 300x200 shell measurement_controlling_shell.setsize( 300, 200 ); CompositeView measurement_controlling_window(measurement_controlling_shell ); measurement_controlling_shell.show(); mainloop(); } /**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**/ void clock_source_shellcb ( Widget, caddr_t, caddr_t ) // triggering shell callback { Shell clock_source_shell( "clock_source", "File Edit" ); // a 300x200 shell clock_source_shell.setsize( 300, 200 ); CompositeView clock_source_window(clock_source_shell ); clock_source_shell.show(); mainloop(); } /**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**/ /**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**/ // ** E1431 commands callbacks // *************************** /**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**/
// e1431_set_analog_input // ---------------------- void e1431_set_analog_inputcb( Widget, caddr_t, caddr_t ) { // error = e1431_set_analog_input((shortsiz16*)set_analog_input_id, (SHORTSIZ16*)set_analog_input_mode, (SHORTSIZ16*)set_analog_input_source, (SHORTSIZ16*)set_analog_input_state, (SHORTSIZ16*)set_analog_input_ground, (SHORTSIZ16*)set_analog_input_coupling, (FLOATSIZ32*)set_analog_input_range); // if(error) printf("e1431_set_analog_input() failed, error: %d\n", error); printf(" set_analog_input_id: %d\n set_analog_input_state: %d\n",set_analog_input_id, set_analog_input_state); } /**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**/ // e1431_auto_range // ---------------- void e1431_auto_rangecb( Widget, caddr_t, caddr_t ) { // error = e1431_auto_range((shortsiz16*)set_analog_input_id, (SHORTSIZ16*)auto_range_time); // if(error) printf("e1431_auto_range() failed, error: %d\n", error); } /**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**/ // e1431_auto_zero_and_phase // ------------------------- void e1431_auto_zero_and_phasecb( Widget, caddr_t, caddr_t ) { // error = e1431_set_analog_input((shortsiz16*)set_analog_input_id, (SHORTSIZ16*)auto_zero_and_phase_calmode); // if(error) printf("e1431_auto_zero_and_phase() failed, error: %d\n", error); } /**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**/ // e1431_set_data_format // --------------------- void e1431_set_data_formatcb( Widget, caddr_t, caddr_t ) { // error = e1431_set_data_format((shortsiz16*)set_data_format_id, (LONGSIZ32*)set_data_format_blocksize,(SHORTSIZ16*)set_data_format_size,(SHORTSIZ16*)set_data_format_mode,(SHO RTSIZ16*)set_data_format_append ); // if(error) printf("e1431_set_data_format() failed, error: %d\n", error); } /**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**/ // e1431_set_anti_alias_digital // ---------------------------- void e1431_set_anti_alias_digitalcb( Widget, caddr_t, caddr_t ) { // error = e1431_set_anti_alias_digital((shortsiz16*)set_anti_alias_digital_id, (SHORTSIZ16*)set_anti_alias_digital_state); // if(error) printf("e1431_set_anti_alias_digital() failed, error: %d\n", error); } /**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**/ // e1431_set_center_freq // --------------------- void e1431_set_center_freqcb( Widget, caddr_t, caddr_t ) { // error = e1431_set_center_freq((shortsiz16*)set_anti_alias_digital_id, (SHORTSIZ16*)set_center_freq_freq); // if(error) printf("e1431_set_center_freq() failed, error: %d\n", error); } /**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**/ // e1431_set_span // -------------- void e1431_set_spancb( Widget, caddr_t, caddr_t ) { // error = e1431_set_span((shortsiz16*)set_anti_alias_digital_id, (SHORTSIZ16*)set_span_span); // if(error) printf("e1431_set_span() failed, error: %d\n", error); } /**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**/ // e1431_set_auto_trigger
// ---------------------- void e1431_set_auto_triggercb( Widget, caddr_t, caddr_t ) { // error = e1431_set_auto_trigger((shortsiz16*)set_auto_trigger_id, (SHORTSIZ16*)set_auto_trigger_trigstate); // if(error) printf("e1431_set_auto_trigger() failed, error: %d\n", error); } /**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**/ // e1431_set_auto_arm // ------------------- void e1431_set_auto_armcb( Widget, caddr_t, caddr_t ) { // error = e1431_set_auto_arm((shortsiz16*)set_auto_trigger_id, (SHORTSIZ16*)set_auto_arm_armstate); // if(error) printf("e1431_set_auto_arm() failed, error: %d\n", error); } /**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**/ // e1431_set_trigger // ------------------- void e1431_set_triggercb( Widget, caddr_t, caddr_t ) { // error = e1431_set_trigger((shortsiz16*)set_auto_trigger_id, (SHORTSIZ16*)set_trigger_chanstate,(LONGSIZ32*)set_trigger_delay, (FLOATSIZ32*)set_trigger_lowlevel, (FLOATSIZ32*)set_trigger_highlevel, (SHORTSIZ16*)set_trigger_slope,(SHORTSIZ16*)set_trigger_mode); // if(error) printf("e1431_set_trigger() failed, error: %d\n", error); } /**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**/ /* Conventions utilisées ds le programme: programme: 4 parties 1. initialisation => doit inclure des int,double en accord avec defines e1431 2. main shell => contient bouttons qui lancent les shells config,.. et bouttons mesure 3. shellcb => shells qui contiennent les listview parameters et bouttons qui lancent commandes e1431 4.commandsCB => commandes e1431 schema: conventions de noms --------------------------- main_shell boutton (mesure) => nom_button boutton (nouvelle fenetre) => nom_button shell => nom_shell (ex:groupons_shell,set_analog_shell,..) compview => nom_window (ex:set_analog_window) ~ /shell => nom_list_1_shell... / listview => nomcommande_list /---shell => nom_list_2_shell - compview => nom_list_2_window - double => nom_list_2_nomvariable \ \shell => nom_list_3_shell - compview => nom_list_3_window - listview => nom_list_2_list... PS: nom_list_3_list peut etre recursif (nom_list_3_list_1_list_window & nom_list_3_list_1_list_nomvariable) ex: nom_list_3_list_1_window represente une composite view du premier element d'une liste qui est appellee par le 3 ieme element de la premiere liste. PS sur l'ex: le nom du shell supplementaire est evidemment: nom_list_3_list_1_shell et la variable est nom_list_3_list_1_nomvariable */
ERRATUM: "modélisation de l'état de charge des batteries de véhicules électriques", TFE de J-F Colson pg 15 Fig 8: manque la legende: Le bilan énergétique est aussi très important, il conditionne la quantité d énergie nécessaire et donc la quantité de CO 2 produite : énergie dans le transport du carburant énergie dans la chaîne de traction énergie perdue à la production (centrale) énergie pour le mouvement Fig.8 balance de l'énergie Pg 36: "En conséquence, la densité de l électrolyte varie de 40% en passant de 1.30 kg dm -3 à 1.10 kg dm -3 " devient "En conséquence, la densité de l électrolyte varie de 1.30 kg dm -3 à 1.10 kg dm -3 en passant de 40% à 15% d'acide dans la solution." Pg 59: remplacer Fig 28 par Fig 26 Pg 77: remplacer Fig 27 par Fig 29 et finalement: Toute allusion à la "double couche électronique" doit être remplacée par "double couche ionique" car ce sont les ions qui participent à sa formation et non les électrons. (entre autre pg: 71,72,87)