samedi 11 mars 2023

Injection : modélisation capteur de pression et température d'admission

Il y a quelques années, j'avais fait des mesures sur ce double capteur. La courbe de réponse de la partie pression est semblable à d'autres capteurs du milieu automobile et est une droite affine qui se modélise avec 2 coefficients a et b tel que pression = a x tension_lue + b. Pour la température c'est autre chose car c'est la réponse d'une CTN qui se modélise par une équation exponentielle qui n'est pas facile à intégrer en assembleur et pas rapide en langage C, une alternative serait d'utiliser une modélisation polynomiale mais il faut au moins un degré 4 ce qui rend la modélisation un peu "oscillante" autour de la valeur réelle. Une troisième méthode consiste à faire des portions linéaires entre chaque mesure par exemple espacées de 10°C, c'est celle que j'ai programmé et la réponse est satisfaisante comme le montre la vidéo ci-dessous :

mercredi 8 mars 2023

Injection : Papillon et PiD

Le papillon est un moteur électrique qui actionne un clapet dans le conduit d’admission d’air.


Lorsque le moteur n'est pas alimenté le clapet est maintenu en position ouvert grace à un ressort de rappel.
Ce ressort met 1s pour passer le clapet de la position fermée à ouverte.
Lorsque que le moteur est alimenté en +12V il ferme le clapet mais une fois en butée le moteur consomme un courant élevé.
Le moteur sous +12V met 120ms à se fermer, sous -12V 86ms à s'ouvrir.

papillon_a.gif, mar. 2023
Trace jaune CH1 sortie commande pap+.
Trace bleue CH4 entrée papillon_pos.
On observe la fermeture et l'ouverture du papillon.
Le curseur indique le temps de fermeture 120ms
papillon_b.gif, mar. 2023
Trace jaune CH1 sortie commande pap+.
Trace bleue CH4 entrée papillon_pos.
On observe la fermeture du papillon.
Temps de fermeture : 120ms
papillon_c.gif, mar. 2023
Trace jaune CH1 sortie commande pap-.
Trace bleue CH4 entrée papillon_pos.
On observe l'ouverture du papillon sous -12V.
Temps d'ouverture : 86ms

Pour maîtriser la fermeture du papillon nous avons besoin d'un asservissement du moteur électrique en fonction de la position mesurée par son capteur électronique. Pour cela nous allons programmer un régulateur PiD.

Le moteur électrique est relié à un driver composé de transistors MOS en pont en "H" de référence Infineon TLE7209-2R Les commandes de ce driver sont reliées à 2 canaux PWM (FTM0_ch0 et FTM0_ch1). Ces PWM sont réglés à une fréquence de 1kHz.

Dans la vidéo ci-dessous j'explique comment je mets en oeuvre cette solution de A à Z. Comment je programme en assembleur la fonction PiD. Quelles sont les influences des différents termes Proportionnel, Intégral et Dérivé.

vendredi 3 mars 2023

Injection : niveau d'huile

Comme je vais raccourcir la jauge d'huile mécanique au maximum, cela va la rendre un peu plus difficile d'accès, je vais utiliser la sonde électronique.

Cette sonde est un simple fil résistif qui coure le long d'un tube percé muni d'un connecteur à 2 broches. Pour estimer le niveau d'huile il faut alimenter le fil avec un courant constant ~200mA continu pendant ~2secondes. A l'alimentation on mesure la tension "froide" aux bornes du fil puis "chaude" juste avant l'arrêt. La différence de tension chaude - froide est proportionnelle au niveau d'huile. En effet, l'huile augmente l'inertie thermique du fils ralentissant l'évolution de sa résistance dans le temps de chauffe.

Je réalise un générateur de courant commandé par le microcontrôleur par le signal "level_on". Lorsque "level_on"=0 Q9 est bloqué, Q10 aussi alors aucun courant ne circule dans la sonde connectée entre le 0V et "Oil_level". Lorsque "level_on"=3.3V Q9 est saturé et la diode Zener D7 impose une tension de 6.8V entre la base de Q10 et le +12V. On retrouve cette tension moins la tension de base Vbe de Q10 aux bornes de R107 qui ajuste le courant à 6.08V/33ohms= 184 mA.

oil_levl_gene_sch.gif, mar. 2023
Générateur de courant

Tant que D7 maintient une tension de 6.8V Q10 régule le courant. Voici des oscillogrammes avec une alimentation à 10 V et 14V qui montre la tension constante aux borne de R107. Trace jaune CH1 est Q10_base, la trace bleue CH2 le +12V (alimentation 10V puis 14V), la trace violette CH3 Q10_emetteur et la trace verte CH4 Q10_collecteur.

Avec des mesures tous les cm je peux vérifier que la différence de signal entre le fil chaud et froid est une relation linéaire.

J'ai fait des essais à 20°C et 60°C. Je constate que la différence de signal est identique mais que les valeurs absolues augmentent avec la température. On peut linéariser cette fonction avec une équation affine (y=ax+b).

oil_level_linear.gif, mar. 2023
Mesures et régression linéaire

Je programme un menu calibration de la sonde de niveau d'huile dans le calculateur pour mesurer les niveaux 20mm et 90mm afin de calculer les coefficients a et b de l'équation affine pour retrouver le niveau d'huile en fonction de la différence de signal mesurée. J'observe le niveau d'huile sur la sonde mécanique : 31mm sur une plage de 0 à 44mm. J'observe ensuite le niveau sur la sonde : 72 mm. J'en déduis que la plage acceptable vu de la sonde est de 41mm à 85mm.

Menu du calculateur en cours d'élaboration et alerte sur le niveau d'huile.

Cette technique de mesure est économique et fiable mais ne permet pas de faire des mesures de façon continue. Cela n'a d'ailleurs pas d'intérêt pour le niveau d'huile dans le carter car, une fois le moteur démarré, la pompe à huile fait baisser le niveau pour lubrifier le haut moteur et les différents organes mécaniques.

dimanche 26 février 2023

Injection : UART et manette de gaz

Pour communiquer avec le calculateur d'injection je choisis d'utiliser un UART configuré pour une 'classique' liaison RS232, 8bits de data, 1 bit de stop, pas de parité et pas de contrôle de flux avec une vitesse de 57600 bauds. Cela se met en fonction très rapidement et associé à un émulateur de terminal VT100 qui interprète les codes "ANSI Escape" on dispose de commande d'effacement d'écran, de positionnement du curseur, de changement de couleur, etc. pour construire des menus et afficher des fonctions. On peut par exemple utiliser un smartphone Androïd avec une application terminal comme celle de Kai Morich.

Dans la vidéo ci-dessous voila comment on peut calibrer la manette des gaz en suivant les menus du calculateur d'injection.

Injection : accélérateur moderne

Petite série de vidéos sur l'utilisation des composants que l'on trouve autour de la pédale d'accélération d'un véhicule moderne.

Injection : réglages des ponts diviseurs

Nous avons vérifié dans le billet précédent que tous les aiguillages des entrées analogiques sont correctes et que les valeurs converties sont exactes.

Il faut maintenant procéder aux réglages des ponts diviseurs pour que les valeurs numériques lues correspondent à la dynamique des mesures que l'on souhaite.

Par exemple pour la mesure de la tension de sortie du convertisseur DC/DC 200V il faut diviser cette tension pour la ramener dans la plage de mesure du microcontrôleur qui est de 0 à 3.3V.

La dynamique numérique du convertisseur 12 bits va de 0 à 4095 (212-1=4095), on peut régler la division pour que ces bits expriment des décis volts, c'est à dire que 409.5Volts=4095, 200V=2000, 1volts=10 et 1=0.1Volts.

pont_diviseur.jpg, fév. 2023
Pont diviseur de tension

Si il y a bien une formule à retenir dans l'électricité/électronique c'est celle de la loi d'ohm : U=RxI avec U=volts=tension, R=ohms=résistance et I=Ampère=courant. Avec on obtient la formule du diviseur de tension Ud=Ue R2/(R1+R2) autrement écrit R1/R2=(Ue-Ud)/Ud. Comme vu de l'ADC 3.3V=4095 il faut que Ud=3.3V quand Ue=409.5V soit un rapport R1/R2=(409.5V-3.3V)/3.3V=123.1. Si je prends R2=10Kohms alors R1=1 230 909 ohms ...c'est une valeur qui ne se trouve pas sous le sabot d'un cheval ! On s'en rapproche en mettant en série 2 résistances : une de 470K et une autre de 750K qui sont des valeurs normalisées dans la gamme E24 pour obtenir R1=1.22 Mohms (1 220 000 ohms). Je pourrai prendre une valeur de 1.23Mohms dans la série E192 ...mais je n'en ai pas dans mes tiroirs. La difficulté supplémentaire c'est que ces résistances dans la série E24 sont précises à +/-5% et que d'autre éléments comme l'impédence d'entrée de l'ADC entre en jeu. Le plus simple est d'ajouter une résistance parrallèle sur R2 pour ajuster le résultat, pour mon exemple cela à été d'ajouter une 820Kohms en // de R2 pour obtenir un résultat parfait.

Un autre exemple est la mesure de la tension de batterie '+12V'. Là il est judicieux de représenter des centivolts pour qu'a 3.3V vu de l'ADC la valeur numérique 4095 corresponde à 40.95V, 12V=1200 et 1=0.01V. Le rapport R1/R2=(40.95V-3.3V)/3.3V=11.41. J'ai obtenu de bons résultats avec R2=27Kohms//470Kohm (soit 25.5K que l'on trouve dans la série E96 1%) et R1=390K//1M (280K dans la série E96).

Pour l'accélérateur il y a deux tensions à convertir 'gaz1' et 'gaz2' :

e_gaz.jpg, fév. 2023

Là on utilisera des millivolts puisque la valeur maximale est gaz1=3.7V et que l'on peut représenter 4095mV. Le rapport R1/R2=(4.095V-3.3V)/3.3V=0.241 que j'obtiens avec R1=4.3K R2=18K//2.2M=17.8K.

0805.jpg, fév. 2023
Ma boite à 0805 !

samedi 25 février 2023

Injection : Clocks, Adc et DMA.

Il y a une vingtaine de signaux à mesurer en tension. Pour cela nous allons utiliser les 2 convertisseurs analogiques numériques (ADC0 et ADC1) présents dans le microcontrôleur. Il existe différents types d'ADC : à simple ou double rampe, delta-sigma, flash,... Les nôtres sont à approximations successives (SAR pour Successive Approximation Register), ils ont besoin d'un cadencement qui permet de placer à l'entrée d'un comparateur la tension à mesurer et la tension issue d'un convertisseur numérique analogique (DAC) qui, dans un premier temps, est réglé à la moitié de sa dynamique de conversion. Si le résultat de la comparaison indique que le signal est en dessous du seuil du DAC le premier bit du résultat est placé à 0 sinon à 1. La tension du DAC est réglée au milieu de la plage restante à mesurer, par exemple si le premier résultat était 1 la tension est placée au 3/4 de la dynamique et la comparaison résultante donne le second bit de comparaison et ainsi de suite. La précision de la conversion dépend du nombre d'approximations successives, de la résolution du DAC et aussi des caractéristiques électriques des composants qui vont définir une limite du nombre d'approximation du fait de leurs rapidité (il faut un certains temps pour établir la sortie du DAC et le résultat de la comparaison) et du bruit électrique.

sar.png, fév. 2023
Schéma de principe du SAR
adc_diagram.jpg, fév. 2023
ADC du microcontrôleur

Nos ADC ont des fonctionnalités supplémentaires, ils sont capables de faire :

  • de la mesure différentielle, des moyennes (jusqu'à 32 mesures moyennées),
  • des comparaisons de seuil ou de fenêtre en fonction de leur configuration,
  • avec des résolutions allant de 8bits à 16bits,
  • avec des vitesses pouvant atteindre 1 million de mesures par seconde !

Le fonctionnement des ADC est donc tributaire des signaux d'horloges qui vont l'alimenter, nous devons configurer le système qui va cadencer tous les périphériques, le cœur du processeur et la mémoire.

Après un Reset la configuration des horloges utilise un oscillateur type RC interne réglé en usine à 32.768kHz dont la fréquence est multipliée x640 grâce à une boucle à verrouillage de fréquence (FLL). Le signal obtenu à 20.97MHz est distribué vers les différents périphériques à travers des modules de division (OUTDIVx). Le processeur et des périphériques rapides ont un diviseur OUTDIV1 réglé en /1, la mémoire flash et le bus des périphériques en /2 avec OUTDIV4 tandis que les ADC par /2 avec OUTDIV5.

MCG_details.jpg, fév. 2023
Détails de la configuration des horloges
MCG_reset.jpg, fév. 2023
Configuration des horloges après Reset

Pour augmenter les fréquences de fonctionnement et améliorer la stabilité ont pourrait envisager d'utiliser un quartz externe par exemple de 46.08MHz qui est compatible avec un fonctionnement sans erreur des communications externes (USART), qui s'approche du maximum de ce que peut supporter les périphériques et maintenir une consommation raisonnable. Pour cela il faudrait passer du mode de fonctionnement "FLL Engaged Internal" (FEI) à "FLL Bypassed External" (FBE). Malheureusement le "System oscillator" ne supporte pas les quartz de plus de 32MHz. Cette limite monte à 50MHz si ont utilise un "cher" oscillateur externe qui sortirait un signal déjà en forme.

fei_fbe1.jpg, fév. 2023
Changement de mode de fonctionnement des horloges FEI>FBE
MCG_46M.jpg, fév. 2023
Configuration avec Quartz 46.08MHz impossible

La solution est d'utiliser le mode "FLL Engaged External" (FEE) avec un quartz 18.432MHz.

fei_fee1.jpg, fév. 2023
Changement de mode de fonctionnement des horloges FEI>FEE
MCG_18M.jpg, fév. 2023
Configuration avec Quartz 18.432MHz

Pour vérifier la configuration des horloges on lit différents bits de status dans les registres spécialisés. On peut observer le signal d'un port piloté par un programme qui change son état à chaque cycle, c'était le propos de la précédente vidéo à la minute 26:48.

Nous souhaitons une conversion analogique numérique avec 12 bits de résolution (un LSB représentera 0.8mV), un moyennage hardware de 32 conversions pour atténuer le bruit de mesure, un temps d'échantillonnage (sample time) le plus grand possible du fait des filtrages analogiques, une horloge de conversion fADCK visée vers les 4MHz, avec un quartz à 18.432MHz je retiens fADCK=2.88MHz (23.04MHZ/8). Dans cette configuration on obtiendra un temps de conversion (documentation page 665) de 3xADCK + 5xbus_clock + 32x(20xADCK + 20xADCK + 0 ). Soit 1283xADCK + 5xbus_clock. Soit 1283/2.880MHz + 5/46.08MHZ = 446µs par mesures soit pour les 10 mesures en séquence DMA 4.5ms. Vu que l'on va répartir les 20 conversions sur les 2 ADC, ont aura plus de 224 lots d'informations analogiques par seconde. Ce qui est bien suffisant car même à 6000tr/mn le moteur tourne à 100tr/s soit une tour toutes les 10ms...

Comment lancer les mesures et récupérer les résultats ? Pour lancer une mesure il faut écrire dans un registre spécial "ADCxSC1A" qu'elle entrée analogique ont veut mesurer parmi toutes celles disponibles sur le multiplexeur d'entrée. Il existe 3 méthodes pour lire le résultats :

  1. Scruter le bit de complétion de conversion "ADCxSC1A[coco]" avec une boucle logicielle. Cette solution est peut efficace car le programme ne fait rien d'autre qu'attendre alors qu'il pourrait faire autre chose pendant ce temps car 446µs c'est le temps pour exécuter @46.08MHz environ 21000 instructions.
  2. Faire déclencher une interruption quand "ADCxSC1A[coco]" s'active, solution classique mais qui demande à chaque conversion d'entrer dans une routine d'interruption qui relève la mesure, la range dans une mémoire, change l'aiguillage du multiplexeur d'entrée de l'ADC et lance une conversion.
  3. Lancer des DMA quand "ADCxSC1A[coco]" s'active. C'est cette solution que l'on va retenir car elle à l'avantage de mobiliser un minimum le cœur du processeur et donc de libérer beaucoup de temps pour le programme.

La technique du DMA consiste à utiliser un mécanisme qui fait des transferts de données indépendamment du processeur. C'est un peu comme des processeurs supplémentaires avec une seule instruction MOV de déplacement de données. Dans nôtre microcontrôleur il y a 8 canaux DMA, c'est à dire que l'on peut exécuter 8 transferts de données différents simultanément. Chaque canal DMA peut à chaque appel, faire un transfert d'une ou plusieurs données dans une boucle mineure, la fin de tous les transferts de la boucle mineurs fait ajuster les paramètres pour l'exécution de la prochaine boucle mineures et sortir du canal DMA. Une fois toutes les boucles mineures appelées, le système ajuste les paramètres pour faire un bouclage majeure. Le paramétrage des données sources et destinations, le format et le nombre de données échangées sont formalisés dans un tableau "TCD" (Transfer Control Descriptor)

dma_loops.jpg, fév. 2023
DMA Boucles mineures et majeures
tcd_structure.jpg, fév. 2023
DMA tableau TCD (Transfer Control Descriptor)

 

Pour balayer la totalité des 10 conversions pour un ADC nous avons besoin de 2 canaux DMA :

  • "TCD DMA chanel 1" qui récupère le résultat de la conversion dans le registre "ADCxRA" et le range dans un tableau de 10 valeurs (ADCx_ram),
  • "TCD DMA chanel 0" qui récupère dans un tableau la valeur de l'aiguillage de l'entrée que l'on veut convertir et la place dans le registre "ADCx_SC1A" pour lancer la conversion.
DMA_chain.JPG, fév. 2023
Enchainement des transferts DMA
tcd_adc_RA.jpg, fév. 2023
DMA canal 1 TCD
tcd_adc_scan.jpg, fév. 2023
DMA canal 0 TCD

 

Le TCD du canal 1 pour ADC0 (ou canal3 pour ADC1) est paramétré pour avoir 1 seule boucle mineur de transfert d'une valeur où seule l'adresse de la valeur de destination est incrémentée et de 10 boucles majeures liées au canal0 pour l'ADC0 (ou canal2 pour ADC1) avec initialisation aux valeurs de départ lors de l’exécution de la dernière boucle majeure.

Le TCD du canal 0 pour ADC0 (ou canal2 pour ADC1) est paramétré pour avoir 1 seule boucle mineur de transfert d'une valeur où seule l'adresse de la valeur source est incrémentée et de 10 boucles non liées avec initialisation aux valeurs de départ lors de l’exécution de la dernière boucle majeure et lancement d'une interruption.

Dans cette configuration tous les transferts sont automatiques et bouclent infiniment avec une interruption toutes les 4.5ms soit le temps nécessaires aux balayages des 10 entrées, avec pour chaque entrées, 32 mesures moyennées. Lors de cette interruption j'ai programmé le moyennage de 32 jeux de valeurs rangées dans un autre tableau qui contient les 10 résultats des moyennes effectuées sur 1024 mesures 7 fois par seconde.

Je vérifie ce fonctionnement avec dans la routine d'interruption comme première instruction l'activation d'un port et comme dernière sa désactivation. Je bascule un autre port lors du transfert du moyennage supplémentaire, cela permet d'observer à l'oscilloscope :

DMA_ADC_b.gif, fév. 2023
Période du traitement de l'ISR : 4.2ms
DMA_ADC_a.gif, fév. 2023
Détail du fonctionnement de l'ISR

Dans l'oscillogramme "Détail du fonctionnement de l'ISR" on a :

  • trace violette CH3 indique l'activité de la tache de fond : toggle du port PTC1 à la fréquence de MCGOUTCLK = 50 MHz
  • trace jaune CH1 indique le début et la fin de l'ISR
  • trace verte CH4 indique le temps de la partie initialisation du moyennage supplémentaire et le transfert des valeurs.

Pour l'interprétation :

  • De CH3=0 à CH1=1 on a le temps d'entrée dans l'ISR avec la sauvegarde automatique des registres = 7µS,
  • de CH1=1 à CH4=1 on a le temps d'accumulation des valeurs pour le moyennage des 10 mesures = 3.4µS,
  • de ch4=1 à CH4=0 on a le temps du calcul des 10 moyennes, de leurs transferts dans le tableau des résultats et l'initialisation des variables pour un nouveau moyennage = 2.6µS,
  • de ch1=1 à CH1=0 on a le temps que prend successivement le moyennage des mesures suivie du temps d'initialisation = 6µS,
  • la période ou CH3=0 indique le temps total du traitement de l'ISR lors d'une initialisation = 13.4µS.
DMA_ADC_c.gif, fév. 2023
Période du traitement complet du moyennage
DMA_ADC_d.gif, fév. 2023
Décalage de 50µS

Avec une instruction toggle PTB18 à l'entrée de la routine d'initialisation, la trace verte CH4 (PTB18) de "Période du traitement complet du moyennage" indique la période du traitement complet du moyennage de l'ISR pour toutes les mesures d'ADC0 soit le temps pour 32 accumulations de 32 conversions moyennées de 10 entrées analogiques (10240 conversions au total) = 134mS (@MCGOUTCLK=50 MHz).

Pour éviter que l'interruption du DMA canal 1 de l'ADC0 tombe en même temps que celui de l'ADC1, j'ai ajouté une pause de 50µs entre le lancement de la première convrsion d'ADC0 et d'ADC1. C'est ce que montre "Décalage de 50µS" avec :

  • trace violette CH3 indique l'activité de la tache de fond : toggle du port PTC1 à la fréquence de MCGOUTCLK = 50 MHz
  • trace jaune CH1 indique le début et la fin de l'ISR d'ADC1 (PTB19)
  • trace verte CH4 indique le début et la fin de l'ISR d'ADC0 (PTB18)

Une fois les bons timings vérifiés il faut vérifier que les conversions sont à la bonne valeur et bien ordonnées. Pour cela rien de telle que d'utiliser un périphérique qui fait la fonction inverse des ADC : le DAC pour Digital to Analogue Converter. Le DAC de ce microcontrôleur a 12 bits de résolution et une dynamique de 0V à 3.3V. Il va transformer une valeur numérique 0 en 0Volt et une valeur 4095 en 3.3Volts. Pour évaluer ses performances je fais un petit programme qui écrit ces 2 valeurs successivement avec une période de 43µs.

DMA_ADC_e.gif, fév. 2023
Période du DAC 43µs
DMA_ADC_f.gif, fév. 2023
Temps de montée du DAC 250ns

Les oscillogrammes ci-dessus permettent de vérifier l'amplitude du DAC et son temps de montée à pleine échelle : 250ns, ce temps est bien inférieur aux besoins. Pour vérifier les mesures des ADC j'utilise un générateur de tension sinusoïdal d'amplitude 3.3V que je connecte aux entrées une par une. Je réalise un programme qui boucle sur la mise à jour du DAC avec les valeurs à vérifier. On observe la tension d'entrée de l'ADC et la tension de sortie du DAC :

DMA_ADC_g.gif, fév. 2023
Vérification des mesures avec le DAC
DMA_ADC_h.gif, fév. 2023
Temps de conversions

La trace jaune CH1 est la sortie du générateur de signaux sinuosidals 10Hz 0 à 3.3Vdc connecté à l'entrée analogique PTC0_ADC1_SE11. La trace verte CH4 est la sortie du DAC0 PTE30 avec la boucle @50MHz :

ldr r1,=PTC0_ADC1_SE11
ldr r2,=0x4003F000 //DAC Data Low Register (DAC0_DAT0L)
boucle_b:
ldrh r0,[r1]
strh r0,[r2]
b boucle_b

On voit la réponse du DAC de 0 à 3.3Vdc avec un temps de palier qui refléte le temps de moyennage de 32 valeurs x 10 canaux soit 4.2ms.

En changeant la première ligne du programme en "ldr r1,=PTC0_ADC1_SE11_r" on observe le moyennage sur 1024 mesures :

DMA_ADC_i.gif, fév. 2023
Moyennage de 32 acquisitions de 32 valeurs x 10 canaux
DMA_ADC_j.gif, fév. 2023
Moyennage de 32 acquisitions de 32 valeurs x 10 canaux

On retrouve bien les valeurs estimées içi @50MHz on a 138ms pour le moyennage des 10 canaux de 1024 mesures.

Voilà ce qui cloture le chapitre des mesures analogiques. La suite sera la calibration des ponts diviseurs d'entrées et la calibration des capteurs.

samedi 18 février 2023

Injection : attribution des ports

Sur ma carte d'injection j'ai câblé uniquement les capteurs et actionneurs principaux du moteur PSA DV6. J'ai écarté tous ce qui concerne l'EGR, le FAP, la climatisation, le code PIN, le groupe de moto-ventillation, l'embrayage, l'alternateur, etc. Je respecte l'attribution des broches des 3 parties du connecteur du SID807 ce qui permet de conserver le faisceau d'origine avec tous ses connecteurs.

Chaque entrée analogique dispose d'une structure en PI et de possibilité de connexion aux alimentations, cela permet de faire du filtrage ou de la division de tension pour être compatible avec les entrées analogiques 0-3.3Vdc du microcontrôleur. L'attribution des 64 broches du MKV11Z128VLH7 est listée dans un fichier Excel qui fait apparaitre les différentes configurations alternatives pour chaque broche, celles retenues sont surlignées en rouge avec le nom du net dans le schéma.

La répartition se fait équitablement entre les deux convertisseur ADC0 et ADC1.

Il y a au total une vingtaine d'entrées analogiques, chacun des deux convertisseurs balayera une dizaine d'entrées. 7 timers utilisés dont certains multicanaux. 2 UART et/ou un port CAN pour la communication. Une interface I2C pour la mémoire EEPROM externe. Quelques entrées/sorties GPIO.

Injection : univers de programmation

Le microcontrôleur est câblé. Voici une vidéo qui le présente avec une solution de programmation et de débogage. J’utilise l'IDE (Environnement de Développement Intégré) KDS de chez NXP. Une solution plus moderne et gratuite serait d'utiliser ARM Keil MDK-Community Edition. Ces IDE s'appuient sur la suite logicielle de compilation GNU Arm Embedded Toolchain. Ils en font l'habillage graphique pour transmettre les différentes options de compilation et font le lien avec les sondes de débogage. On peut à moindre frais utiliser la partie débugueur (OpenSDA) des cartes d'évaluation, par exemple la NXP FRDM-KV11z. J'utilise un onéreux débugger de chez PEmicro Multilink Universal FX qui en pratique ne fait rien de plus que les debuggers du monde libre (peut-être même moins vu qu'il n'a pas de convertiseur UART<>USB intégré).

La base documentaire commence amha par la lecture de "The Definitive Guide to ARM® Cortex®-M0 and Cortex-M0+ Processors" de Joseph Yiu pour se familiariser avec le paradigme ARM. La documentation ARM des coeurs Cortex M0+ pour avoir la définition des options de ce coeur de processeur 32 bits et son jeu d'instructions assembleur. Chez NXP le "KV11 Sub-Family Reference Manual" et les caractéristiques électriques du KV11. C'est un minimum pour franchir cette "marche technologique" qui vous fera entrer dans l'univers pationnant des microcontrôleurs 32bits modernes.

jeudi 16 février 2023

Injection : alimentation logique

Pour l’alimentation du microcontrôleur, de l’EEPROM, des circuits logiques, des interfaces de communication, des comparateurs, etc. j’utilise une alimentation à découpage basée sur un Texas Instruments LM5165 U10 qui délivre du 5V en cascade avec un régulateur linéaire LP2985-3.3 U9 qui fournit le 3.3 volts.

La mise en service lors de la montée de l’alimentation est programmée par R22, R28 et R32. L’hystérésis est là aussi réglée assez grande pour éviter les oscillations au démarrage. En effet au démarrage les appels de courant qui passent dans la résistance interne de l’alimentation peuvent créer une chute de tension qui le met hors service. En tenant compte de la chute de tension de la diode D5, le circuit fonctionne à partir de 9.6V et s’éteint en dessous de 8.6V.

Trace jaune CH1 +3.3V, trace bleue CH2 +5V, trace violette CH3 +12V, trace verte CH4 activité du microcontrôleur (PTC1). Sur la première image on voit +3V3 opérationnel à la mise sous tension à partir de 9.68V. Sur la deuxième, +3V3 arrêt opérationnel (activité du micro) à mise hors tension à partir de 8.56V. On observe que le microcontôleur fonctionne à partir de 2V (c'est la configuration par défaut de son superviseur d'alimentation que l'on peut reprogrammer pour faire différentes actions selon différents seuils d'alimentation, mais cela sera une autre histoire...).


Le temps de démarrage doux est fixé par C59 à 5.8mS (montée de la trace bleue +5V ci-dessus).
La tension de sortie par R23 et R29 à 5.26V hors charge.
Le fonctionnement est programmé en « Constant On-Time » (COT) avec fréquence de fonctionnement par R33 à 250kHz. Il y a 3 modes de fonctionnement :
• Continuous Conduction Mode (CCM) avec fréquence de commutation fixe lorsque le courant de charge est supérieur à la moitié de l’ondulation du courant d’inductance pic à pic.
• Saut d’impulsion et « Diode Emulation Mode » (DEM) lorsque e courant de charge est inférieur à la moitié de l’ondulation du courant d’inductance pic à pic.
• Mode de repli de fréquence pour maintenir la régulation de sortie lorsque que les écarts de tension entre entrée et sortie sont faibles et pour améliorer la réponse aux augmentations de charge brusque.

U10 possède une sortie « Power Good » qui est connectée à l’entrée de mise en service du régulateur U9. Cette sortie s’active quand +5M atteint 94% (4.94V) de sa valeur. Elle se désactive quand +5M chute en dessous de 87% (4.58V).
Dans ces conditions, même avec une tension d’alimentation de seulement 9V, le circuit peut fournir une charge 1W au +5V (4.8V x 207mA) et la maintenir avec une alimentation au-delà de 30V !

U9 peut délivrer un courant de sortie de 150mA avec une précision sur le 3.3V de 1.5% et cela à partir de 3.6V d’alimentation. il supporte des pics de charge de 350mA.

Ci-dessous la cohabitation des 2 convertisseurs DCDC.

Trace jaune    CH1 Q1D (commande du MOSFET du convertisseur DCDC 200V)
Trace bleue CH2 5V
Trace violette CH3 12V
Trace verte CH4 activité PTC1

L'oscillogramme ci-dessus représente la montée des alimentations micro/capteurs et la commande du convertisseur DCDC 200V (Q1D) ... (et aussi un tas de parasites de mesures car les fils des sondes sont trops longs).
On observe que le micro démarre avant le convertisseur DCDC 200V. Le convertisseur DCDC 200V fait sécrouler le +12V, il faudra en tenir compte lors de la programmation du microcontrôleur.

Les charges volantes !

- page 2 de 57 -

Page top