Kami mengontrol generator atau perang melawan ADC di STM32F030

Entah bagaimana itu secara historis tidak berhasil bagi saya dengan keluarga STM32F030, sekitar 5 tahun yang lalu saya mencoba untuk bekerja dengan mereka dan untuk waktu yang lama terkejut dengan pekerjaan canggung dari sebagian besar perangkat, dan kemudian mencetak gol pada mereka. Dan di hari lain, saya masih harus kembali ke seri ini, itu perlu untuk mengukur uang minimum tegangan konstan pada baterai timbal (atau perakitan hingga 4 buah dalam seri) dari 8 hingga 60V dengan akurasi tidak lebih buruk dari Β± 0,1V dengan frekuensi polling rendah.

Solusi dari masalah "head-on" memungkinkan untuk mengukur tegangan secara akurat hanya ketika nilai input ADC lebih dari 1,5 ... 1,6V, yaitu, hanya di paruh kedua kisaran, yang berarti 30 ... 60V untuk saya alih-alih yang diperlukan 8 .. .60V. Masalah utama adalah di kisaran 0 ... 1.6V, semuanya tampak seperti pembagi tegangan saya "mengambang" atau tegangan referensi untuk ADC (V ref ) sangat tidak stabil.

Itu perlu untuk segera memecahkan masalah, meskipun tidak dengan cara yang paling elegan, tetapi setidaknya tanpa tongkat penyangga yang jelas. Untuk melakukan ini, pertama-tama perlu mempelajari masalah dan memahami dari mana "kaki tumbuh" dari, dan kemudian menghilangkan masalah ini. Jika tidak berhasil, maka setidaknya lakukan untuk akhirnya mendapatkan perangkat yang berfungsi dan mengirimkannya ke pelanggan.



Esensi dari tugas


Secara umum, saya sudah berusaha untuk tidak menangani hal sepele seperti itu untuk waktu yang lama, tetapi kemudian seorang kerabat mendekati saya, dan paruh waktu seorang yang baik yang juga bekerja pada topik yang dekat dengan saya - ia mengumpulkan SES kecil di suatu tempat di Wilayah Moskow. Saya tidak ingin menolak, dan bahkan pada saat itu tugas ini tampak bagi saya "beberapa jam besi + beberapa jam kode". Proyek Altium Designer benar-benar memakan waktu beberapa jam, tetapi perjuangan melawan ADC memakan waktu sepanjang malam, jadi saya memutuskan untuk berbagi informasi sehingga orang lain tidak akan membuang waktu.

Perangkat itu sendiri sangat sederhana, algoritmanya adalah sebagai berikut:

  • mengukur tegangan pada perakitan 1 ... 4 baterai timbal yang terhubung seri;
  • jika tegangannya kurang dari "ambang batas bawah", maka tutup relai dan nyalakan generator, yang mengisi daya baterai kita;
  • jika tegangan naik di atas "ambang batas bawah + histeresis", yaitu, baterai dibebankan ke ambang batas yang ditetapkan, kemudian matikan generator;
  • jika tegangan di atas "ambang batas atas", maka kami melarang menyalakan generator untuk berjaga-jaga.

Itu saja! Contoh: ada satu baterai 12V dan inverter diaktifkan dari itu. Jika tegangan turun di bawah "ambang batas bawah", standarnya adalah 10.2V, kemudian nyalakan generator. Jika tegangan pada baterai meningkat menjadi "ambang batas bawah + histeresis", maka matikan. Secara default, histeresis diatur ke 2V dan diperlukan agar generator bensin tidak berkurang segera setelah sedikit mengisi baterai ke 10.3V. Dari konstan on / off, generator hanya akan mati. Nah, untuk jaga-jaga, perlindungan: jika tegangan pada baterai di atas 14.4V, maka jangan nyalakan generator dengan tepat.

Algoritma ini sederhana dan mudah, selain itu, perlu membuat menu kecil sehingga tiga variabel dapat diubah: "batas bawah", "histeresis", "batas atas". Tidak ada yang rumit, tetapi iblis ada dalam rinciannya.

Awalnya, perusahaan tempat kerabat bekerja menggunakan perangkat China dengan fungsi serupa. Dari kekurangan kecil - tidak mungkin untuk mengubah histeresis, karena daya membutuhkan sumber tambahan 5V dan pengukuran hanya 30V, yaitu, untuk 1 atau 2 baterai. Dari minus besar - perangkat Cina kadang membeku dan reboot pada saat dimulainya generator bensin yang dikendalikannya. "Fitur" terakhir hanya menjadi alasan bagi upaya untuk mengabaikan keputusan Tiongkok.

Mereka ingin menghilangkan semua kerugian ini dari saya dan harga perangkat itu seperti orang Cina, yaitu $ 10. "Iblis trifle" dalam kasus ini adalah bahwa mereka ingin membeli perangkat jadi dari saya untuk $ 10 dalam batch hanya 20-30 keping, meskipun itu stabil dan cukup sering. Artinya, saya harus membuat perangkat jauh lebih baik dan jauh lebih murah daripada Cina dalam seri kecil, saya juga perlu mendapatkan uang di masa depan. Ya, saya juga lucu dalam 10 menit pertama, tetapi pada saat saya menyadari situasi ini, saya sudah mengatakan "YA", yaitu, tidak ada tanah di luar Volga untuk saya ...

Memecahkan Masalah Besi


Seperti yang saya tulis di atas, masalah utama adalah pengoperasian perangkat yang tidak stabil pada awal generator. Akibatnya, perangkat China dengan aliexpress dibeli untuk pengujian dan penelitian. Alasan utama untuk "pembongkaran kepala" bukan di generator, tetapi di relay :)) Pada saat beralih catu daya, sebuah pulsa dengan amplitudo sekitar 25V melewati bus 3.3V, yang mengisyaratkan ... Gangguan juga pergi ke sirkuit sinyal. Di sirkuit Cina, untuk mengatasi masalah seperti itu, dioda LL4148 berdiri, yang jenisnya memblokir jalur gangguan. Ini ternyata cukup bagi perangkat untuk bekerja secara normal di atas meja, tetapi tidak dalam tumpukan gangguan tambahan eksternal seperti generator dan peralatan lainnya. Untuk secara permanen menghilangkan yang dijelaskan di atas, saya memutuskan untuk menggunakan isolasi galvanik melalui sekelompok "optocoupler + dc / dc", yang sepenuhnya menghilangkan kontak listrik dan jalur gangguan antara koil relay kontrol dan seluruh rangkaian.



Alternatif untuk solusi ini adalah penggunaan dioda TVS pelindung bersama dengan choke mode-umum, serta komplikasi dari filter catu daya. Tapi mengapa pertanian kolektif seperti itu? Menempatkan dc / dc lebih mudah, tetapi dalam praktiknya ternyata lebih murah - modul Cina Mornsun B0505S-1WR2 berharga saya $ 0,4 dengan biaya mode-tersedak umum per batch kecil sekitar $ 0,32.

Akibatnya, setelah pengambilan keputusan dan pengujian prototipe, perangkat mulai bekerja sebagai senapan serbu Kalashnikov dan masalah dengan reboot telah hilang. Secara umum, saya sedikit terkejut bahwa relay + sedikit generator masih terpaksa me-reboot stm-ku, para pengembang Cina, pada prinsipnya, melakukan semuanya dengan baik: 10 kOhm + 0,1 uF untuk mengatur ulang, memblokir kapasitor untuk daya, ferit, semuanya, tetapi ternyata tetap sama tidak cukup.

Kekurangan kedua dari "Cina" adalah perlunya daya tambahan, tampaknya disimpan pada dc / dc. Saya memecahkan masalah di dahi - saya mengambil daya dari sinyal input, langsung dari satu konektor. Untuk melakukan ini, Anda hanya perlu meletakkan dc / dc, yang akan mencerna setidaknya 4 * 14.4V, yaitu 57.6V. Pilihan saya jatuh pada LMR16010PDDAR. Pertama, ini adalah Texas dan hanya itu. Kedua, kawan-kawan Asia menyarankan agar saya membawa chip ini dengan sangat murah.

Paragraf sebelumnya secara komprehensif memutuskan minus ketiga - kemampuan untuk menghubungkan hingga 4 baterai secara seri. DC / DC dengan mudah mencerna 60V, mulai mencoba untuk membakar hanya pada 72 ... 73V, jadi 57.6V maksimum jelas tidak menakutkan baginya. Pembagi tegangan secara umum tidak peduli berapa banyak yang di input, jadi semuanya diputuskan dengan upaya minimal.

Anda dapat melihat bagaimana semua ini diimplementasikan dalam diagram di sini - PDF . Skema ini cukup besar, jadi saya tidak mengisinya dengan gambar. Ngomong-ngomong, dalam pdf Anda juga bisa melihat dimensi dengan papan sirkuit tercetak, tetapi tidak ada yang supernatural.

Akibatnya, komponen untuk 10 perangkat dipesan untuk batch pengujian pertama, dan setelah perakitan ternyata seperti ini:



Itu bukan tanpa insiden - ketika saya membuat komponen untuk modul dc / dc saya mencampur kaki 1 dan 2 di beberapa tempat, saya harus mengambil pertanian kecil. Meskipun saya melakukannya lebih hati-hati pada papan berikutnya sehingga tidak ada yang memperhatikan, papan di foto tetap dengan saya sebagai alat debugging untuk berjaga-jaga atau untuk perbaikan perangkat lunak jika pelanggan datang dengan sesuatu selama pengujian.

Memerangi akurasi ADC


Sekarang mari kita beralih ke bagian utama artikel. Seperti yang saya tulis di awal artikel, ADC F030 ternyata tidak akurat, yaitu, hingga tegangan 30 ... 32V pada input perangkat, bacaan melayang dengan penyimpangan hingga 15 ... 20%, dan kemudian kesalahan berangsur-angsur hilang. Satu hal yang menyenangkan saya - pada pandangan pertama, penyimpangan memiliki beberapa keteraturan, yang berarti bahwa ini bukan kesalahan acak dan Anda dapat melacaknya dan mencoba memperbaikinya.

Mari kita sedikit lebih detail tentang kesalahan ... Setelah konversi, ADC mengirimkan data mentah ke register DR , yang berisi nilai dari 0 hingga 4095 (2 12 ). Untuk mengonversi nilai ini ke tegangan, Anda perlu mengalikannya dengan langkah kuantisasi. Dalam kasus saya, tegangan pada pin VDDA, dari mana ADC mengambil dukungan, adalah 3.3072V dan, karenanya, langkahnya adalah 3.3072V / 4096 = 0,000807V, saya membulatkannya menjadi 0,0008. Untuk mendapatkan tegangan pada input perangkat, tegangan yang diperoleh perlu dikalikan dengan koefisien pembagi tegangan, dalam kasus saya resistor di lengan atas adalah 100 kOhm, dan di lengan bawah 4,7 kOhm, yang memberikan pembagi 22,2765. Berdasarkan ini, tegangan pada input perangkat, yaitu tegangan baterai, ditemukan menggunakan rumus:

float voltageReference = 0.0008; float voltageDivider = 22.2765; adcVoltageResult = (float)adcData * voltageReference * voltageDivider; 

Ternyata setelah membaca data ADC1-> DR , mereka dikonversi ke tipe float dan hanya dikalikan dengan koefisien, yang merupakan konstanta, dan kami mendapatkan hasilnya dalam volt yang biasa. Dalam praktiknya, ternyata semuanya sangat buruk dengan akurasi.

Teringat pisau cukur Hanlon, saya mulai mencari tempat di mana saya melakukan kesalahan. Pertama saya memeriksa tegangan pada kaki VDDA, saya pikir itu entah bagaimana mengapung dan tergantung pada tegangan input, misalnya, LDO rusak. Berbekal multimeter desktop, ia memantau voltase pada VDDA dan mengubah voltase input dari 8 menjadi 60V, sementara voltase pada kaki VDDA tetap mati pada 3.3072V, hanya 2 tanda berikut yang melayang, yang sangat bagus untuk pengukur linier 10 sen.

Tempat berikutnya untuk kesalahan potensial adalah pembagi tegangan. Meskipun tampak aneh bagi saya bahwa resistor dari Bourns adalah Β± 0,1% mengambang sehingga data memiliki kesalahan hingga 20% dan kesalahan ini tidak linier. Saya melakukan percobaan yang sama: Saya mengukur tegangan setelah pembagi dengan multimeter, dan mengubah tegangan input dalam langkah-langkah 0,5V, dan sebagai hasilnya, koefisien pembagi juga erat diperbaiki pada 22,2768.

Pada saat itu, mulai menjadi menarik. Hanya ada satu komponen yang bisa saya ragukan - penguat operasional LMV611MFX. Op amp ini termasuk sebagai pengikut tegangan. Tegangan SEBELUM dan SETELAH itu sama hingga 4 tempat desimal. Aneh ... Berdasarkan lembar data, itu tidak buruk dan TI yang sama, ia ragu, tetapi memutuskan untuk memeriksanya, karena opamp ini tidak pernah digunakan. Untuk jaga-jaga, favorit saya dan diuji di tumpukan proyek OPA320, yang saya miliki di gulungan, disolder di tempatnya dan dia menunjukkan hasil yang sama.

Komponen terakhir tetap - MK, yaitu ADC-nya. Selama bertahun-tahun menggunakan STM, saya terbiasa mempercayai produk mereka, terutama karena saya hanya mengambil aslinya, jadi saya pikir di MK terakhir. Hal pertama yang saya pikirkan adalah saya lupa untuk mengkalibrasi atau melakukan kesalahan. Berguna dalam manual referensi, mereka menuntut tidak hanya untuk mengurangi ADC dengan menulis nol ke bit ADEN , tetapi juga untuk menetapkan 1 ke bit ADDIS dan 0 ke bit DMAEN . 2 langkah terakhir belum diambil, biasanya saya mengurangi ADC dan semuanya bekerja dengan baik, sebagai hasilnya, saya memperbaiki sepotong kode dengan kalibrasi:

  /* disable ADC */ if (ADC1->CR & ADC_CR_ADEN) { ADC1->CR |= ADC_CR_ADDIS; while (ADC1->CR & ADC_CR_ADEN) {} } /* calibrate ADC */ ADC1->CR |= ADC_CR_ADCAL; while(ADC1->CR & ADC_CR_ADCAL) {} /* reset configuration */ ADC1->CFGR2 = 0; /* enable device */ ADC1->CR = ADC_CR_ADEN; while(!(ADC1->ISR & ADC_ISR_ADRDY)); 

Sayangnya, itu tidak membantu dan memutuskan untuk melakukan percobaan berikut ... Saya sudah memeriksa koefisien dan mereka 100% benar, jadi saya akan menerapkan tegangan dari catu daya laboratorium ke input, mengubahnya dan menampilkan hasil mentah pengukuran ADC pada indikator tujuh segmen, dan kemudian membandingkannya dengan apa yang seharusnya berada di sana dengan apa yang benar-benar Anda ukur. Sebagai hasilnya, saya menerima hasil berikut:



Seperti yang Anda lihat, grafik teoretis memiliki linearitas yang sangat baik, karena tidak melekat pada besi. Grafik berdasarkan data nyata juga hampir linier dengan penyimpangan minimal. Bahkan, grafik dengan data nyata dapat dikombinasikan dengan grafik teoretis dengan transfer paralel ke suatu konstanta tertentu. Berbicara dalam bahasa elektronik, ADC memiliki offset!

Menurut data di mana grafik dibangun, saya menemukan bahwa ADC memiliki offset pada titik yang berbeda dari 71 ... 73 langkah. Itulah masalahnya, dan saya pikir "non-linearitas" karena pergeseran 71 langkah pada 10V adalah sekitar 14%, dan pada 30V sudah 4%. Yaitu, jika Anda membuat grafik penyimpangan dalam%, maka ketergantungan akan memiliki bentuk eksponensial, tetapi grafik seperti itu tidak menarik.

Diputuskan untuk mengklarifikasi hasil, cobalah untuk memperkenalkan variabel lain ke dalam rumus, yang akan menggeser nilai saya ke atas dan memiliki formulir berikut:

 uint16_t offsetVoltage = 72; float voltageReference = 0.0008; float voltageDivider = 22.2765; adcVoltageResult = ((float)(adcData+offsetVoltage))*voltageReference*voltageDivider; 

Setelah manipulasi sederhana ini, perangkat saya mulai mengukur tegangan secara akurat dan data berhenti mengambang. Sampai saat itu, ia berbohong pada 72 * 0,0008V * 22,2768 = 1,28V , yang sangat penting dalam hal kontrol satu baterai. Baterai timbal jelas tidak meledak seperti Li-ion, tetapi masih rusak dengan cepat, terutama jika baterai habis secara terus-menerus bukan ke 10.2V, tetapi ke 8.92V.

Berikut ini adalah kisah kecil tentang sepotong kecil besi. Saya harap seseorang akan menemukan bahan ini bermanfaat atau setidaknya hanya menarik untuk dibaca. Hati-hati dengan semua ADC ini dan hal-hal buruk lainnya :))

UPD olartamonov dengan sangat bersemangat meminta untuk tidak membodohi orang dan menggunakan kode kalibrasi dari manual referensi - membuat perubahan dengan senang hati. Sayangnya, dalam kasus saya, ini tidak mengubah situasi dan pergeseran tidak ke mana-mana. Mungkin masalahnya ada di chip itu sendiri. seperti yang diarahkan dari Departemen Luar Negeri melemparkan produk palsu

Persaingan


Persaingan di antara proyek - proyek teknis sedang berlangsung di antara kawan-kawan PCBway , siapa pun dapat berpartisipasi. Aturannya sederhana. Papan sirkuit tercetak untuk proyek Anda akan gratis. Dan hadiah yang paling penting! Ini adalah beberapa kertas hijau dengan tuan-tuan Amerika tentang paypal Anda + mata uang virtual yang Anda dapat memesan papan sirkuit cetak + kehormatan dan rasa hormat + kesempatan untuk mendapatkan tawaran kerja di suatu tempat di luar CIS :)) Saya terutama merekomendasikan siswa untuk berpartisipasi, tingkat teknis tidak terlalu tinggi di sana , meskipun dari pengalaman kontes sebelumnya ada proyek yang sangat kuat, sehingga kotak DIY "kuat" dapat dengan mudah masuk ke pemenang!

Source: https://habr.com/ru/post/id448202/


All Articles