Avec un bon microcontrôleur et le temps passe vite ou un oscilloscope de week-end

Il y a quelque temps, l'auteur de ces lignes a entrepris de développer un enregistreur compact d'un signal analogique unipolaire à 3 volts avec la vitesse de lecture la plus élevée possible et les coûts et les tailles les plus bas possibles. Dans la liste des coûts les plus bas possibles, j'ai également saisi mon mal de tête et choisi le bien connu STM32F303. Je me souviens de cela, Cortex-M4 72 mégahertz d'une entreprise bien connue, avec des convertisseurs analogiques-numériques 12 bits, assez agiles (ADC ou ADC, comme vous le souhaitez) et avec une interface CAN à bord.


Ces petits registraires en ont demandé plusieurs dizaines. Et la présence d'un boîtier de microcontrôleur à 48 pieds a inspiré l'espoir qu'il serait possible d'appeler ce lecteur compact. L'interface CAN, avec laquelle j'avais déjà de bonnes relations, m'a donné l'opportunité de combiner tout ce jazz de manière assez pratique.


La vitesse à laquelle, finalement, tout a fonctionné, s'est avérée tout à fait appropriée pour déclarer l'opérabilité de l'approche choisie. Il a été possible de réaliser une étape d'échantillonnage d'une demi-microseconde. Les maux de tête et l'assembleur ne pouvaient pas être évités, mais qui se souvient maintenant de cela?


Cependant, certains sédiments sont restés. L'idée est restée qu'en termes de vitesse, tout n'a pas été éliminé.


Et maintenant, la série STM32G4 est récemment apparue avec une fréquence d'horloge allant jusqu'à 170 mégahertz avec une option dans un petit boîtier, et avec presque les mêmes ADC rapides à bord au nombre de cinq pièces. Il fallait faire quelque chose.


Personne ne se tenait au-dessus de l'âme maintenant et il n'était pas nécessaire de s'inquiéter des délais et des plans.


En effet, si vous n'y pensez pas, vous pouvez même profiter du travail. Mais, franchement, je devais penser au temps. Penser longtemps à peu de temps (et quoi, poétiquement).


La pensée s'est suggérée que nous devrions partir un peu de l'autre bout. C'est-à-dire que nous devons partir du temps d'échantillonnage ADC le plus court possible, qui, sur la base de la description, prend 2,5 cycles d'horloge et s'élève à 62,5 nanosecondes à 40 MHz (160 MHz / 4). Ensuite, l'étape d'échantillonnage de 100 nanosecondes se suggère. Le nombre est rond et, surtout, assez petit et beau, pourquoi ne pas l'essayer?


De plus, la carte NUCLEO-G474RE adaptée aux expériences est apparue en vente et a été achetée, à laquelle il était raisonnable d'ajouter une planche à pain supplémentaire avec deux connecteurs à deux rangées pour souder toutes sortes de fils et de pièces à la planche à pain et ne pas gâcher la principale. Voici à quoi cela ressemble prêt à l'emploi.



Là-bas, il y a plusieurs fils et une résistance avec un condensateur, croyez-moi.


Vous devez maintenant appliquer un signal électrique approprié aux quatre ADC en même temps, puis les exécuter l'un après l'autre avec un pas constant (au début, lors du débogage, pas très court). Pourquoi quatre? Selon la description, chaque ADC passe 15 cycles d'horloge par conversion, soit 0,025 * 15 = 375 nanosecondes (près de 400). Par conséquent, à l'étape 100, un convoyeur de quatre ADC est requis.


Un circuit RC était utilisé comme signal d'entrée, auquel la tension était simplement fournie par le pied du contrôleur. J'ai assigné cette jambe pour contrôler la minuterie TIM5 en mode impulsion unique.


Le schéma de câblage minimum ressemblait à l'image ci-dessous.



ADC1-ADC4 étaient impliqués. La profondeur de bits pourrait être réduite pour une augmentation de la vitesse, mais 12 bits l'emportaient, car je ne voulais pas perdre la précision des mesures. Pour démarrer chaque ADC dans l'ordre nécessaire et avec l'étape requise, trois temporisateurs sont utilisés (TIM2, TIM3, TIM4) et un autre temporisateur (TIM1) est utilisé pour synchroniser les trois ci-dessus. La figure 2 ci-dessous montre les signaux autour desquels tout est construit.



Les flèches vertes indiquent le bord des impulsions le long desquelles les convertisseurs ADC1-ADC4 respectifs sont démarrés.


Pour obtenir les 100 nanosecondes prévues, nous avons dû abaisser la fréquence d'horloge à 160 mégahertz, afin que tout soit complètement divisé comme il se doit. Au début, l'étape a été réglée beaucoup plus lentement, 4 microsecondes, pour vérifier calmement le fonctionnement des minuteries à l'aide d'interruptions, de ports de sortie et d'un oscilloscope. Puis, par interruption, il a été débogué et a obtenu un accès direct à la mémoire. En fin de compte, une seule interruption est traitée - c'est l'interruption de la fin du travail à partir du quatrième (dernier) canal d'accès direct à la mémoire. La figure ci-dessous montre les connexions des unités matérielles impliquées dans le processus, ainsi que quatre tampons de mémoire de sortie.



Sur les quatre tampons de mémoire (dans la figure de droite), les échantillons sont collectés par programme dans un seul tampon de résultat.


Dans ce contrôleur, contrairement au STM32F303, il existe une unité de commutation de demande (DMAMUX), qui vous permet de rediriger un grand nombre de demandes depuis des périphériques vers seulement 16 canaux DMA1 et 16 canaux DMA2. Dans le manuel de référence, les demandes de sortie DMAMUX sont comptées à partir de 0, et les entrées des canaux des canaux DMA sont comptées à partir de 1. Je ne l'ai pas changé, je l'ai laissé comme dans la source d'origine.


Une minuterie TIM5 est utilisée comme générateur d'impulsions unique. Il fournit un mode d'impulsion unique pratique. La commodité réside dans la possibilité de régler l'heure avant le début de l'impulsion et de régler la durée de l'impulsion elle-même. Cette impulsion est sortie comme indiqué ci-dessous sur l'image, aimablement fournie par un oscilloscope loué.



L'oscillogramme montre que la montée de l'impulsion dure 10 microsecondes, ce qui signifie qu'elle devrait contenir environ 100 échantillons.


Le projet a été fait manuellement dans IAR 8.4 (c'est-à-dire sans Cuba et le ballon), mais, j'espère, il sera compris par diverses confessions. Vous pouvez le voir ici .


Voici une image du contenu d'un tampon ADC1 séparé et le résultat collecté à partir de quatre sources du tampon dans la région du début de l'impulsion d'entrée.



Mais le contenu de ces tampons se situe dans la région du pic d'impulsion (où la valeur atteint 2508).



Comme vous pouvez le voir, 196-95 = 101 comptages ont été dépensés sur la section depuis le début de l'impulsion jusqu'à son pic.


Le taux d'échantillonnage est donc de 10 mégahertz. Cela n'a pas fonctionné à cette vitesse tout de suite.


Pour ce faire, j'ai dû arrêter le processeur avant de démarrer l'accès direct à la mémoire (DMA1). Il est bon que le Cortex-M4 dispose d'une instruction d'assemblage spéciale WFI (Wait for interruptions). Si cela n'est pas fait, le processeur se mettra sous les pieds du DMA et occupera le bus avec des accès mémoire qui pourraient bien attendre.


Si vous augmentez l'étape de comptage à 200 nanosecondes, ils cesseront de pousser et guériront paisiblement et joyeusement.


Si nous impliquons le comparateur COMP4 dans son travail et connectons son entrée positive (port PB0) au signal d'entrée, puis utilisons le DAC (DAC1) et connectons sa sortie (CH1) à l'entrée négative du comparateur (à l'intérieur du contrôleur), nous obtenons un dispositif de seuil avec un seuil réglable. Des interruptions du fonctionnement du comparateur vous permettront de démarrer la minuterie d'horloge générale TIM1 et d'obtenir un mode veille, comme dans un oscilloscope.

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


All Articles