Mengukur arus rata-rata dengan UC dan shunt saat ini

12

Ini posting pertama saya. Saya seorang pria perangkat lunak yang mencoba melakukan perangkat keras jadi lembut :)

Sirkuit

Saya merancang sirkuit kecil (lihat gambar, dan maaf untuk skematis berantakan) yang sederhana dan sederhana adalah sekelompok driver MOSFET dan gerbang yang dirancang untuk mengalihkan beban resistif (bantalan pemanas dalam kasus ini) dari mikrokontroler. Elemen pemanas seringkali memiliki resistansi yang sangat rendah, dan untuk menjaga daya pada level yang diinginkan, MOSFET diaktifkan menggunakan PWM.

Pengukuran

Selain aspek fungsional murni, ada fokus pendidikan juga. Saya ingin mendapatkan umpan balik tentang konsumsi saat ini. Dan pendekatan naif saya adalah dengan hanya membuang beberapa IC sensor shunt saat ini. Ketika menggunakan multimeter untuk mengukur tegangan output dari sensor, saya benar-benar mendapatkan sesuatu yang terlihat seperti arus rata-rata (dengan switching PWM) karena "lambatnya" ammeter. Tetapi ketika menghubungkan output yang sama ke ADC atmega328p, saya mendapatkan beberapa bacaan buruk - kecepatan di sini menempatkan pembacaan di mana saja pada gelombang persegi PWM.

Jadi, pertanyaan saya adalah bagaimana cara mengukur arus (rata-rata) saat beralih dengan PWM?

Sepertinya desainnya OK, tapi saya mungkin telah melewatkan sesuatu baik dalam desain dan bagaimana ADC UC harus digunakan dalam konteks ini.

skema

ltj
sumber
Saya pikir filter dapat digunakan untuk memberikan tegangan rata-rata dari PWM. Artikel menarik yang menjelaskan filter tersebut dan nilai-nilai yang digunakan berdasarkan frekuensi PWM adalah artikel ini .
alexan_e
Ada beberapa jawaban terkait dalam pertanyaan ini . Tetapi mereka hanya menyebutkan menggunakan shunt dan IC untuk mengukur arus. Tidak disebutkan tentang PWM.
Ricardo
Terima kasih atas komentarnya. @alexan_e: TI menunjukkan filter input dalam datasheet INA197, tapi saya tidak yakin penggunaannya. Mungkin cara untuk pergi ketika tidak memiliki tegangan stabil.
ltj
Saya pikir itu adalah solusi untuk masalah Anda, tetapi saya lebih suka seseorang yang lebih berpengalaman dalam hal ini memberikan jawaban yang terperinci, itulah mengapa saya memposting ini sebagai komentar.
alexan_e
Karena outputnya adalah PWM cucle variabel tugas, Anda bisa menggunakan rangkaian detektor puncak dan mengukurnya dengan ADC.
Martin

Jawaban:

6

Terkadang apa yang terlihat sederhana tidak sesederhana itu. Anda memiliki pengukuran yang cukup rumit untuk dilakukan, tetapi Anda menginginkan hasil yang sederhana. Apa yang ingin Anda ukur tidak konstan, ini bervariasi dalam waktu. Bergantung pada tingkat kebutuhan Anda, Anda dapat menghitung satu atau banyak properti dari konsumsi saat ini. Properti ini akan membantu Anda memantau sistem dengan lebih baik. Saya mengusulkan Anda 3 solusi berbeda, dalam kompleksitas yang menanjak.

Solusi 1: Rata-rata

Anda ingin mendapatkan hasil satu nilai -> dapatkan rata-rata dalam waktu. Seperti yang sudah diusulkan oleh @akellyirl, gunakan filter low-pass. Hitung float y = alpha*input + (1-alpha)*yuntuk setiap sampel, di mana alphafaktor penghalusannya. Lihat Wikipedia untuk detailnya.

Solusi 2: Max + Rata-Rata

Anda menarik dalam mendapatkan rata-rata, dan nilai maksimal. Pemantauan nilai maks bisa menarik untuk dimensi komponen misalnya.

if (y > max)
  max = y;

Solusi 3: Deviasi standar + Max + Rata-rata

Mengapa?

Lihat grafik di bawah ini. Ada 3 sinyal dengan bentuk berbeda. Sebuah segitiga , sebuah sinus , dan lonjakan sinyal. Mereka semua periodik dengan periode yang sama , amplitudo yang sama , rata-rata yang sama , dan min dan maks yang sama . Tapi, mereka memiliki bentuk yang berbeda, dan memang mereka memiliki cerita yang sama sekali berbeda ...

Sinyal dan histogramnya

Salah satu perbedaannya adalah standar deviasi. Itu sebabnya saya menyarankan Anda untuk memperluas pengukuran Anda, dan termasuk deviasi standar. Masalahnya adalah bahwa cara standar untuk menghitungnya adalah mengkonsumsi CPU. Semoga ada satu solusi.

Bagaimana?

Gunakan metode histogram . Buat histogram dari semua pengukuran, dan ekstrak secara efisien statistik (min, maks, rata-rata, deviasi standar) dari dataset. Histogram mengelompokkan nilai-nilai yang memiliki nilai yang sama, atau rentang nilai yang sama. Keuntungannya adalah untuk menghindari penyimpanan semua sampel (menambah waktu dalam hitungan), dan memiliki perhitungan cepat pada sejumlah data yang terbatas.

Sebelum mulai mendapatkan pengukuran, buat array untuk menyimpan histogram. Ini adalah array integer 1 dimensi, dengan ukuran 32 misalnya:

int histo[32];

Tergantung pada kisaran ammeter, adaptasikan fungsi di bawah ini. Misalnya, jika kisaran 256mA itu berarti bahwa bin 0 dari histogram akan bertambah dengan nilai antara 0 dan 8 mA, bin 1 dengan nilai antara 8 dan 16 mA dll ... Jadi, Anda akan memerlukan integer untuk mewakili nomor bin histogram:

short int index;

Setiap kali Anda mendapatkan sampel, cari indeks tempat sampah yang sesuai:

index = (short int) floor(yi);

Dan menambahkan nampan ini:

histo[index] += 1;

Untuk menghitung rata-rata, jalankan loop ini:

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.

Untuk menghitung standar deviasi, jalankan loop ini:

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.

Strategi metode histogram adalah untuk membuat operasi lambat pada beberapa jumlah sampah, bukan semua sampel sinyal yang diperoleh. Semakin lama ukuran sampel, semakin baik. Jika Anda ingin lebih detail, baca halaman menarik ini The Histogram, Pmf dan Pdf .

RawBean
sumber
penjelasan yang sangat teliti dan jelas. Pada tingkat praktis, bagaimana Anda memastikan bahwa pengambilan sampel ADC didistribusikan "dengan cara yang baik" yaitu tidak terkunci dengan sinyal PWM dengan cara apa pun? Saya harus mengakui bahwa saat ini saya hanya menggunakan Arduino (hw + sw) untuk pengambilan sampel PWM dan ADC. Mungkin saya harus mengatur timer bawaan sendiri. Saya kira frekuensi pengambilan sampel harus sedikit lebih tinggi daripada frekuensi PWM kan?
ltj
1
Segera setelah Anda memulai pengambilan sampel, segala sesuatunya menjadi cukup rumit. Hal pertama yang harus dilakukan, yang perlu diingat adalah teorema Nyquist-Shannon. Apa yang intuitif adalah bahwa semakin tinggi frekuensi pengambilan sampel, semakin banyak informasi yang Anda miliki. Tetapi apa yang tidak intuitif, meskipun mendasar, adalah bahwa sebelum pengambilan sampel pada frekuensi Fs, Anda harus benar - benar filter low-pass (dalam domain analog / elektronik) sinyal di Fs / 2. Jika tidak, Anda akan terkena dampak aliasing. Saya sarankan Anda memilih frekuensi pengambilan sampel tertinggi. Sesuatu seperti ~ 10 kali frekuensi PWM jika memungkinkan.
RawBean
Ini adalah kesalahpahaman umum dari teorema Nyquist-Shannon yang sebenarnya menyatakan bahwa Anda perlu sampel dua kali bandwidth. Mengasingkan dapat membantu. Tidak ada rasa tidak hormat yang dimaksudkan, tetapi ini sepertinya jawaban dari buku teks. Menyarankan pengambilan sampel PWM ~ 10 kali dalam skenario ini ketika detail frekuensi tinggi kemungkinan besar tidak relevan terlalu berlebihan.
akellyirl
1

Anda memahami masalahnya dengan benar: Anda perlu mendapatkan "rata-rata" dari PWM, sama seperti meter yang Anda gunakan untuk pengukuran.

Anda dapat menggunakan filter RC pada sinyal A1,2,3 yang konstanta waktunya setidaknya sepuluh kali periode PWM Anda. Itu berarti jika periode PWM Anda adalah 10 mikrodetik maka konstanta waktu RC harus 100 mikrodetik. Misalnya 10kOhms x 10nF = 100us

Solusi yang lebih baik adalah menyaring sinyal secara digital di mikrokontroler seperti ini:

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

Ubah nilai "0,99" untuk mengubah konstanta waktu dari filter digital ini.

akellyirl
sumber
1
Watch out for aliasing jika Anda melakukannya dalam kode.
Andy alias
Mengasingkan diri belum tentu menjadi masalah. Kita semua tahu bahwa untuk merekonstruksi sinyal laju sampel harus setidaknya dua kali frekuensi tertinggi. Tetapi ketika sinyal terbatas, Anda hanya perlu sampel dua kali bandwidth . Ini disebut undersamplig. Karena sinyalnya frekuensinya rendah karena menggerakkan bantalan pemanas, maka laju sampel yang masuk akal dalam kisaran 100 hingga 1000 SPS harusnya baik-baik saja. Lihat: ni.com/newsletter/50078/en
akellyirl
Akan lebih bijak untuk memastikan tingkat PWM dan tingkat sampel sama-sama prima jika menggunakan undersampling.
akellyirl
Justru pikiran saya - jika mengukur melalui ADC dan menghasilkan PWM di MCU yang sama, mungkin ada kecenderungan untuk keduanya terkunci pada waktunya.
Andy alias
Sinyal berada pada frekuensi PWM, bukan frekuensi rendah. Jika frq rendah, mungkin sumber dayanya kurang intensif untuk hanya sampel selama satu periode dan rata-rata daripada menggunakan matematika floating point seperti itu.
Scott Seidman