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

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

Circuito

Estoy diseñando un circuito pequeño (ver foto, y perdón por el esquema desordenado) que simple y llanamente 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 suelen tener una resistencia muy baja y, para mantener la potencia en el nivel deseado, los MOSFET se conmutan mediante 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 fue simplemente agregar algunos circuitos integrados de sensores de derivación actuales. Cuando uso un multímetro para medir el voltaje de salida del sensor, en realidad 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, por ejemplo, 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) cuando cambio con PWM?

Parece que el diseño está bien, pero es posible que me haya perdido algo tanto en el diseño como en cómo se debe usar el uC ADC en este contexto.

esquemático

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

Respuestas (2)

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

Solución 1: Promedio

Desea obtener un resultado de valor único -> obtener el promedio en el tiempo. Como ya propuso @akellyirl, use un filtro de paso bajo. Calcular float y = alpha*input + (1-alpha)*ypara cada muestra, donde alphaes 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é?

Consulte los gráficos a continuación. 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. Por eso te sugiero que amplíes tus medidas e incluyas la desviación estándar. El problema es que la forma estándar de calcularlo consume 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 (aumentando el conteo en el tiempo) y tener un cálculo rápido en un número limitado de datos.

Antes de comenzar a adquirir medidas, cree una matriz para almacenar el histograma. Es una matriz de enteros 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 256 mA, significa que el contenedor 0 del histograma se incrementará por un valor entre 0 y 8 mA, el contenedor 1 por un valor entre 8 y 16 mA, etc. Entonces, necesitará un número entero para representar el número de bin del histograma:

short int index;

Cada vez que obtenga una muestra, busque el índice de ubicación correspondiente:

index = (short int) floor(yi);

E incrementar este contenedor:

histo[index] += 1;

Para calcular la media, ejecute este bucle:

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 las operaciones lentas en unos pocos contenedores, en lugar de en todas las muestras de señales adquiridas. Cuanto mayor sea el tamaño de la muestra, mejor. Si quieres más detalles, lee esta interesante página El Histograma, Pmf y Pdf .

explicación muy completa y clara. En un nivel práctico, ¿cómo se asegura de que el muestreo ADC se distribuya "bien", es decir, que no esté bloqueado con la señal PWM de ninguna manera? Debo admitir que en este momento solo uso el Arduino (hw + sw) para el muestreo de PWM y ADC. Puede ser que deba configurar los temporizadores incorporados yo mismo. Supongo que la frecuencia de muestreo debería ser un poco más alta que la frecuencia PWM, ¿verdad?
Tan pronto como comienzas a muestrear, las cosas se complican bastante. Lo primero que hay que hacer es tener en cuenta el teorema de Nyquist-Shannon. Lo que es intuitivo es que cuanto mayor sea la frecuencia de muestreo, más información tendrá. Pero lo que no es intuitivo, aunque fundamental, es que antes de muestrear en la frecuencia Fs, debe filtrar absolutamente en 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.
Este es un malentendido común del teorema de Nyquist-Shannon que en realidad establece que necesita muestrear al doble del ancho de banda. Los alias pueden ser útiles. Sin intención de faltar al respeto, pero esto parece una respuesta de un libro de texto. Sugerir un muestreo PWM de ~10 veces en este escenario cuando los detalles de alta frecuencia probablemente sean irrelevantes es una exageración.

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

Podría usar un filtro RC en las señales A1,2,3 cuya constante de tiempo sea 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.

Tenga cuidado con los alias si lo hace en código.
El aliasing 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 un límite de banda, solo necesita muestrear al doble del ancho de banda . Esto se llama submuestreo. Como la señal es presumiblemente de baja frecuencia porque está impulsando una almohadilla térmica, entonces las frecuencias de muestreo razonables en el rango de 100 a 1000 SPS deberían estar bien. Ver: ni.com/newsletter/50078/en
Sería prudente asegurarse de que la frecuencia de PWM y la frecuencia de muestreo sean mutuamente principales si se utiliza submuestreo.
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 en el tiempo.
La señal es de frecuencia pwm, no de baja frecuencia. Si fuera una frecuencia baja, probablemente sea menos intensivo en recursos simplemente muestrear durante un período y promediar que usar matemáticas de coma flotante de esa manera.
Tal como lo veo, la señal está modulada en baja frecuencia en una portadora PWM. La señal actual podría tener un contenido de alta frecuencia que debe conservarse. Pero eso no se parece a esta situación de la descripción.
Gracias a todos. Jugaré un poco con el filtro de software y veré adónde me lleva. @akellyirl, si lo entiendo correctamente, sugiere (si se eligió el filtro RC de hardware) un filtro en la salida del sensor. ¿Pero la hoja de datos dice que sería mejor ponerlo en la entrada? Además, ¿podría explicar por qué es mejor un filtro SW? Gracias.
Poner el filtro en la entrada es complicado por la baja impedancia de entrada del INA197, lo que provoca compensaciones que debe tener cuidado de reducir (como se describe en la hoja de datos). Poner el RC en la salida es más sencillo. Pierde la ventaja de la impedancia de salida muy baja del INA197 (que es bueno para impulsar cargas), pero la hoja de datos de Atemga328P dice "El ADC está optimizado para señales analógicas con una impedancia de salida de aproximadamente 10 kΩ o menos. Si tal se utiliza la fuente, el tiempo de muestreo será insignificante". Entonces, usar una resistencia de 1kΩ debería estar bien. El filtro de excavación no requiere componentes.