Midiendo la corriente promedio con uC y shunt actual

12

Este es mi primer post. Soy un tipo de software que intenta hacer hardware, así que sé amable :)

Circuito

Estoy diseñando un pequeño circuito (ver foto, y perdón por el desordenado esquema) que simple y simple es un montón de MOSFETS y controladores de compuerta diseñados para cambiar cargas resistivas (almohadillas de calefacción en este caso) desde un microcontrolador. Los elementos de calentamiento a menudo tienen una resistencia muy baja y, para mantener la potencia en el nivel deseado, los MOSFETS se conmutan utilizando 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 lanzar algunos sensores IC de derivación actuales. Cuando utilizo un multímetro para medir la tensión de salida del sensor, en realidad obtengo algo que se parece a la corriente promedio (con conmutación de PWM) debido a la "lentitud" del amperímetro. Pero cuando conecto la misma salida a, por ejemplo, un ADC atmega328p, obtengo algunas lecturas erróneas: la velocidad aquí pone una lectura en cualquier lugar en 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 es posible que me haya pasado algo por alto tanto en el diseño como en el uso del ADC de Estados Unidos en este contexto.

    
pregunta ltj

2 respuestas

6

A veces lo que parece simple no es tan simple. Tienes una medida bastante compleja que hacer, pero quieres 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 le ayudarán a controlar mejor el sistema. Te propongo 3 soluciones diferentes, en complejidad ascendente.

Solución 1: Promedio

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

Solución 2: Máx + Promedio

Estás interesado en obtener el promedio y el valor máximo. La supervisión del 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 + Máx + Promedio

¿Por qué?

Ver abajo las tablas. Hay 3 señales de diferentes formas. Un triángulo , un seno y una espiga . Todos son periódicos con el mismo período, la misma amplitud , la misma media y la misma min y max . Pero tienen formas diferentes y, de hecho, tienen una historia completamente diferente ...

Unadelasdiferenciasesladesviaciónestándar.Poresolesugieroqueamplíesusmedicioneseincluyaladesviaciónestándar.ElproblemaesquelaformaestándardecomputarloesconsumirCPU.Consuerte,hayunasolución.

¿Cómo?

Utiliceelmétodohistograma.Creeunhistogramadetodaslasmedicionesyextraigademaneraeficientelasestadísticas(mín,máx,promedio,desviaciónestándar)delconjuntodedatos.Elhistogramaagrupalosvaloresquetienenelmismovaloroelmismorangodevalores.Laventajaesevitaralmacenartodaslasmuestras(aumentandoelrecuentoeneltiempo)yteneruncálculorápidoenunnúmerolimitadodedatos.

Antesdecomenzaraadquirirmediciones,creeunamatrizparaalmacenarelhistograma.Esunamatrizdeenterosde1dimensión,detamaño32porejemplo:

inthisto[32];

Dependiendodelrangodelamperímetro,adaptelasiguientefunción.Porejemplo,sielrangoesde256mA,significaqueelintervalo0delhistogramaseincrementaráenunvalorentre0y8mA,elintervalo1enunvalorentre8y16mA,etc.Entonces,necesitaráunenteropararepresentarelnúmerodelabandejadelhistograma:

shortintindex;

Cadavezqueobtengaunamuestra,encuentreelíndicedelabandejacorrespondiente:

index=(shortint)floor(yi);

Eincrementaestabandeja:

histo[index]+=1;

Paracalcularlamedia,ejecuteestebucle:

floatmean=0;intN=0;for(i=0;i<32;i++){mean=i*histo[i];//sumalongthehistogramN+=i;//countofsamples}mean/=N;//dividethesumbythecountofsamples.mean*=8;//multiplybythebinwidth,inmA:Rangeof256mA/32bins=8mAperbin.

Paracalcularladesviaciónestándar,ejecuteestebucle:

floatstd_dev=0;for(i=0;i<32;i++){std_dev=(i-mean)*(i-mean)*histo[i];//sumalongthehistogram}std_dev/=N;//dividethesumbythecountofsamples.std_dev=sqrt(std_dev);//gettherootmeansquaretofinallyconvertthevariancetostandarddeviation.

Laestrategiadelmétododehistogramaeshacerlasoperacioneslentasenunnúmeroreducidodecontenedores,enlugardetodaslasmuestrasdeseñalesadquiridas.Cuantomáslargoseaeltamañodelamuestra,mejor.Sideseamásdetalles,leaestainteresantepágina The Histogram, Pmf and Pdf .

    
respondido por el RawBean
1

Comprende el problema correctamente: debe 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 de 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 digitalmente las señales 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.

    
respondido por el akellyirl

Lea otras preguntas en las etiquetas