Nous contrôlons le générateur ou la lutte contre l'ADC dans le STM32F030

Historiquement, cela n'a pas fonctionné pour moi avec la famille STM32F030, il y a environ 5 ans, j'ai essayé de travailler avec eux et pendant longtemps j'ai été surpris par le travail maladroit de la plupart des périphériques, puis j'ai marqué sur eux. Et l'autre jour, je devais encore revenir à cette série, il fallait mesurer pour un minimum d'argent la tension constante sur une batterie au plomb (ou assemblage jusqu'à 4 pièces en série) de 8 à 60V avec une précision d'au moins ± 0,1V avec une fréquence d'interrogation faible.

La solution du problème «frontal» n'a permis de mesurer avec précision la tension que lorsque la valeur de l'entrée ADC est supérieure à 1,5 ... 1,6 V, c'est-à-dire uniquement dans la seconde moitié de la plage, ce qui signifie pour moi 30 ... 60 V au lieu des 8 requis. .60V. Le problème principal était dans la plage 0 ... 1.6V, tout semblait que mon diviseur de tension était "flottant" ou la tension de référence pour l'ADC (V ref ) était extrêmement instable.

Il était nécessaire de résoudre rapidement le problème, mais pas de la manière la plus élégante, mais au moins sans béquilles évidentes. Pour ce faire, il a d'abord fallu étudier le problème et comprendre d'où les «jambes poussent», puis éliminer ce problème. Si cela ne fonctionne pas, alors contournez-le au moins pour éventuellement obtenir un appareil fonctionnel et l'envoyer au client.



Essence de la tâche


En général, j'essaie de ne pas m'attaquer à une telle bagatelle depuis longtemps, mais un parent s'est tourné vers moi, et à temps partiel une bonne personne qui travaille également sur des sujets qui me sont proches - il recueille de petits SES quelque part dans la région de Moscou. Je ne voulais pas refuser, et même à ce moment-là, cette tâche me semblait «quelques heures de fer + quelques heures de code». Le projet dans Altium Designer m'a vraiment pris quelques heures, mais la lutte contre l'ADC a été mangée toute la soirée, j'ai donc décidé de partager des informations pour que les autres ne perdent pas de temps.

L'appareil lui-même est extrêmement simple, l'algorithme est le suivant:

  • mesurer la tension sur l'assemblage de 1 ... 4 batteries au plomb connectées en série;
  • si la tension est inférieure au "seuil inférieur", fermez le relais et il allume le générateur, qui charge nos batteries;
  • si la tension dépasse le «seuil inférieur + hystérésis», c'est-à-dire que les batteries sont chargées jusqu'au seuil défini, puis éteignez le générateur;
  • si la tension est supérieure au "seuil supérieur", alors nous interdisons d'allumer le générateur au cas où.

C'est tout! Exemple: il y a une batterie 12V et l'onduleur en est alimenté. Si la tension descend en dessous du «seuil inférieur», la valeur par défaut est 10,2 V, puis allumez le générateur. Si la tension de la batterie est passée à "seuil inférieur + hystérésis", désactivez-la. Par défaut, l'hystérésis est réglée sur 2V et est nécessaire pour que le générateur d'essence ne se coupe pas dès qu'il charge légèrement la batterie à 10,3V. De marche / arrêt constant, le générateur mourra simplement. Eh bien, juste au cas où, la protection: si la tension sur la batterie est supérieure à 14,4 V, alors ne mettez pas le générateur exactement sous tension.

L'algorithme est simple et direct, de plus, il a fallu faire un petit menu pour que trois variables puissent être modifiées: «seuil inférieur», «hystérésis», «seuil supérieur». Rien de compliqué, mais le diable est dans les détails.

Initialement, la société où travaille le parent utilisait un appareil chinois avec des fonctionnalités similaires. Parmi les inconvénients mineurs - il était impossible de changer l'hystérésis, car la puissance avait besoin d'une source supplémentaire de 5V et d'une mesure de seulement 30V, c'est-à-dire pour 1 ou 2 batteries. Parmi les gros inconvénients - l'appareil chinois gèle et redémarre parfois lors du démarrage du générateur d'essence qu'il contrôlait. La dernière "caractéristique" est devenue la raison de la tentative d'abandonner la décision chinoise.

Ils voulaient éliminer tous ces inconvénients de moi et que le prix de l'appareil était comme celui des Chinois, c'est-à-dire 10 $. La «bagatelle diabolique» dans ce cas était qu'ils voulaient m'acheter un appareil fini pour 10 $ en lots de seulement 20-30 pièces, bien qu'il soit stable et souvent suffisant. Autrement dit, je devais rendre l'appareil beaucoup mieux et beaucoup moins cher que les chinois dans une petite série, je dois aussi gagner de l'argent à l'avenir. Oui, j'étais aussi drôle dans les 10 premières minutes, mais au moment où j'ai réalisé cette situation, j'ai déjà dit "OUI", c'est-à-dire qu'il n'y avait pas de terre au-delà de la Volga pour moi ...

Résolution des problèmes de fer


Comme je l'ai écrit ci-dessus, le problème principal est le fonctionnement instable de l'appareil lors du démarrage du générateur. En conséquence, un appareil chinois avec aliexpress a été acheté pour les tests et la recherche. La principale raison de la «démolition de la tête» n'était pas dans le générateur, mais dans le relais :)) Au moment de la commutation de l'alimentation, une impulsion d'une amplitude d'environ 25 V a traversé le bus 3,3 V, ce qui a laissé entendre ... L'interférence est également allée aux chaînes de signaux. Dans le circuit chinois, pour lutter contre un tel problème, les diodes LL4148 se tenaient, ce type bloquant le chemin des interférences. Cela s'est avéré suffisant pour que l'appareil fonctionne normalement sur la table, mais pas dans un tas d'interférences externes supplémentaires telles qu'un générateur et d'autres équipements. Pour me débarrasser définitivement de ce qui est décrit ci-dessus, j'ai décidé d'utiliser l'isolation galvanique à travers un tas d '"optocoupleur + dc / dc", qui a complètement éliminé le contact électrique et le chemin d'interférence entre la bobine du relais de commande et le reste du circuit.



Une alternative à cette solution était l'utilisation de diodes TVS protectrices avec une self de mode commun, ainsi que la complication du filtre d'alimentation. Mais pourquoi une telle ferme collective? Mettre du dc / dc est plus facile, mais en pratique, cela s'est avéré encore moins cher - le module chinois Mornsun B0505S-1WR2 m'a coûté 0,4 $ avec le coût d'une self de mode commun par petit lot d'environ 0,32 $.

En conséquence, après une telle décision et des tests de prototype, l'appareil a commencé à fonctionner comme un fusil d'assaut Kalachnikov et les problèmes de redémarrage ont disparu. En général, je suis un peu surpris que le relais + un peu le générateur obligé de redémarrer le stm-ku, les développeurs chinois, en principe, ont tout bien fait: 10 kOhm + 0,1 uF pour réinitialiser, bloquant les condensateurs pour l'alimentation, les billes de ferrite, tout était, mais il s'est avéré que c'était la même chose de toute façon pas assez.

Le deuxième inconvénient des "chinois" était la nécessité d'une alimentation supplémentaire, apparemment économisée en courant continu / continu. J'ai résolu le problème sur le front - j'ai pris le pouvoir du signal d'entrée, directement à partir d'un connecteur. Pour ce faire, il vous suffit de mettre du dc / dc, qui digèrera au moins 4 * 14,4V, soit 57,6V. Mon choix s'est porté sur le LMR16010PDDAR. Premièrement, c'est le Texas et c'est tout. Deuxièmement, les camarades asiatiques ont suggéré que je porte cette puce à très bon marché.

Le paragraphe précédent a décidé de manière exhaustive le troisième moins - la possibilité de connecter jusqu'à 4 batteries en série. DC / DC digère facilement 60V, il commence à essayer de ne brûler qu'à 72 ... 73V, donc le maximum de 57,6V n'est certainement pas effrayant pour lui. Le diviseur de tension en général ne se soucie pas de la quantité à l'entrée, donc tout a été décidé avec un minimum d'effort.

Vous pouvez voir comment tout cela est mis en œuvre dans le diagramme ici - PDF . Le schéma est assez grand, donc je ne l'ai pas rempli avec une photo. À propos, en pdf, vous pouvez également voir les dimensions avec une carte de circuit imprimé, mais il n'y a rien de surnaturel.

En conséquence, les composants de 10 appareils ont été commandés pour le premier lot de test, et après assemblage, cela s'est avéré comme ceci:



Ce ne fut pas sans incident - lorsque j'ai créé le composant pour le module DC / DC, j'ai mélangé les jambes 1 et 2 par endroits, j'ai dû prendre une petite ferme. Bien que je l'ai fait plus soigneusement sur les cartes suivantes afin que personne ne le remarque, la carte sur la photo est restée avec moi comme outil de débogage au cas où ou pour des améliorations logicielles si le client venait avec quelque chose pendant les tests.

Lutte contre la précision ADC


Passons maintenant à la partie principale de l'article. Comme je l'ai écrit au début de l'article, le F030 ADC s'est avéré inexact, c'est-à-dire que jusqu'à une tension de 30 ... 32V à l'entrée de l'appareil, les lectures ont flotté avec un écart allant jusqu'à 15 ... 20%, puis l'erreur a disparu en douceur. Une chose m'a plu - à première vue, les écarts avaient une certaine régularité, ce qui signifie que ce n'est pas une erreur aléatoire et vous pouvez la suivre et essayer de la corriger.

Prenons un peu plus de détails sur l'erreur ... Après la conversion, l'ADC envoie les données brutes au registre DR , qui contient une valeur de 0 à 4095 (2 12 ). Pour convertir cette valeur en tension, vous devez la multiplier par l'étape de quantification. Dans mon cas, la tension à la broche VDDA, à partir de laquelle l'ADC prend le support, était de 3,3072V et, en conséquence, le pas est de 3,3072V / 4096 = 0,000807V, je l'ai arrondi à 0,0008. Pour obtenir la tension à l'entrée de l'appareil, la tension obtenue doit être multipliée par le coefficient du diviseur de tension, dans mon cas la résistance dans le bras supérieur est de 100 kOhm, et dans le bras inférieur de 4,7 kOhm, ce qui donne le diviseur 22.2765. Sur cette base, la tension à l'entrée de l'appareil, c'est-à-dire la tension de la batterie, est trouvée en utilisant la formule:

float voltageReference = 0.0008; float voltageDivider = 22.2765; adcVoltageResult = (float)adcData * voltageReference * voltageDivider; 

Il s'avère qu'après lecture des données ADC1-> DR , elles sont converties au type float et simplement multipliées par les coefficients, qui sont des constantes, et on obtient le résultat aux volts habituels. En pratique, il s'est avéré que tout est très mauvais avec précision.

En me souvenant du rasoir de Hanlon, j'ai commencé à chercher l'endroit où j'avais fait une erreur. J'ai d'abord vérifié la tension sur la jambe du VDDA, je pensais qu'elle flottait en quelque sorte et dépend de la tension d'entrée, par exemple, le LDO est défectueux. Armé d'un multimètre de bureau, il a surveillé la tension sur le VDDA et a changé la tension d'entrée de 8 à 60V, tandis que la tension sur la jambe du VDDA est restée morte à 3,3072V, seuls les 2 signes suivants ont flotté, ce qui est très bon pour une jauge linéaire de 10 cents.

L'endroit suivant pour l'erreur potentielle était le diviseur de tension. Bien que cela me paraisse étrange que les résistances de Bourns flottent à ± 0,1%, de sorte que les données ont une erreur allant jusqu'à 20% et que cette erreur est non linéaire. J'ai mené la même expérience: j'ai mesuré la tension après le diviseur avec un multimètre et changé la tension d'entrée par étapes de 0,5 V, et en conséquence, le coefficient du diviseur a également été fermement fixé à 22,2768.

À ce moment, cela a commencé à devenir intéressant. Il n'y avait qu'un seul composant dont je pouvais douter - l'amplificateur opérationnel LMV611MFX. Cet ampli op est inclus comme suiveur de tension. La tension AVANT et APRÈS était la même jusqu'à 4 décimales. Étrange ... Selon la fiche technique, ce n'est pas mauvais et c'est le même TI, il doutait, mais a décidé de le vérifier, car c'est cet opamp jamais utilisé. Juste au cas où, mon préféré et testé dans un tas de projets OPA320, que j'ai dans les bobines, soudé à sa place et il a montré le même résultat.

Le dernier composant est resté - MK, à savoir son ADC. Au fil des années d'utilisation de STM, j'ai l'habitude de faire confiance à leurs produits, d'autant plus que je ne prends que les originaux, alors j'ai pensé à MK en dernier. La première chose que j'ai pensé, c'est que j'ai oublié de calibrer ou que j'ai mal fait. Utiles dans le manuel de référence, ils exigeaient non seulement de couper l'ADC en écrivant zéro au bit ADEN , mais aussi de mettre 1 au bit ADDIS et 0 au bit DMAEN . Les 2 dernières étapes n'ont pas été prises, en général je coupe l'ADC et tout fonctionne bien, en conséquence, j'ai corrigé un morceau de code avec calibration:

  /* disable ADC */ if (ADC1->CR & ADC_CR_ADEN) { ADC1->CR |= ADC_CR_ADDIS; while (ADC1->CR & ADC_CR_ADEN) {} } /* calibrate ADC */ ADC1->CR |= ADC_CR_ADCAL; while(ADC1->CR & ADC_CR_ADCAL) {} /* reset configuration */ ADC1->CFGR2 = 0; /* enable device */ ADC1->CR = ADC_CR_ADEN; while(!(ADC1->ISR & ADC_ISR_ADRDY)); 

Malheureusement, cela n'a pas aidé et j'ai décidé de réaliser l'expérience suivante ... J'ai déjà vérifié les coefficients et ils sont corrects à 100%, donc j'appliquerai la tension de l'alimentation du laboratoire à l'entrée, la changerai et afficherai les résultats de mesure bruts de l'ADC sur un indicateur à sept segments, puis le comparerai avec ce qui devrait être là avec ce que vous avez vraiment mesuré. En conséquence, j'ai reçu les résultats suivants:



Comme vous pouvez le voir, le graphique théorique a une excellente linéarité, car non attaché au fer. Le graphique basé sur des données réelles est également presque linéaire avec des écarts minimaux. En fait, le graphique avec des données réelles peut être combiné avec le graphique théorique par transfert parallèle à une certaine constante. Parlant dans le langage de l'électronique, l'ADC a un décalage!

Selon les données sur lesquelles les graphiques ont été construits, j'ai découvert que l'ADC a un décalage à différents points de 71 ... 73 étapes. C'était le problème, et j'ai pensé «non-linéarité» car le décalage de 71 pas à 10V est d'environ 14%, et à 30V il est déjà de 4%. Autrement dit, si vous construisez un graphique des écarts en%, la dépendance aura une forme exponentielle, mais un tel graphique n'est pas intéressant.

Il a été décidé que pour clarifier les résultats, essayez d'introduire une autre variable dans la formule, ce qui augmenterait mes valeurs et aurait la forme suivante:

 uint16_t offsetVoltage = 72; float voltageReference = 0.0008; float voltageDivider = 22.2765; adcVoltageResult = ((float)(adcData+offsetVoltage))*voltageReference*voltageDivider; 

Après ces manipulations simples, mon appareil a commencé à mesurer avec précision la tension et les données ont cessé de flotter. Jusqu'à ce moment, il mentait à 72 * 0,0008V * 22,2768 = 1,28V , ce qui est très critique dans le cas du contrôle d'une batterie. La batterie au plomb n'explose certainement pas comme le Li-ion, mais elle se bloque toujours rapidement, surtout si elle est déchargée en permanence non pas à 10,2 V, mais à 8,92 V.

Voici une si petite histoire sur un petit morceau de fer. J'espère que quelqu'un trouvera ce matériel utile ou du moins tout simplement intéressant à lire. Soyez prudent avec tous ces ADC et autres choses désagréables :))

UPD olartamonov demande avec beaucoup de zèle de ne pas tromper les gens et d'utiliser le code d'étalonnage du manuel de référence - fait le changement avec plaisir. Malheureusement, dans mon cas, cela n'a pas changé la situation et le changement n'est allé nulle part. Le problème vient probablement de la puce elle-même. comme dirigé par le Département d'État a jeté des produits contrefaits

Compétition


Une compétition entre projets techniques se déroule entre camarades PCBway , tout le monde peut y participer. Les règles sont simples. Les cartes de circuits imprimés pour votre projet feront l'affaire gratuitement. Et surtout des prix! Ce sont des livres verts avec des messieurs américains sur votre paypal + monnaie virtuelle pour lesquels vous pouvez commander des cartes de circuits imprimés + honneur et respect + la possibilité d'obtenir une offre d'emploi quelque part en dehors de la CEI :)) Je recommande particulièrement aux étudiants de participer, le niveau technique n'est pas trop élevé là-bas , bien que, d'après l'expérience des concours précédents, il y ait des projets très solides, donc une boîte de bricolage «solide» peut facilement entrer dans les gagnants!

Source: https://habr.com/ru/post/fr448202/


All Articles