Medição de corrente média com uC e derivação de corrente

12

Este é o meu primeiro post. Eu sou um cara de software tentando fazer hardware, então seja gentil :)

O circuito

Estou projetando um pequeno circuito (veja a foto e desculpe pelo esquema bagunçado) que é simples e simples um monte de MOSFETS e drivers de porta projetados para alternar cargas resistivas (placas de aquecimento, neste caso) de um microcontrolador. Os elementos de aquecimento geralmente têm uma resistência muito baixa e, para manter a energia no nível desejado, os MOSFETS são comutados usando PWM.

Medição

Além do aspecto puramente funcional, há um foco educacional também. Quero poder obter algum feedback sobre o consumo atual. E minha abordagem ingênua foi simplesmente inserir alguns ICs atuais dos sensores de derivação. Ao usar um multímetro para medir a tensão de saída do sensor, recebo algo que se parece com a corrente média (com comutação PWM) devido à "lentidão" do amperímetro. Mas ao conectar a mesma saída a um ADC atmega328p, recebo algumas leituras ruins - a velocidade aqui coloca uma leitura em qualquer lugar da onda quadrada do PWM.

Então, minha pergunta é: como faço para medir a corrente (média) ao alternar com o PWM?

Parece que o design está bom, mas eu posso ter perdido algo no design e como o uC ADC deve ser usado nesse contexto.

esquemático

ltj
fonte
Eu acho que um filtro poderia ser usado para fornecer uma tensão média do PWM. Um artigo interessante que explica esse filtro e os valores usados ​​com base na frequência PWM é este .
11284 alexan_e
Existem algumas respostas relacionadas nesta pergunta . Mas eles apenas mencionam o uso de derivações e CIs para medir a corrente. Não há menção ao PWM, no entanto.
Ricardo
Obrigado pelos comentários. @alexan_e: A TI está mostrando um filtro de entrada na folha de dados do INA197, mas não tinha certeza de seu uso. Pode ser o caminho a seguir quando não houver tensão estável.
ltj
Acho que é a solução para o seu problema, mas prefiro que alguém mais experiente forneça uma resposta detalhada, por isso publiquei isso como um comentário.
21914 Alex__e
Como a saída é PWM de compartimento variável, você pode usar um circuito detector de pico e medi-lo com um ADC.
Martin

Respostas:

6

Às vezes, o que parece simples não é assim tão simples. Você tem uma medida bastante complexa para fazer, mas deseja um resultado simples. O que você deseja medir não é constante, está variando no tempo. Dependendo do seu nível de exigência, você pode calcular uma ou várias propriedades do consumo atual. Essas propriedades ajudarão você a monitorar melhor o sistema. Eu proponho a você 3 soluções diferentes, em complexidade crescente.

Solução 1: média

Você deseja obter um resultado de um valor -> obter a média no tempo. Como já proposto por @akellyirl, use um filtro passa-baixo. Calcule float y = alpha*input + (1-alpha)*ypara cada amostra, onde alphaestá o fator de suavização. Veja a Wikipedia para detalhes.

Solução 2: Máx. + Média

Você é interessante em obter a média e o valor máximo. O monitoramento do valor máximo pode ser interessante para o dimensionamento de componentes, por exemplo.

if (y > max)
  max = y;

Solução 3: desvio padrão + máximo + médio

Por quê?

Veja os gráficos abaixo. Existem 3 sinais de diferentes formas. Um triângulo , um seno e um sinal de pico . Todos são periódicos com o mesmo período, a mesma amplitude , a mesma média e os mesmos mínimos e máximos . Mas eles têm formas diferentes e, de fato, têm uma história completamente diferente ...

Sinais e seu histograma

Uma das diferenças é o desvio padrão. Por isso, sugiro que você estenda suas medidas e inclua o desvio padrão. O problema é que a maneira padrão de computá-lo consome CPU. Felizmente, existe uma solução.

Quão?

Use o método de histograma . Crie um histograma de todas as medições e extraia com eficiência as estatísticas (mín, máx, média, desvio padrão) do conjunto de dados. O histograma agrupa valores que têm o mesmo valor ou o mesmo intervalo de valor. A vantagem é evitar o armazenamento de todas as amostras (aumento da contagem no tempo) e ter um cálculo rápido em um número limitado de dados.

Antes de começar a adquirir medições, crie uma matriz para armazenar o histograma. É uma matriz inteira de 1 dimensão, de tamanho 32, por exemplo:

int histo[32];

Dependendo da faixa do amperímetro, adapte a função abaixo. Por exemplo, se o intervalo for 256mA, significa que a posição 0 do histograma será incrementada em valores entre 0 e 8 mA, posição 1 em valores entre 8 e 16 mA etc ... Portanto, será necessário um número inteiro para representar o número da lixeira do histograma:

short int index;

Cada vez que você obtém uma amostra, encontre o índice de compartimento correspondente:

index = (short int) floor(yi);

E incremente esta lixeira:

histo[index] += 1;

Para calcular a média, execute este loop:

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 o desvio padrão, execute este loop:

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.

A estratégia do método do histograma é fazer operações lentas em um número pequeno de posições, em vez de todas as amostras de sinal adquiridas. Quanto maior o tamanho da amostra, melhor. Se você quiser mais detalhes, leia esta página interessante O Histograma, Pmf e Pdf .

RawBean
fonte
explicação muito completa e clara. Em um nível prático, como você garante que a amostragem ADC seja distribuída "de uma maneira boa", isto é, não bloqueada de alguma maneira pelo sinal PWM? Devo admitir que agora eu apenas uso o Arduino (hw + sw) para amostras PWM e ADC. Pode ser que eu próprio configure os temporizadores internos. Eu acho que a frequência de amostragem deve ser um pouco maior que a frequência PWM, certo?
ltj
1
Assim que você começa a amostrar, as coisas ficam bastante complicadas. A primeira coisa a fazer é ter em mente o teorema de Nyquist-Shannon. O que é intuitivo é que quanto maior a frequência de amostragem, mais informações você tem. Mas o que não é intuitivo, embora fundamental, é que, antes de amostrar na frequência Fs, você deve absolutamente passar o filtro passa-baixo (no domínio analógico / eletrônico) o sinal em Fs / 2. Caso contrário, você será impactado pelo alias. Eu sugiro que você escolha a maior frequência de amostragem. Algo como ~ 10 vezes a frequência PWM, se possível.
21414 RawBean
Esse é um mal-entendido comum do teorema de Nyquist-Shannon, que na verdade afirma que você precisa provar duas vezes a largura de banda. O aliasing pode ser útil. Sem desrespeito, mas isso parece uma resposta de um livro de textos. Sugerir uma amostragem de ~ 10 vezes PWM nesse cenário em que os detalhes de alta frequência provavelmente são irrelevantes é um exagero.
akellyirl
1

Você entende o problema corretamente: você precisa obter a "média" do PWM, assim como o medidor que você está usando para medições.

Você pode usar um filtro RC nos sinais A1,2,3 cuja constante de tempo é pelo menos dez vezes o seu período PWM. Isso significa que, se o seu período PWM foi de 10 microssegundos, a constante de tempo de RC deve ser de 100 microssegundos. Por exemplo 10kOhms x 10nF = 100us

Uma solução melhor é filtrar os sinais digitalmente no microcontrolador assim:

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

Altere o valor "0,99" para alterar a constante de tempo deste filtro digital.

akellyirl
fonte
1
Cuidado com o alias, se você fizer isso no código.
Andy aka
Aliasing não é necessariamente um problema. Todos sabemos que, para reconstruir um sinal, a taxa de amostragem deve ser pelo menos duas vezes a frequência mais alta. Mas quando o sinal é ilimitado em banda, você só precisa amostrar com o dobro da largura de banda . Isso é chamado de undersamplig. Como o sinal é presumivelmente baixa frequência porque está acionando uma placa de aquecimento, taxas de amostragem razoáveis ​​na faixa de 100 a 1000 SPS devem ser boas. Veja: ni.com/newsletter/50078/pt
akellyirl
Seria sensato garantir que a taxa de PWM e a taxa de amostra sejam mutuamente primárias se usar subamostragem.
akellyirl
Precisamente meus pensamentos - se medir via ADC e gerar PWM no mesmo MCU, pode haver uma tendência para que ambos fiquem travados no tempo.
Andy aka
O sinal está na frequência pwm, não na frequência baixa. Se o valor era baixo, provavelmente é menos intensivo em recursos simplesmente amostrar ao longo de um período e média do que usar a matemática de ponto flutuante dessa maneira.
Scott Seidman