Esta es mi primera publicación. Soy un tipo de software que intenta hacer hardware, así que sé amable :)
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.
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.
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.
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)*y
para cada muestra, donde alpha
es el factor de suavizado. Ver Wikipedia para los detalles.
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;
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...
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.
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 .
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.
alexan_e
ricardo
ltj
alexan_e
Martín