Apa filosofi atau pendekatan yang diambil untuk menerapkan fungsi kritis waktu dalam mikrokontroler, jika ada?
Saya sedang mengerjakan proyek yang melibatkan keluaran bentuk gelombang persegi yang tepat dari berbagai frekuensi. Saya telah melakukan ini menggunakan timer dan fungsi interupsi. Namun, bahkan untuk mengimplementasikan ini dengan benar, saya harus mengkalibrasi offset untuk jumlah siklus jam yang diambil selama rutinitas layanan interupsi. Saya akan membayangkan ketepatan ini akan terganggu dengan memiliki bentuk gelombang lain berjalan di samping (katakanlah frekuensi perlu diubah pada waktu yang sama persis). Memiliki masing-masing mikrokontroler, untuk setiap kali fungsi kritis tersebut tampak boros.
Ambil contoh lain, menerapkan fungsi jam (seperti dalam jj: mm: dd). Saya tidak dapat membayangkan bahwa setiap mikroncontroller / komputer tingkat tinggi memiliki chip jam waktu nyata khusus semata-mata untuk melacak waktu. Namun, saya merasa sulit membayangkannya diukur secara akurat menggunakan prosesor inti, yang sibuk melayani sejumlah besar fungsi yang datang pada interval asinkron sementara itu. Saya membayangkan penghitungan waktu akan memiliki kesalahan offset, perubahan itu tergantung pada fungsi yang sedang berjalan.
Apakah ada proses desain atau pendekatan untuk mengandung atau memberikan toleransi terhadap presisi yang dapat dicapai? Atau apakah ada yang punya petunjuk atau saran di mana saya dapat menemukan informasi lebih lanjut tentang ini?
sumber
Jawaban:
Untuk menghasilkan gelombang persegi yang akurat, gunakan perangkat keras. Kebanyakan mikrokontroler memiliki generator PWM yang dapat melakukan ini. Anda mengatur periode dan waktu dalam siklus jam, dan perangkat keras melakukan sisanya. Untuk mengubahnya ke frekuensi baru, tulis periode baru ke dalam register periode dan separuh periode ke dalam register siklus tugas.
Adapun jam waktu nyata kehilangan waktu karena beban lain dari prosesor, itu tidak bekerja seperti itu kecuali jika ditulis dengan sangat buruk. Secara umum perangkat keras akan digunakan untuk membuat interupsi periodik yang merupakan kelipatan beberapa detik, dan firmware terbagi lebih jauh dari sana. Ini berfungsi terlepas dari seberapa sibuk prosesor itu, karena interupsi berjalan kapan pun ia perlu. Selama rutin interupsi mengambil sebagian kecil dari siklus keseluruhan, sebagian besar prosesor masih diterapkan pada tugas latar depan.
Ada juga cara untuk menjaga waktu dengan melakukan pemungutan suara pada interval yang agak tidak dikenal. Anda memiliki perangkat keras terus menghitung, dan setiap kali Anda memperbarui jam, Anda memperbaruinya berdasarkan jumlah total kutu yang telah berlalu. Selama rutin ini berjalan cukup sering sehingga penghitung apa pun yang digunakan tidak membungkus antara berjalan, tidak ada waktu yang hilang.
sumber
Kata kunci di sini adalah "dukungan perangkat keras". Untuk hal yang serius, Anda memerlukan perangkat keras pendukung di μC. Perangkat terintegrasi yang paling umum adalah sirkuit timer yang berjalan relatif tepat dan tanpa gangguan dari operasi CPU lainnya.
Berdasarkan hal itu, Anda dapat memiliki banyak fungsi yang mengeksekusi dengan pengaturan jangka menengah setepat sumber jam pengontrol Anda.
Tetapi: Seperti yang mungkin sudah Anda alami, selain akurasi jangka menengah atau panjang, selalu ada jitter waktu terlibat dalam penanganan perangkat lunak untuk peristiwa perangkat keras (termasuk hal-hal seperti timer overflow). Hal ini disebabkan oleh berbagai kemungkinan kondisi eksekusi pada saat suatu peristiwa terjadi yang menghasilkan berbagai penundaan hingga respons aktual terhadap peristiwa tersebut dapat terjadi.
Oleh karena itu, intinya adalah: Untuk apa pun dengan persyaratan kecepatan tinggi atau mendekati nol, dukungan perangkat keras sangat penting. Banyak periferal perangkat keras yang disertakan dalam sebagian besar μCs, seperti UARTs & c, dan semakin kuat dan mahal μC adalah semakin banyak perangkat keras yang mendukung biasanya built-in. Jika μC Anda tidak menyediakan perangkat keras yang Anda butuhkan, Anda memang harus mempertimbangkan perangkat keras eksternal yang didedikasikan untuk tugas tersebut.
sumber
Lakukan sebanyak yang Anda bisa dengan perangkat keras, terutama untuk fungsi-fungsi penting yang sangat penting waktu. Semua mikrokontroler memiliki penghitung waktu / penghitung yang khusus dibuat untuk menghitung dan menghitung waktu kejadian.
Selain itu, ini adalah pertanyaan yang sangat luas. Jadi tidak ada jawaban yang bagus.
Satu-satunya jawaban yang benar adalah pengalaman. Cobalah, buat profil, beri tekanan, perbaiki. Anda harus mengidentifikasi area kode dengan penggunaan tinggi. 20% perangkat lunak yang menjalankan 90% waktu, berarti setiap instruksi dihapus, meningkatkan kinerja.
Desain yang bagus selalu menyeimbangkan perangkat keras, perangkat lunak, dan memori. Ini berlaku untuk semua mikroprosesor, terutama mikrokontroler. Maksimalkan satu atau tidak efisien gunakan satu dan Anda akan memiliki produk yang buruk. Karena kepadatan silikon telah meningkat, semakin banyak fitur yang termasuk dalam perangkat keras mikrokontroler. Tetapi lebih banyak fitur berarti lebih banyak harapan. Gandakan memori onboard dan Anda akan menambahkan beberapa fitur yang menggunakannya.
Semua ISR memiliki overhead, yang tergantung pada register yang digunakan oleh ISR. Jika latensi untuk menyelamatkan kondisi mesin signifikan dibandingkan dengan servis ISR untuk fungsi-fungsi kritis yang sangat waktu, desain Anda mungkin tidak dapat diskalakan. Oleh karena itu, konsensus umum jawaban untuk menggunakan perangkat keras.
Penggunaan interupsi perangkat lunak dapat mengurangi kondisi mesin ISR.
Semua register untuk Inc_Seconds () harus didorong, ketika mereka hanya digunakan sekali setiap 150 siklus.
Sekarang hit latensi hanya terjadi sekali setiap 150 siklus.
Jika Anda menerapkan jam waktu nyata di jj: mm: dd, apakah penting jika itu mati 50 ms. Tidak ada orang yang mendeteksi kesalahan. Ini tentu saja bukan masalah operasi waktu-nyata.
Adapun peristiwa yang harus terjadi pada saat bersamaan. Haruskah mereka Jika mereka harus maka desain perangkat keras harus mengurusnya. Jika tidak, beberapa kompromi perangkat lunak harus dilakukan. Jika Anda tidak dapat mengatur dua bit sekaligus, maka atur satu bit. Instruksi selanjutnya mengatur yang lain. Akurasi satu clock cycle pada prosesor RISC. Saya berpendapat itu cukup baik.
sumber
Untuk bentuk gelombang persegi Anda harus menggunakan periferal PWM yang PLL dengan XTAL Anda menggunakan beberapa jenis penghitung untuk mengetahui kapan harus siklus (untuk mengatur beberapa kuadensi). Setiap lembar data akan memberi tahu Anda bagaimana melakukan ini :)
Untuk menjaga waktu , ya, Anda akan membutuhkan RTC untuk melakukannya secara akurat kecuali jika Anda pergi assembler dan opcode penulis sehingga Anda tahu secara langsung waktu eksekusi tepat dari setiap instruksi di setiap jalur exec. Ini mungkin juga akan memberi penerangan baru pada pernyataan 'goto dianggap berbahaya' yang dicoba dan benar.
sumber