Mesure du courant moyen avec uC et shunt de courant


12

Ceci est mon premier message posté. Je suis un logiciel qui essaie de faire du matériel alors soyez gentil :)

Circuit

Je conçois un petit circuit (voir photo, et désolé pour le schéma désordonné) qui est tout simplement un tas de MOSFETS et de pilotes de porte conçus pour commuter les charges résistives (coussinets chauffants dans ce cas) à partir d'un microcontrôleur. Les éléments chauffants ont souvent une très faible résistance, et pour maintenir la puissance au niveau souhaité, les MOSFETS sont commutés à l'aide de PWM.

La mesure

Outre l'aspect purement fonctionnel, il y a également un objectif éducatif. Je veux pouvoir avoir un retour sur la consommation actuelle. Et mon approche naïve consistait simplement à introduire des circuits intégrés de capteurs de shunt actuels. Lorsque j'utilise un multimètre pour mesurer la tension de sortie du capteur, j'obtiens en fait quelque chose qui ressemble au courant moyen (avec commutation PWM) en raison de la «lenteur» de l'ampèremètre. Mais lorsque je connecte la même sortie à un ADC atmega328p, j'obtiens de mauvaises lectures - la vitesse ici met une lecture n'importe où sur l'onde carrée PWM.

Donc, ma question est de savoir comment procéder pour mesurer le courant (moyen) lors de la commutation avec PWM?

Il semble que la conception soit OK, mais j'ai peut-être manqué quelque chose à la fois dans la conception et dans la façon dont le ADC uC devrait être utilisé dans ce contexte.

schématique


Je pense qu'un filtre pourrait être utilisé pour donner une tension moyenne du PWM. Un article intéressant qui explique un tel filtre et les valeurs utilisées en fonction de la fréquence PWM est celui-ci .
alexan_e

Il y a quelques réponses connexes dans cette question . Mais ils mentionnent simplement l'utilisation de shunts et de circuits intégrés pour mesurer le courant. Il n'y a cependant aucune mention de PWM.
Ricardo

Merci pour les commentaires. @alexan_e: TI montre un filtre d'entrée dans la fiche technique INA197, mais je n'étais pas sûr de son utilisation. Ce pourrait être la voie à suivre lorsque la tension n'est pas stable.
ltj

Je pense que c'est la solution à votre problème, mais je préférerais que quelqu'un plus d'expériences sur ce sujet fournisse une réponse détaillée, c'est pourquoi j'ai posté cela en tant que commentaire.
alexan_e

Comme la sortie est un PWM à service variable, vous pouvez utiliser un circuit de détection de crête et le mesurer avec un ADC.
Martin

Réponses:


6

Parfois, ce qui semble simple n'est pas si simple. Vous avez une mesure assez complexe à faire, mais vous voulez un résultat simple. Ce que vous voulez mesurer n'est pas constant, il varie dans le temps. Selon votre niveau d'exigence, vous pouvez calculer une ou plusieurs propriétés de la consommation actuelle. Ces propriétés vous aideront à mieux surveiller le système. Je vous propose 3 solutions différentes, en complexité croissante.

Solution 1: moyenne

Vous voulez obtenir un résultat à valeur unique -> obtenir la moyenne dans le temps. Comme déjà proposé par @akellyirl, utilisez un filtre passe-bas. Calculez float y = alpha*input + (1-alpha)*ypour chaque échantillon, où alphaest le facteur de lissage. Voir Wikipedia pour les détails.

Solution 2: Max + Moyenne

Vous êtes intéressant d'obtenir la moyenne et la valeur maximale. La surveillance de la valeur max pourrait être intéressante pour le dimensionnement des composants par exemple.

if (y > max)
  max = y;

Solution 3: écart type + Max + Moyenne

Pourquoi?

Voir les graphiques ci-dessous. Il y a 3 signaux de formes différentes. Un triangle , un sinus et un signal de pointe . Ils sont tous périodiques avec la même période, la même amplitude , la même moyenne et les mêmes valeurs min et max . Mais, ils ont des formes différentes, et en effet ils ont une histoire complètement différente ...

Signaux et leur histogramme

L'une des différences est l'écart type. C'est pourquoi je vous suggère d'étendre vos mesures et d'inclure l'écart type. Le problème est que la façon standard de le calculer consomme beaucoup de CPU. J'espère qu'il y a une solution.

Comment?

Utilisez la méthode de l' histogramme . Construisez un histogramme de toutes les mesures et extrayez efficacement les statistiques (min, max, moyenne, écart-type) de l'ensemble de données. L'histogramme regroupe les valeurs qui ont la même valeur ou la même plage de valeurs. L'avantage est d'éviter de stocker tous les échantillons (augmentation du nombre dans le temps), et d'avoir un calcul rapide sur un nombre limité de données.

Avant de commencer l'acquisition des mesures, créez un tableau pour stocker l'histogramme. Il s'agit d'un tableau entier à 1 dimension, de taille 32 par exemple:

int histo[32];

Selon la plage de l'ampèremètre, adaptez la fonction ci-dessous. Par exemple, si la plage est de 256mA, cela signifie que la case 0 de l'histogramme sera incrémentée d'une valeur comprise entre 0 et 8 mA, la case 1 d'une valeur comprise entre 8 et 16 mA etc ... Donc, vous aurez besoin d'un entier pour représenter le numéro de l'histogramme:

short int index;

Chaque fois que vous obtenez un échantillon, recherchez l'index de corbeille correspondant:

index = (short int) floor(yi);

Et incrémentez ce bac:

histo[index] += 1;

Pour calculer la moyenne, exécutez cette boucle:

float mean = 0;
int N = 0;
for (i=0; i < 32 ; i++) {
  mean = i * histo[i]; // sum along the histogram
  N += i; // count of samples
}
mean /= N; // divide the sum by the count of samples.
mean *= 8; // multiply by the bin width, in mA: Range of 256 mA / 32 bins = 8 mA per bin.

Pour calculer l'écart type, exécutez cette boucle:

float std_dev = 0;

for (i=0; i < 32 ; i++) {
  std_dev = (i - mean) * (i - mean) * histo[i]; // sum along the histogram
}
std_dev /= N; // divide the sum by the count of samples.
std_dev = sqrt(std_dev); // get the root mean square to finally convert the variance to standard deviation.

La stratégie de la méthode de l'histogramme consiste à effectuer les opérations lentes sur quelques nombres de casiers, au lieu de tous les échantillons de signaux acquis. Plus la taille de l'échantillon est longue, mieux c'est. Si vous voulez plus de détails, lisez cette page intéressante L'Histogramme, Pmf et Pdf .


explication très approfondie et claire. D'un point de vue pratique, comment vous assurez-vous que l'échantillonnage ADC est distribué "dans le bon sens", c'est-à-dire qu'il n'est pas verrouillé de quelque manière que ce soit avec le signal PWM? Je dois admettre qu'en ce moment, j'utilise simplement l'Arduino (hw + sw) pour l'échantillonnage PWM et ADC. Il se peut que je devrais configurer moi-même les minuteries intégrées. Je suppose que la fréquence d'échantillonnage devrait être un peu plus élevée que la fréquence PWM, n'est-ce pas?
ltj

1
Dès que vous commencez à échantillonner, les choses deviennent assez compliquées. La première chose à faire est de garder à l'esprit le théorème de Nyquist-Shannon. Ce qui est intuitif, c'est que plus la fréquence d'échantillonnage est élevée, plus vous disposez d'informations. Mais ce qui n'est pas intuitif, bien que fondamental, c'est qu'avant d'échantillonner à la fréquence Fs, il faut absolument filtrer passe-bas (dans le domaine analogique / électronique) le signal à Fs / 2. Sinon, vous serez impacté par l'aliasing. Je vous suggère de choisir la fréquence d'échantillonnage la plus élevée. Quelque chose comme ~ 10 fois la fréquence PWM si possible.
RawBean

Il s'agit d'un malentendu courant du théorème de Nyquist-Shannon qui déclare en fait que vous avez besoin d'échantillonner à deux fois la bande passante. Le crénelage peut être utile. Aucun manque de respect prévu, mais cela semble être une réponse d'un texbook. Il est excessif de suggérer un échantillonnage PWM ~ 10 fois dans ce scénario lorsque les détails à haute fréquence sont très peu pertinents.
akellyirl

1

Vous comprenez bien le problème: vous devez obtenir la "moyenne" du PWM, tout comme le compteur que vous utilisez pour les mesures.

Vous pouvez utiliser un filtre RC sur les signaux A1,2,3 dont la constante de temps est au moins dix fois votre période PWM. Cela signifie que si votre période PWM était de 10 microsecondes, la constante de temps RC devrait être de 100 microsecondes. Par exemple 10kOhms x 10nF = 100us

Une meilleure solution consiste à filtrer les signaux numériquement dans le microcontrôleur comme ceci:

float y = (1-0.99)*input + 0.99*y; 

Modifiez la valeur "0.99" pour modifier la constante de temps de ce filtre numérique.


1
Attention à l'alias si vous le faites dans le code.
Andy aka

Le crénelage n'est pas nécessairement un problème. Nous savons tous que pour reconstruire un signal, la fréquence d'échantillonnage doit être au moins deux fois la fréquence la plus élevée. Mais lorsque le signal est limité en bande, il vous suffit d'échantillonner à deux fois la bande passante . C'est ce qu'on appelle le sous-échantillonnage. Comme le signal est probablement basse fréquence car il entraîne un coussin chauffant, des taux d'échantillonnage raisonnables dans une plage de 100 à 1000 SPS devraient être corrects. Voir: ni.com/newsletter/50078/en
akellyirl

Il serait sage de s'assurer que le taux PWM et le taux d'échantillonnage sont mutuellement premiers si vous utilisez un sous-échantillonnage.
akellyirl

Précisément mes pensées - si la mesure via ADC et la génération de PWM dans le même MCU, il peut y avoir une tendance à verrouiller les deux dans le temps.
Andy aka

Le signal est à fréquence pwm, pas à basse fréquence. Si la fréquence était faible, il serait probablement moins gourmand en ressources de simplement échantillonner sur une période et en moyenne que d'utiliser les mathématiques à virgule flottante de cette façon.
Scott Seidman
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.