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


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 .


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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.