UC ve akım şöntüyle ortalama akımı ölçme


12

Bu benim ilk yazım. Donanım yapmaya çalışan bir yazılımcıyım bu yüzden nazik ol :)

Devre

Küçük bir devre tasarlıyorum (resme bakın ve dağınık şematik için özür dilerim). Isıtma elemanları genellikle çok düşük bir dirence sahiptir ve gücü istenen seviyede tutmak için MOSFETS PWM kullanılarak değiştirilir.

Ölçüm

Tamamen işlevsel yönünün yanı sıra, bir eğitim odağı da var. Mevcut tüketim hakkında bir geri bildirim almak istiyorum. Ve benim saf yaklaşımım sadece mevcut şant sensörü IC'lerini atmaktı. Sensörden çıkış voltajını ölçmek için bir multimetre kullanırken, ampermetrenin "yavaşlaması" nedeniyle ortalama akıma (PWM anahtarlama ile) benzeyen bir şey alıyorum. Ancak aynı çıkışı bir atmega328p ADC'ye bağlarken, bazı kötü okumalar alıyorum - buradaki hız, PWM kare dalgasının herhangi bir yerine bir okuma koyuyor.

Peki, sorum şu: PWM ile geçiş yaparken (ortalama) akımı nasıl ölçeceğim?

Tasarım iyi görünüyor, ancak hem tasarımda hem de uC ADC'nin bu bağlamda nasıl kullanılması gerektiğine dair bir şey kaçırmış olabilirim.

şematik


Bence PWM'den ortalama voltaj vermek için bir filtre kullanılabilir. Böyle bir filtre açıklar ve değerler PWM frekans dayalı kullanılan ilginç bir makale bu bir .
alexan_e

Bu soruda ilgili bazı cevaplar var . Ancak sadece akımı ölçmek için şönt ve IC'ler kullandıklarından bahsediyorlar. Yine de PWM'den bahsedilmiyor.
Ricardo

Yorumlar için teşekkürler. @alexan_e: TI, INA197 veri sayfasında bir giriş filtresi gösteriyor, ancak kullanımından emin değildim. Kararlı gerilime sahip olmadığında gitmenin yolu olabilir.
ltj

Bence bu senin sorununun çözümü ama daha detaylı tecrübeli bir cevap bu konuda daha fazla deneyime sahip olmayı tercih ederim, bu yüzden bunu bir yorum olarak yayınladım.
alexan_e

Çıktı değişken görevli salata PWM olduğundan, bir pik dedektör devresi kullanabilir ve bunu bir ADC ile ölçebilirsiniz.
Martin

Yanıtlar:


6

Bazen basit görünen şey o kadar basit değildir. Yapmanız gereken oldukça karmaşık bir ölçümünüz var, ancak basit bir sonuç istiyorsunuz. Ölçmek istediğiniz şey sabit değil, zaman içinde değişiyor. Gereksinim seviyenize bağlı olarak, mevcut tüketimin bir veya daha fazla özelliğini hesaplayabilirsiniz. Bu özellikler sistemi daha iyi izlemenize yardımcı olur. Size artan karmaşıklıkta 3 farklı çözüm öneriyorum.

Çözüm 1: Ortalama

Tek değerli bir sonuç elde etmek istiyorsunuz -> zaman içinde ortalamayı alın. @Akellyirl tarafından önerildiği gibi, düşük geçişli bir filtre kullanın. Düzeltme faktörü float y = alpha*input + (1-alpha)*ynerede her örnek için hesaplayın alpha. Ayrıntılar için Wikipedia'ya bakın.

Çözüm 2: Maks + Ortalama

Ortalamayı ve maksimum değeri almak ilginç. Maksimum değerin izlenmesi, örneğin bileşen boyutlandırması için ilginç olabilir.

if (y > max)
  max = y;

Çözüm 3: Standart sapma + Maks + Ortalama

Neden?

Aşağıdaki tablolara bakınız. Farklı şekillerde 3 sinyal vardır. Bir üçgen , bir sinüs ve başak sinyali. Hepsi periyodik olarak aynı periyot, aynı genlik , aynı ortalama ve aynı min ve maks . Ancak, farklı şekillere sahipler ve gerçekten de tamamen farklı bir hikayeleri var ...

Sinyaller ve histogramları

Farklardan biri standart sapmadır. Bu yüzden ölçümlerinizi uzatmanızı ve standart sapmayı eklemenizi öneririm. Sorun, hesaplamanın standart yolunun CPU tüketmesidir. Umarım, tek bir çözüm vardır.

Nasıl?

Histogram yöntemini kullanın . Tüm ölçümlerin bir histogramını oluşturun ve veri kümesinin istatistiklerini (min, maks, ort, standart sapma) verimli bir şekilde çıkarın. Histogram, aynı değere veya aynı değer aralığına sahip değerleri birlikte gruplandırır. Avantajı, tüm örneklerin saklanmasını önlemek (zaman içinde artan sayı) ve sınırlı sayıda veri üzerinde hızlı bir hesaplama yapmaktır.

Ölçüm almaya başlamadan önce, histogramı saklamak için bir dizi oluşturun. 32 boyutlu 1 boyutlu bir tamsayı dizisidir, örneğin:

int histo[32];

Ampermetre aralığına bağlı olarak, aşağıdaki fonksiyona uyarlayın. Örneğin, aralık 256mA ise, histogramın 0 bölmesinin 0 ile 8 mA arasında, bin 1'in 8 ila 16 mA arasında bir değere göre artırılacağı anlamına gelir ... Yani, temsil etmek için bir tamsayıya ihtiyacınız olacaktır. histogram bölmesi numarası:

short int index;

Her örnek aldığınızda ilgili çöp kutusu dizinini bulun:

index = (short int) floor(yi);

Ve bu kutuyu artırın:

histo[index] += 1;

Ortalamayı hesaplamak için şu döngüyü çalıştırın:

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.

Standart sapmayı hesaplamak için şu döngüyü çalıştırın:

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.

Histogram yönteminin stratejisi, elde edilen tüm sinyal örnekleri yerine, birkaç sayıda kutu üzerinde yavaş işlemler yapmaktır. Numune boyutu ne kadar uzun olursa o kadar iyidir. Daha fazla ayrıntı istiyorsanız, bu ilginç sayfayı okuyun Histogram, Pmf ve Pdf .


çok ayrıntılı ve net bir açıklama. Pratik düzeyde, ADC örneklemesinin "iyi bir şekilde" dağıtılmasını, yani PWM sinyaliyle herhangi bir şekilde kilitlenmemesini nasıl sağlarsınız? Şu anda itiraf etmeliyim ki, Arduino (hw + sw) hem PWM hem de ADC örneklemesi için kullanıyorum. Yerleşik zamanlayıcıları kendim ayarlamam gerekebilir. Sanırım örnekleme frekansı PWM frekansından biraz daha yüksek olmalı?
ltj

1
Örneklemeye başlar başlamaz, işler oldukça karmaşıklaşır. Yapılması gereken ilk şey, Nyquist-Shannon teoremidir. Sezgisel olan, örnekleme frekansı ne kadar yüksek olursa, o kadar fazla bilgiye sahip olmanızdır. Ancak, sezgisel olmayan, temel olmasına rağmen, Fs frekansında örneklemeden önce , Fs / 2'deki sinyali kesinlikle düşük geçişli filtreye (analog / elektronik alanda) ihtiyacınız vardır. Aksi takdirde, takma addan etkileneceksiniz. En yüksek örnekleme frekansını seçmenizi öneririm. Mümkünse PWM frekansının ~ 10 katı gibi bir şey.
RawBean

Bu, aslında bant genişliğinin iki katında örnekleme yapmanız gerektiğini belirten Nyquist-Shannon teoreminin yaygın bir yanlış anlaşılmasıdır. Örtüşme yardımcı olabilir. Saygısızlık yok, ama bu bir kitaptan gelen bir cevap gibi görünüyor. Yüksek frekanslı ayrıntı büyük olasılıkla ilgisiz olduğunda bu senaryoda ~ 10 kat PWM örneklemesi önermek aşırı doludur.
akellyirl

1

Sorunu doğru anlıyorsunuz: tıpkı ölçümler için kullandığınız ölçüm cihazı gibi PWM'nin "ortalamasını" almanız gerekir.

Zaman sabiti PWM sürenizin en az on katı olan A1,2,3 sinyallerinde bir RC filtresi kullanabilirsiniz. Bu, PWM süreniz 10 mikrosaniyse, RC zaman sabiti 100 mikrosaniye olmalıdır. Örneğin 10kOhms x 10nF = 100us

Daha iyi bir çözüm, mikrodenetleyicideki sinyalleri dijital olarak şu şekilde filtrelemektir:

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

Bu dijital filtrenin zaman sabitini değiştirmek için "0,99" değerini değiştirin.


1
Kodda yaparsanız takma adlara dikkat edin.
Andy aka

Takma adın bir sorun olması gerekmez. Hepimiz bir sinyali yeniden oluşturmak için örnekleme hızının en yüksek frekansın en az iki katı olması gerektiğini biliyoruz. Ancak sinyal sınırsız olduğunda, yalnızca bant genişliğinin iki katında örnekleme yapmanız gerekir . Buna “underamplig” denir. Bir ısıtma yastığı kullandığından sinyal muhtemelen düşük frekans olduğundan, 100 ila 1000 SPS aralığında makul numune oranları iyi olmalıdır. Bakınız: ni.com/newsletter/50078/tr
akellyirl

PWM oranı ve örnekleme hızı, örnekleme kullanılıyorsa karşılıklı olarak birincil olduğundan emin olmak akıllıca olacaktır.
akellyirl

Tam olarak düşüncelerim - ADC üzerinden ölçüm yapıyor ve aynı MCU'da PWM üretiyorsa, her ikisinin de zamana kilitlenme eğilimi olabilir.
Andy aka

Sinyal pwm frekansında, düşük frekansta değil. Düşük frq olsaydı, bir nokta ve ortalamada örnekleme yapmak için muhtemelen daha az kaynak yoğunluğu kayan nokta matematiğini bu şekilde kullanmaktan daha azdır.
Scott Seidman
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.