Pendekatan yang baik untuk mengimplementasikan lebih dari satu fungsi kritis-waktu menggunakan mikrokontroler?

8

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?

midnightBlue
sumber
Hal-hal yang membutuhkan RTC akurat sering kali memiliki chip khusus, atau subfungsi dengan kekuatan dan kristalnya sendiri, untuk melacak waktu ketika perangkat dimatikan. Waktu adalah masalah besar.
pjc50
Berhentilah menggunakan arsitektur yang mengerikan (atau mulailah menggunakannya dengan benar) - pengatur waktu perangkat keras tidak harus bergantung pada waktu yang dihabiskan untuk melayani ISR ​​- selama pemuatan ulang dilakukan 'tepat waktu' itu tidak menjadi masalah.
Spehro Pefhany
Apa mikrokontroler? Itu akan memungkinkan jawaban kualitas yang lebih baik.
StainlessSteelRat
@SpehroPefany Banyak yang harus saya katakan, saya cukup berpengalaman dalam hal ini. Masalah yang saya alami dengan gelombang persegi adalah bahwa saya ingin frekuensi untuk (dapat) berubah pada setiap transisi output (yang untuk 2 gelombang persegi yang berbeda akan berada pada interval yang tidak sinkron, dan bahkan berpotensi bertepatan). Gelombang persegi adalah bagian kecil dari pertanyaan besar yang ada dalam pikiran saya. Dalam generasi bentuk gelombang, bagaimana Anda menerapkan lebih dari 1 bentuk gelombang analog sewenang-wenang? Apakah pengorbanan dilakukan dalam membuat 'tingkat sampel' yang umum?
tengah
@StainlessSteelRat Saya sengaja tidak menentukan mikrokontroler tertentu karena saya merasa pertanyaannya cukup luas. Bagi saya, sepertinya itu bisa diterapkan pada arsitektur prosesor di komputer besar hingga ke mikrokontroler. Sebagian, saya ingin tahu apakah ada sumber daya yang tersedia untuk belajar tentang membuat desain yang baik / membatasi kesalahan ketika menerapkan lebih dari satu fungsi yang sensitif terhadap waktu.
tengah

Jawaban:

10

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.

Olin Lathrop
sumber
Maaf! Seharusnya saya lebih luas dengan pertanyaan saya. Gelombang persegi adalah contoh khusus dari aplikasi kritis waktu yang ada dalam pikiran saya. Dengan metode generator PWM yang Anda sebutkan, apakah bisa (jika perlu) memperbarui frekuensi pada setiap transisi gelombang persegi? Bagaimana jika Anda harus melakukan ini untuk dua gelombang persegi asinkron? Bagaimana dengan sepuluh? Saya bertanya-tanya apakah ada pendekatan desain umum untuk hal-hal seperti itu. Metode yang Anda sebutkan tentang interupsi & polling berkala untuk memperbarui jam tentu memberi sedikit cahaya.
midnightBlue
1
@ id: Sebagian besar micros dapat mengganggu pada awal periode PWM. Beberapa memiliki register buffered ganda sehingga Anda dapat memperbarui parameter selama satu periode, kemudian menerapkannya pada awal periode berikutnya. Beberapa mikro dapat memberi makan PWM melalui DMA. Saya menggunakan ini sekali untuk memiliki perangkat keras secara otomatis untuk dithering.
Olin Lathrop
3

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.

JimmyB
sumber
Memahami jitter adalah kuncinya - Anda dapat memiliki beberapa pengatur waktu perangkat keras, dan mereka semua akan melacak secara mandiri, tetapi jika mereka semua mematikan interupsi pada saat yang sama maka tidak semuanya dapat diservis sekaligus.
pjc50
2

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.

// Timer0 ISR
Temp = Temp + 1
if (Temp == 150)
    call Inc_Seconds()

Semua register untuk Inc_Seconds () harus didorong, ketika mereka hanya digunakan sekali setiap 150 siklus.

// Timer0 ISR
Temp = Temp + 1
if (Temp == 150)
    _Software_Interrupt
...
// Software_Interrupt ISR
    call Inc_Seconds()

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.

Baja Tahan Karat
sumber
0

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.

AlexanderBrevig
sumber
3
Komentar Anda tentang perangkat lunak RTC hanya akan berlaku untuk solusi yang paling ceroboh diimplementasikan. Cara yang waras dan dapat diandalkan untuk melakukan ini adalah dengan menggunakan pengatur waktu perangkat keras untuk menghasilkan interupsi sekali setiap 1msec (atau 10 msec). Dalam layanan rutin memiliki variabel penghitung statis yang menghitung kemudian jumlah interupsi hingga 1000 (atau 100). Ketika jumlah penuh tercapai, atur ulang penghitung dan kemudian tambahkan penghitung detik Anda. Setiap 60 detik Anda akan mengatur ulang variabel penghitung detik kembali ke nol dan menambah variabel penghitung menit Anda. Perpanjang ini sampai berbulan-bulan dan bertahun-tahun jika diperlukan.
Michael Karas