Misurazione della corrente media con uC e shunt di corrente


12

Questo è il mio primo post. Sono un ragazzo software che cerca di fare hardware, quindi sii gentile :)

Circuito

Sto progettando un piccolo circuito (vedi foto, e scusa per lo schema disordinato) che è semplice ed è semplicemente un gruppo di MOSFET e driver di gate progettati per commutare carichi resistivi (pad di riscaldamento in questo caso) da un microcontrollore. Gli elementi riscaldanti hanno spesso una resistenza molto bassa e per mantenere la potenza al livello desiderato, i MOSFET vengono commutati tramite PWM.

misurazione

Oltre all'aspetto puramente funzionale, c'è anche un focus educativo. Voglio essere in grado di ottenere un feedback sul consumo attuale. E il mio approccio ingenuo era semplicemente quello di aggiungere alcuni circuiti integrati di sensori di shunt attuali. Quando uso un multimetro per misurare la tensione di uscita dal sensore, in realtà ottengo qualcosa che assomiglia alla corrente media (con commutazione PWM) a causa della "lentezza" dell'amperometro. Ma quando si collega la stessa uscita ad esempio un ADC atmega328p, ottengo delle letture errate: la velocità qui mette una lettura ovunque sull'onda quadra PWM.

Quindi, la mia domanda è: come posso misurare la corrente (media) quando si passa con PWM?

Sembra che il design sia OK, ma potrei essermi perso qualcosa sia nel design che nel modo in cui l'UC ADC dovrebbe essere usato in questo contesto.

schematico


Penso che un filtro potrebbe essere usato per fornire una tensione media dal PWM. Un articolo interessante che spiega tale filtro e i valori utilizzati in base alla frequenza PWM è questo .
alexan_e,

Ci sono alcune risposte correlate in questa domanda . Ma menzionano solo l'uso di shunt e circuiti integrati per misurare la corrente. Tuttavia, non si parla di PWM.
Ricardo,

Grazie per i commenti @alexan_e: TI mostra un filtro di input nel foglio dati INA197, ma non ero sicuro del suo utilizzo. Potrebbe essere la strada da percorrere quando non si ha una tensione stabile.
LTJ

Penso che sia la soluzione al tuo problema, ma preferirei che qualcuno avesse più esperienze su questo fornire una risposta dettagliata, ecco perché l'ho pubblicato come commento.
alexan_e,

Poiché l'uscita è PWM cucle a servizio variabile, è possibile utilizzare un circuito rivelatore di picco e misurarlo con un ADC.
Martin,

Risposte:


6

A volte ciò che sembra semplice non è così semplice. Hai una misurazione abbastanza complessa da fare, ma vuoi un risultato semplice. Quello che vuoi misurare non è costante, varia nel tempo. A seconda del livello del requisito, è possibile calcolare una o più proprietà del consumo corrente. Queste proprietà ti aiuteranno a monitorare meglio il sistema. Ti propongo 3 diverse soluzioni, in crescente complessità.

Soluzione 1: media

Vuoi ottenere un risultato di un valore -> ottenere la media nel tempo. Come già proposto da @akellyirl, utilizzare un filtro passa-basso. Calcola float y = alpha*input + (1-alpha)*yper ogni campione, dove si alphatrova il fattore di livellamento. Vedi Wikipedia per i dettagli.

Soluzione 2: massimo + medio

Sei interessante ottenere la media e il valore massimo. Il monitoraggio del valore massimo potrebbe essere interessante, ad esempio, per il dimensionamento dei componenti.

if (y > max)
  max = y;

Soluzione 3: deviazione standard + max + media

Perché?

Vedi sotto i grafici. Ci sono 3 segnali di forme diverse. Un triangolo , un seno e un segnale di punta . Sono tutti periodici con lo stesso periodo, stessa ampiezza , stessa media e stesso min e max . Ma hanno forme diverse e in effetti hanno una storia completamente diversa ...

Segnali e loro istogramma

Una delle differenze è la deviazione standard. Ecco perché ti suggerisco di estendere le tue misure e di includere la deviazione standard. Il problema è che il modo standard per calcolarlo richiede l'utilizzo della CPU. Speriamo che ci sia una soluzione.

Come?

Usa il metodo dell'istogramma . Crea un istogramma di tutte le misurazioni ed estrai in modo efficiente le statistiche (min, max, media, deviazione standard) del set di dati. L'istogramma raggruppa valori che hanno lo stesso valore o lo stesso intervallo di valori. Il vantaggio è quello di evitare di memorizzare tutti i campioni (aumentando il conteggio nel tempo) e di avere un rapido calcolo su un numero limitato di dati.

Prima di iniziare l'acquisizione delle misurazioni, creare un array per memorizzare l'istogramma. È un array intero a 1 dimensione, ad esempio di dimensione 32 :

int histo[32];

A seconda della gamma dell'amperometro, adattare la funzione di seguito. Ad esempio, se l'intervallo è 256 mA significa che il cestino 0 dell'istogramma verrà incrementato di un valore compreso tra 0 e 8 mA, il contenitore 1 di valore compreso tra 8 e 16 mA ecc ... Quindi, sarà necessario un numero intero per rappresentare il numero del cestino dell'istogramma:

short int index;

Ogni volta che ottieni un campione, trova l'indice bin corrispondente:

index = (short int) floor(yi);

E incrementa questo cestino:

histo[index] += 1;

Per calcolare la media, esegui questo 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.

Per calcolare la deviazione standard, eseguire questo 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 strategia del metodo dell'istogramma è di eseguire le operazioni lente su un numero limitato di bin, anziché su tutti i campioni di segnale acquisiti. Maggiore è la dimensione del campione, meglio è. Se vuoi maggiori dettagli, leggi questa interessante pagina L'istogramma, Pmf e Pdf .


spiegazione molto accurata e chiara. A livello pratico, come si fa a garantire che il campionamento ADC sia distribuito "in modo positivo", ovvero non bloccato in alcun modo con il segnale PWM? Devo ammettere che in questo momento utilizzo Arduino (hw + sw) sia per il campionamento PWM che ADC. Potrebbe essere che dovrei configurare da solo i timer integrati. Immagino che la frequenza di campionamento dovrebbe essere un po 'più alta della frequenza PWM, giusto?
LTJ

1
Non appena inizi a campionare, le cose diventano piuttosto complicate. La prima cosa da fare è ricordare il teorema di Nyquist-Shannon. Ciò che è intuitivo è che maggiore è la frequenza di campionamento, più informazioni hai. Ma ciò che non è intuitivo, sebbene fondamentale, è che prima di campionare a frequenza Fs, è necessario filtrare assolutamente il filtro passa basso (nel dominio analogico / elettronico) il segnale a Fs / 2. Altrimenti, sarai influenzato dall'aliasing. Ti suggerisco di scegliere la frequenza di campionamento più alta. Qualcosa come ~ 10 volte la frequenza PWM, se possibile.
RawBean,

Questo è un malinteso comune sul teorema di Nyquist-Shannon che afferma in realtà che hai bisogno di campionare al doppio della larghezza di banda. L'aliasing può essere utile. Nessuna mancanza di rispetto, ma questa sembra una risposta da un libro di testo. Suggerire un campionamento PWM ~ 10 volte in questo scenario quando i dettagli ad alta frequenza è molto probabilmente irrilevante è eccessivo.
Akellyirl,

1

Comprendi correttamente il problema: devi ottenere la "media" del PWM, proprio come il misuratore che stai utilizzando per le misurazioni.

È possibile utilizzare un filtro RC sui segnali A1,2,3 la cui costante di tempo è almeno dieci volte il periodo PWM. Ciò significa che se il periodo PWM era di 10 microsecondi, la costante di tempo RC dovrebbe essere di 100 microsecondi. Ad esempio 10kOhms x 10nF = 100us

Una soluzione migliore è quella di filtrare i segnali in modo digitale nel microcontrollore in questo modo:

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

Modificare il valore "0,99" per modificare la costante di tempo di questo filtro digitale.


1
Fai attenzione alias se lo fai nel codice.
Andy alias il

L'aliasing non è necessariamente un problema. Sappiamo tutti che per ricostruire un segnale la frequenza di campionamento deve essere almeno il doppio della frequenza più alta. Ma quando il segnale è illimitato, devi solo campionare al doppio della larghezza di banda . Questo si chiama undersamplig. Dato che il segnale è presumibilmente a bassa frequenza perché sta guidando un pad riscaldante, allora le frequenze di campionamento ragionevoli nell'intervallo 100-1000 SPS dovrebbero andare bene. Vedi: ni.com/newsletter/50078/en
akellyirl,

Sarebbe saggio assicurarsi che la frequenza PWM e la frequenza di campionamento siano reciprocamente prime se si utilizza il sottocampionamento.
Akellyirl,

Precisamente i miei pensieri: se si misura tramite ADC e si genera PWM nella stessa MCU, potrebbe esserci una tendenza a bloccare entrambi in tempo.
Andy aka

Il segnale è alla frequenza pwm, non a bassa frequenza. Se fosse basso, è probabilmente meno dispendioso in termini di risorse semplicemente campionare su un periodo e in media piuttosto che usare la matematica in virgola mobile in quel modo.
Scott Seidman,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.