Saya mencari untuk membangun modul RTC untuk Arduino yang berjalan pada waktu Mars. Faktor konversi adalah 1,0274912510 Earth detik hingga 1 Mars detik.
Sementara saya telah berhasil menyelesaikan ini secara programatik dengan resolusi <2 detik (yang tidak terlalu ideal, saya lebih suka akurasi sekitar 300 ms) menggunakan matematika titik tetap pada Arduino Uno yang terhubung ke modul RTC biasa, saya bertanya-tanya apakah mungkin untuk memiliki semacam osilator tegangan rendah yang berjalan pada tepatnya 31.891.269.116 µHz (31.891269116 kHz) yang akan, lebih atau kurang, dapat dipertukarkan dengan kristal jam 32 kHz standar (namun, saya akan terbuka untuk ide-ide lain sehingga selama mereka tidak terlalu mahal.)
Adakah ide bagaimana ini mungkin? Atau, beberapa jenis timer yang mati setiap 1,0274912510 detik juga dapat diterima.
Jawaban:
Gunakan kristal 32768kHz seperti orang lain, tetapi bagilah dengan 33669 sebagai gantinya, menghasilkan kesalahan -5.08ppm. (Anda dapat menghapusnya dengan memotong kapasitansi memuat jika Anda mau).
Ini tidak tepat, tetapi untuk jam Mars, ini akan sebagus jam kuarsa Bumi. Yaitu, mengabaikan masalah kompensasi suhu untuk suhu lingkungan Mars, sebagian besar kristal arloji hanya tersedia untuk penggunaan di Bumi, kecuali Anda dapat menemukan pemasok Mars ...
Saya akan menggunakan peripheral penghitung waktu dalam MSP430 untuk melakukan pembagian, dan (dengan asumsi Anda mengendarai gerakan jam mekanis kuarsa standar) menghasilkan pulsa bipolar 30ms pada pin keluarannya setiap detik, kira-kira mengikuti timing asli yang Anda bisa ukur pada osiloskop.
Arduino atau sejenisnya akan melakukan pekerjaan itu, tetapi MSP dapat diletakkan di antara pulsa, mengkonsumsi di bawah 1uA dengan menjalankan osilator LF. Berikut adalah contoh desain dengan kode sumber dan PCB untuk arloji - hanya waktu Bumi sejauh ini, meskipun itu mungkin dapat diperbaiki dengan mengubah konstanta.
sumber
Anda bisa melakukan lebih baik daripada saran Brian Drummond. Meskipun mungkin benar bahwa osilator Anda adalah sumber kesalahan terbesar dalam sistem, tidak ada alasan untuk menambahkan kesalahan sistematis tambahan saat itu cukup mudah untuk tidak melakukannya.
Atur interval waktu Anda ke 33668 kutu, mulai penghitung pada 0, dan pada setiap penghenti waktu, tambah penghitung dengan 6754.
Jika, setelah bertambah, penghitung adalah> = 8105, kemudian kurangi 8105, dan atur interval timer untuk detik berikutnya ke 33669 ticks.
Jika tidak, biarkan penghitung itu sendiri dan atur interval timer untuk detik berikutnya menjadi 33668.
Ini akan memberi Anda (dengan asumsi kristal 32,768kHz sempurna) interval rata-rata
detik (kurang dari satu bagian per triliun kesalahan relatif ke 1,0274912510), bukannya 1,0274963378906 detik (hampir 5 bagian per juta kesalahan). Ini berarti bahwa akurasi jangka panjang jam Anda akan benar-benar bergantung pada keakuratan osilator; kesalahan karena matematika akan menyumbang kurang dari satu centang kesalahan per tahun. Meskipun panjang setiap tunggal kedua akan memiliki kesalahan relatif hingga 25ppm, lebih lama dan interval rata-rata lama kesalahan menghilang.
Ini adalah algoritma Bresenham yang diterapkan pada ketepatan waktu, dan fraksi 6754/8105 ditemukan sebagai berikut:
32768 * 1.027491251 = 33668.833312768
Fraksi lanjutan yang tepat untuk 33668.833312768 adalah [33668; 1, 4, 1, 1349, 1, 7].
Menjatuhkan suku terakhir memberikan perkiraan 33668 + 6754/8105, yang memiliki semua bagian yang pas menjadi 16 bit.
sumber
sumber
Ini dapat dilakukan dengan rubidium atau jam referensi atom lainnya pada 10MHz, mungkin PLL untuk memberikan (katakanlah) 100MHz, dan kemudian dihitung dengan akumulator fase ~ 36 bit untuk memberikan resolusi 0,001Hz. Yang terakhir dapat dilakukan dengan FPGA kecil.
Anda dapat membaca tentang metode Direct Digital Synthesis (DDS). Ada chip yang melakukan DDS tapi mungkin tidak dengan lebar bit yang begitu lebar.
Modul jam Rubidium tersedia di pasar surplus, atau dari pembuat seperti Microsemi.
sumber
Anda tidak mendefinisikan "mahal", jadi ini adalah pukulan di kegelapan.
Mulailah dengan generator 10 MHz komersial (termasuk eBay). Rubidium untuk pilihan, tetapi akurasi apa pun yang Anda dapat menentukan kinerja Anda.
Sekarang buat pembagi yang dapat diprogram dengan panjang 28 bit. Pada 10 MHz Anda bisa lolos dengan logika CMOS 74HC, tetapi Anda harus menggunakan konfigurasi carry cepat. Output juga memicu pembagian dengan dua flip-flop yang menyediakan bit 29.
Pembagi dapat berjalan pada rasio 10.274.912 atau 10.274.913, tergantung pada keadaan bit 29. Untuk input 10 MHz yang sempurna, periode output efektif untuk bit 28 kemudian menjadi 1.02749125 detik, yang kira-kira akurat untuk 1 ppb, atau sekitar 30 msec / tahun. Input yang kurang akurat, tentu saja, akan menghasilkan output yang kurang akurat.
Menggunakan 74HC161s rawa standar Anda dapat melakukan ini dengan 8 IC, dan jika Anda berhati-hati, Anda mungkin dapat menggunakan papan strip prototyping standar, meskipun Anda ingin sangat berhati-hati dalam memperkuat sistem ground. Perfboard akan lebih murah, lebih kompak dan lebih tahan lama, tetapi kabelnya akan kurang nyaman, karena Anda harus menyolder koneksi. Anda kemudian dapat memasukkannya ke dalam sesuatu seperti RTV tingkat elektronik (BUKAN RTV yang Anda dapatkan di toko perangkat keras), untuk ukuran modul akhir dalam kisaran 2 x 2 x 1/2 inci, tidak termasuk osilator.
EDIT
Perhatikan bahwa standar kinerja Anda, yang dikaitkan dengan RTC "biasa", sebenarnya dalam kisaran akurasi 1 detik / hari, yang 30 kali lebih buruk daripada pendekatan ini. Jadi, pertama-tama, Anda dapat menghapus bit 29 stage atau, sebagai alternatif, bagi 10 MHz Anda menjadi 5 MHz dan gunakan rasio 5.137.456. Laju clock yang lebih rendah ini di counter akan memungkinkan struktur carry yang lebih sederhana, menghindari fast carry yang diperlukan pada 10 MHz. Akurasi Anda sekarang berada di urutan 60 msec / tahun untuk jam yang sempurna.
EDIT LEBIH LANJUT
Pandangan cepat di eBay menunjukkan sejumlah besar 10 MHz OCXO dengan harga kurang dari 20 dolar. Ini biasanya akan memiliki stabilitas 1 ppb atau lebih baik, dengan 0,2 ppb spesifikasi yang cukup umum. Dapatkan salah satunya dan Anda harus dalam kondisi yang baik. Anda ingin meminjam frekuensi / periode period meter yang cukup tinggi untuk menentukan frekuensi output aktual, lalu sesuaikan rasio pembagian agar sesuai.
sumber
Jam "Stratum 1" berasal dari10- 11 Kristal potong SC yang digunakan dalam ~ $ 250 VC-OCXO (mis. Vectron) kecuali Anda membeli bekas. Kemudian dengan menyetel untuk sinkronisasi ke jam global seperti WWV, VLF, GPS 10MHz atau 1pps jam yang pada gilirannya akan disinkronkan ke10- 14 jam atom via "dikunci ke 3 satelit." Maka Anda dapat mengkalibrasi ke10- 11 kesalahan.
Untuk membuat f lain, seperti frekuensi Anda memerlukan offset 2,07% dari 1pps sehingga ini tidak dapat dilakukan dengan menyetel kristal arloji di10- 6 stabilitas.
Tipe "fraksi N synth" PLL digunakan untuk memperoleh rasio apa pun dari referensi seperti 10Mhz dari beberapa unit GPS.
Jika osilator TCXO memiliki stabilitas 1ppm, ia hanya dapat disetel lebih sedikit dari ini dan bukan 2,07% offset dari 1 pps atau 1,0274912510 Hz, jadi PLL dengan pecahan N chip (s) adalah salah satu cara untuk melakukan ini dengan VC-OCXO atau cap mekanik yang disesuaikan dengan OCXO.
ditambahkan - Untuk menghasilkan 1pps pada waktu MAR, maka rasio bagi adalah 26.337.44856 menggunakan 5 digit integer dan residu 5 digit.
Jika Anda dapat menyetel Xtal menjadi 0,01 ppm, ia hanya akan stabil hingga 1 ppm kecuali jika oven-mikro dibuat pada ~ 30'C karena Tempco biasanya nol di sekitar temp suhu untuk beberapa XTALS yang belum tentu MEM. Kecuali Vcc dan temp adalah dalam 0,1 derajat C apa pun yang mencoba untuk memperbaiki kesalahan residu lebih baik dari 0,01 ppm adalah tidak mungkin, bahkan 0,1 ppm adalah jangka pendek yang sulit dan penuaan jangka panjang akan setidaknya 1 ppm per tahun.
Jadi secara teori jika Anda memiliki jam 1ppm yang dikalibrasi dari GPS untuk menyetel waktu Bumi 1ppm, mustahil untuk mengharapkan akurasi yang lebih baik untuk mengoreksi residu.
Nilai kesalahan residu dari pembagi per detik. adalah 44856/100000 (+26.337)
Ini membutuhkan penghitung residu untuk beralih antara / 44856 dan 45857
Kami melakukan pembagian residu ini dengan memotong angka residu biner menjadi 8 bit kemudian memutar bit sehingga MSB menjadi LSB.
10101111 menjadi 11110101
Setiap detik penghitung residu dari 11110101 dan di mana setiap posisi bit "n" = 1 adalah nilai hitungan dalam biner n ^ 2 di mana rasio bilangan bulat adalah 45857, bukan 44856. Karena LSB = 1, itu berarti setiap hitungan ke-2 beralih hingga 101 detik kemudian pilihan pembagi diaktifkan untuk hitungan 1pps berikutnya. Ini diulangi untuk memilih pembagi mana yang digunakan untuk detik berikutnya, kemudian menaikkan penunjuk, hingga penunjuk mencapai akhir dan menunggu jam bumi 1pps berikutnya.
Proses ini diulangi untuk seluruh jumlah residu biner yang dirotasi ini atau 10101111> 11110101 = 245 detik sehingga pembagi fraksi N synth 1pps waktu Mars dibuat setiap detik dengan koreksi yang dilakukan setiap siklus 245 detik agar tetap tepat waktu. untuk jangka panjang.
-mungkin rasio pembagi titik mengambang untuk jam lebih mudah.
sumber
Anda dapat dengan mudah menyelesaikan masalah ini dalam perangkat lunak tanpa mengubah perangkat keras sama sekali (meskipun Anda mungkin menginginkan frekuensi referensi yang lebih stabil), dengan menggunakan pecahan biner, dan Anda dapat melakukannya dengan cara yang memberikan Anda resolusi milidetik dan dengan mudah dapat dibuat gratis cukup kesalahan konversi kumulatif untuk membuat Anda melihat keakuratan mendasar dari setiap sumber yang dapat Anda rujuk, termasuk jam atom.
Apa yang akan Anda lakukan adalah memodifikasi penghenti waktu Anda untuk terakumulasi menjadi sebuah register yang sangat luas, dan pada setiap interupsi menambahkan nilai yang cukup panjang yaitu setepat representasi rasio milidetik Bumi ke "milidetik Mars" seperti yang Anda inginkan.
Katakanlah demi argumen bahwa Anda menginginkan resolusi 32-bit untuk konversi. Anda dapat menggunakan akumulator 64-bit, dengan 32 bit yang lebih rendah mewakili fraksi Apa yang akan Anda lakukan adalah mencari tahu nilai yang sesuai, sedikit kurang dari 2 ^ 32, yang mewakili faktor konversi. Setiap kali Earth milidetik Anda menghentikan api, Anda menambahkan nilai ini ke akumulator. Setiap kali Anda ingin meminta jam, Anda mengembalikan 32 bit atas, yang merupakan jumlah seluruh milidetik Mars yang berlalu, sedangkan 32 bit yang lebih rendah hanya dipertahankan secara internal untuk menghindari kesalahan pembulatan.
Menggunakan pecahan biner panjang seperti ini memungkinkan Anda untuk melakukan konversi dengan akurasi sebanyak yang Anda inginkan. 32 bit hampir pasti terlalu lama untuk fraksi, sementara 32 bit untuk seluruh milidetik mungkin terlalu pendek, tetapi Anda dapat menyesuaikan sesuai keinginan.
Kebetulan, teknik akumulasi ini dalam register yang panjang tetapi hanya melaporkan beberapa bit yang paling signifikan adalah bagaimana sintesis digital langsung dapat menghasilkan resolusi frekuensi yang sangat tinggi.
Anda juga dapat mempertimbangkan melakukan bagian konversi dengan mengubah rasio pembagi dari jam sistem 8 atau 16 MHz ke interupsi milidetik, memindahkannya lebih dekat ke interval "milidetik Mars". Terutama jika Anda menginginkan sesuatu yang lebih akurat daripada kristal murah, Anda mungkin berurusan dengan referensi 10 MHz biasa yang didisiplinkan oleh GPS atau lebih langsung dengan jam atom, sehingga Anda dapat menggantikannya dengan sumber jam AVR 8/16 MHz biasa dan menghitung ulang rasio pembagi sesuai.
sumber
Sintesis digital langsung (DDS) atau pendekatan Numerical Controlled Oscillator adalah cara yang cukup sederhana untuk mendapatkan tingkat resolusi frekuensi output yang diinginkan tanpa ketergantungan pada frekuensi clock.
Dalam pendekatan ini Anda memiliki akumulator fase resolusi tinggi. Setiap loop di sekitar Anda menambahkan kenaikan fase yang juga memiliki resolusi bagus. Output adalah bit akumulator tertinggi.
Ketika menggunakannya untuk memberikan gelombang persegi, ujung-ujungnya hanya dapat berubah dengan jam input (atau laju perulangan perangkat lunak), sehingga ujung gelisah dari tempat seharusnya, tetapi seiring waktu, tidak ada kesalahan kumulatif -Anda dapat membuat resolusi sebagai setinggi yang Anda inginkan.
Anda dapat melakukannya dalam perangkat lunak dengan mudah (mis. Pada AVR), dan beberapa micros sekarang memiliki perangkat keras NCO. http://ww1.microchip.com/downloads/en/AppNotes/90003131A.pdf PIC kecil dapat melakukan ini dalam perangkat keras dengan resolusi 20bit (1ppm), dari xtal 32kHz, atau dari oven 10MHz yang akurat.
sumber
Lihatlah bagaimana mendapatkan kristal kuarsa khusus yang di ovenisasi berjalan pada beberapa bilangan bulat dari frekuensi yang Anda inginkan. Mereka tidak memerlukan biaya lebih dari frekuensi standar. Websearch "kristal kuarsa khusus"
sumber