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.
Réponses:
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)*y
pour chaque échantillon, oùalpha
est 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.
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 ...
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:
Pour calculer l'écart type, exécutez cette boucle:
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 .
la source
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:
Modifiez la valeur "0.99" pour modifier la constante de temps de ce filtre numérique.
la source