Medición de corriente promedio con uC y derivación de corriente

12

Esta es mi primera publicación. Soy un tipo de software que intenta hacer hardware, así que sé gentil :)

Circuito

Estoy diseñando un pequeño circuito (ver foto, y perdón por el esquema desordenado) que es simple y simple es un montón de MOSFETS y controladores de compuerta diseñados para cambiar cargas resistivas (almohadillas térmicas en este caso) desde un microcontrolador. Los elementos calefactores a menudo tienen una resistencia muy baja, y para mantener la potencia al nivel deseado, los MOSFETS se conmutan usando PWM.

Medición

Además del aspecto puramente funcional, también hay un enfoque educativo. Quiero poder obtener algunos comentarios sobre el consumo actual. Y mi enfoque ingenuo era simplemente agregar algunos IC de sensores de derivación actuales. Cuando uso un multímetro para medir el voltaje de salida del sensor, obtengo algo que se parece a la corriente promedio (con conmutación PWM) debido a la "lentitud" del amperímetro. Pero cuando conecto la misma salida a un ADC atmega328p, obtengo algunas malas lecturas: la velocidad aquí pone una lectura en cualquier lugar de la onda cuadrada PWM.

Entonces, mi pregunta es ¿cómo hago para medir la corriente (promedio) al cambiar con PWM?

Parece que el diseño está bien, pero podría haber pasado por alto algo tanto en el diseño como en la forma en que el ADC uC debería usarse en este contexto.

esquemático

ltj
fuente
Creo que un filtro podría usarse para dar un voltaje medio del PWM. Un interesante artículo que explica filtro tal y los valores utilizados basa en la frecuencia PWM es éste .
alexan_e
Hay algunas respuestas relacionadas en esta pregunta . Pero solo mencionan el uso de derivaciones y circuitos integrados para medir la corriente. Sin embargo, no se menciona PWM.
Ricardo
Gracias por los comentarios. @alexan_e: TI muestra un filtro de entrada en la hoja de datos INA197, pero no estaba seguro de su uso. Puede ser el camino a seguir cuando no tiene un voltaje estable.
ltj
Creo que es la solución a su problema, pero prefiero que alguien con más experiencia en esto proporcione una respuesta detallada, por eso publiqué esto como un comentario.
alexan_e
Como la salida es PWM de cucle de servicio variable, puede usar un circuito detector de pico y medirlo con un ADC.
Martin

Respuestas:

6

A veces lo que parece simple no es tan simple. Tiene que realizar una medición bastante compleja, pero desea un resultado simple. Lo que quieres medir no es constante, varía en el tiempo. Dependiendo de su nivel de requerimiento, podría calcular una o varias propiedades del consumo actual. Estas propiedades lo ayudarán a monitorear mejor el sistema. Te propongo 3 soluciones diferentes, en complejidad ascendente.

Solución 1: promedio

Desea obtener un resultado de un valor -> obtenga el promedio en el tiempo. Como ya propuso @akellyirl, use un filtro de paso bajo. Calcule float y = alpha*input + (1-alpha)*ypara cada muestra, donde alphaestá el factor de suavizado. Ver Wikipedia para los detalles.

Solución 2: Max + Promedio

Es interesante obtener el promedio y el valor máximo. Monitorear el valor máximo podría ser interesante para el dimensionamiento de componentes, por ejemplo.

if (y > max)
  max = y;

Solución 3: Desviación estándar + Max + Promedio

¿Por qué?

Ver abajo los cuadros. Hay 3 señales de diferentes formas. Un triángulo , un seno y una señal de pico . Todos son periódicos con el mismo período, la misma amplitud , el mismo promedio y el mismo mínimo y máximo . Pero, tienen formas diferentes, y de hecho tienen una historia completamente diferente ...

Señales y su histograma.

Una de las diferencias es la desviación estándar. Es por eso que le sugiero que extienda sus medidas e incluya la desviación estándar. El problema es que la forma estándar de calcularlo consume mucha CPU. Con suerte, hay una solución.

¿Cómo?

Usa el método del histograma . Cree un histograma de todas las mediciones y extraiga de manera eficiente las estadísticas (mín., Máx., Promedio, desviación estándar) del conjunto de datos. El histograma agrupa valores que tienen el mismo valor o el mismo rango de valores. La ventaja es evitar almacenar todas las muestras (aumento del conteo en el tiempo) y tener un cálculo rápido en un número limitado de datos.

Antes de comenzar a adquirir mediciones, cree una matriz para almacenar el histograma. Es una matriz entera de 1 dimensión, de tamaño 32 por ejemplo:

int histo[32];

Dependiendo del rango del amperímetro, adapte la siguiente función. Por ejemplo, si el rango es de 256 mA, significa que el bin 0 del histograma se incrementará en un valor entre 0 y 8 mA, el bin 1 en un valor entre 8 y 16 mA, etc ... Entonces, necesitará un número entero para representar el número del contenedor de histograma:

short int index;

Cada vez que obtenga una muestra, busque el índice bin correspondiente:

index = (short int) floor(yi);

E incremente este bin:

histo[index] += 1;

Para calcular la media, ejecute este ciclo:

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.

Para calcular la desviación estándar, ejecute este ciclo:

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 estrategia del método del histograma es realizar operaciones lentas en un número reducido de bins, en lugar de todas las muestras de señales adquiridas. Cuanto más largo sea el tamaño de la muestra, mejor. Si desea más detalles, lea esta página interesante El histograma, Pmf y Pdf .

RawBean
fuente
Explicación muy minuciosa y clara. En un nivel práctico, ¿cómo se asegura de que el muestreo de ADC se distribuya "de una buena manera", es decir, que no esté bloqueado de ninguna manera con la señal PWM? Debo admitir que en este momento solo uso el Arduino (hw + sw) para el muestreo PWM y ADC. Es posible que yo mismo deba configurar los temporizadores integrados. Supongo que la frecuencia de muestreo debería ser bastante más alta que la frecuencia PWM ¿verdad?
ltj
1
Tan pronto como comienzas a tomar muestras, las cosas se complican bastante. Lo primero que debe hacer es tener en cuenta el teorema de Nyquist-Shannon. Lo intuitivo es que cuanto mayor es la frecuencia de muestreo, más información tiene. Pero lo que no es intuitivo, aunque fundamental, es que antes de muestrear a la frecuencia Fs, debe filtrar absolutamente el paso bajo (en el dominio analógico / electrónico) la señal en Fs / 2. De lo contrario, se verá afectado por el alias. Le sugiero que elija la frecuencia de muestreo más alta. Algo así como ~ 10 veces la frecuencia PWM si es posible.
RawBean
Este es un malentendido común del teorema de Nyquist-Shannon que en realidad establece que necesita que muestree al doble del ancho de banda. El alias puede ser útil. No hay falta de respeto, pero parece una respuesta de un libro de texto. Sugerir un muestreo PWM ~ 10 veces en este escenario cuando el detalle de alta frecuencia es probablemente irrelevante es excesivo.
akellyirl
1

Entiende el problema correctamente: necesita obtener el "promedio" de la PWM, al igual que el medidor que está utilizando para las mediciones.

Podría usar un filtro RC en las señales A1,2,3 cuya constante de tiempo es al menos diez veces su período PWM. Eso significa que si su período PWM fue de 10 microsegundos, entonces la constante de tiempo RC debería ser de 100 microsegundos. Por ejemplo 10kOhms x 10nF = 100us

Una mejor solución es filtrar las señales digitalmente en el microcontrolador de esta manera:

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

Cambie el valor "0.99" para cambiar la constante de tiempo de este filtro digital.

akellyirl
fuente
1
Tenga cuidado con los alias si lo hace en código.
Andy alias
El alias no es necesariamente un problema. Todos sabemos que para reconstruir una señal, la frecuencia de muestreo debe ser al menos el doble de la frecuencia más alta. Pero cuando la señal tiene límite de banda, solo necesita muestrear al doble del ancho de banda . Esto se llama undersamplig. Como la señal es presumiblemente de baja frecuencia porque está impulsando una almohadilla térmica, entonces las frecuencias de muestreo razonables en un rango de 100 a 1000 SPS deberían estar bien. Ver: ni.com/newsletter/50078/en
akellyirl
Sería prudente asegurarse de que la frecuencia de PWM y la frecuencia de muestreo se ceben mutuamente si se utiliza un submuestreo.
akellyirl
Precisamente mis pensamientos: si se mide a través de ADC y se genera PWM en la misma MCU, puede haber una tendencia a que ambos se bloqueen a tiempo.
Andy también conocido como
La señal está en frecuencia pwm, no baja frecuencia. Si fuera bajo frq, probablemente sea menos intensivo en recursos para simplemente muestrear durante un período y promedio que para usar las matemáticas de coma flotante de esa manera.
Scott Seidman