Bagaimana saya menjalankan osilator kecil yang berjalan tepat pada 31.891.269.116 µHz?

15

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.

Renegadeds
sumber
13
Mengapa unit aneh (µHz?) Itu 31.891 kHz. Jadi, Anda mungkin mencari kristal jam tangan 32kHz.
JRE
21
Mulailah dengan persyaratan Anda. Anda telah menentukan presisi luar biasa. Mengapa? Di tempat lain Anda mengatakan Anda bisa melakukan apa yang Anda inginkan dengan Arduino. Saya minta maaf untuk mengatakan ini kepada Anda, tetapi Anda bercanda sendiri, kecuali jika Anda menggunakan sesuatu seperti jam rubidium atau cesium sebagai referensi. Jadi, beri tahu kami apa yang Anda lakukan, dan apa persyaratan kinerja Anda. Itu persyaratan fungsional, bukan kinerja turunan Anda. Jika Anda mencoba untuk menghasilkan jam yang terkunci untuk jam lainnya, katakan demikian, dan beri tahu kami apa persyaratan (dan toleransi) Anda.
WhatRoughBeast
46
Anda mencoba menyelesaikan kekurangan keterampilan pemrograman Anda dengan perangkat keras yang sangat mahal dan khusus. Anda dapat dengan mudah menerapkan konversi floating point 256 bit dalam Arduino, atau presisi apa pun yang Anda inginkan.
pipa
14
Saya pikir ini adalah contoh bagus mengapa menyertakan lebih banyak informasi di muka memungkinkan orang untuk mengarahkan Anda ke arah yang benar. Jawaban Brian Drummond sekarang adalah yang terbaik, atau setidaknya murah dan layak untuk seorang amatir. Ini juga contoh yang baik mengapa Anda harus berhati-hati ketika menentukan presisi dan akurasi - ada banyak parameter yang berpotensi relevan dengan jam. Kami bahkan belum membahas kompensasi suhu atau jitter.
pjc50
11
"Faktor konversi adalah 1,0274912510 Earth detik hingga 1 Mars detik." - apakah Anda bingung perbedaan panjang hari antara Mars dan Bumi dengan panjang satu detik? The panjang dari hari matahari di Mars adalah 88 775 s, atau 1,02749 hari Bumi (dari 86 400 s). Di sisi lain dan yang kedua ditentukan oleh radiasi yang dipancarkan oleh atom cesium, dan bahkan dengan memperhitungkan waktu, Anda membutuhkan kecepatan sekitar 0,23 c untuk mendapatkan perbedaan 2,7%.
ilkkachu

Jawaban:

41

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.

Brian Drummond
sumber
1
Terima kasih! Berdasarkan umpan balik lain, saya pikir ini sepertinya pilihan yang paling layak tanpa harus menyelidiki dunia jam atom jadi saya telah memilihnya sebagai solusi untuk pertanyaan saya. Saya juga sangat menghargai desain yang Anda tautkan.
Renegadeds
Perlu diketahui bahwa angka signifikan yang Anda berikan tidak akan bertemu dengan kristal RTC standar. Kesalahan 5ppm dari matematika kemungkinan akan lebih kecil dari toleransi kristal.
user2943160
6
@ user2943160 jika Anda memiliki referensi yang baik, Anda dapat menekan 1ppm atau lebih dengan pemangkasan awal - akan ada beberapa ppm melayang selama beberapa tahun dan (anehnya untuk menyetel garpu kristal) varian parabola dengan suhu. Semua jam kuarsa yang murah di rumah saya beroperasi dengan laju yang berbeda, mereka mungkin tidak pernah dipangkas di pabrik, dan tidak jauh lebih baik daripada jam pendulum kompensasi suhu.
Brian Drummond
+1 hanya untuk "pemasok Mars".
Olin Lathrop
41

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

(33668 + 6754 / 8105) / 32768 ~= 1.0274912510006

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.

hobbs
sumber
16

10101014

Dmitry Grigoryev
sumber
Saya berharap untuk menghindari perangkat keras yang mahal jika memungkinkan. Saat ini saya mencapai ini dengan modul RTC biasa dan Arduino, dan saya dapat melakukan konversi 1000ms ke 1027.4912510ms, namun saya hanya memiliki sekitar resolusi 1-2 detik yang berarti itu mengoreksi diri tetapi tidak terlalu tepat .
Renegadeds
12
@ dimutakhirkan maka Anda harus menjelaskan dalam pertanyaan Anda presisi apa yang bisa diterima. Dan tolong berikan beberapa konteks: satu tag [arduino] akan menjadi petunjuk yang baik bahwa Anda tidak membangun dudukan laboratorium berpresisi tinggi.
Dmitry Grigoryev
1
Tercatat, saya telah memperbarui pertanyaan dan menambahkan tag Arduino.
Renegadeds
15

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.

Spehro Pefhany
sumber
7

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.

WhatRoughBeast
sumber
Setuju, dan bahkan jika OCXO tidak dalam anggaran daya, TCXO adalah dan masih dapat meningkatkan pada kristal jam tangan.
hobbs
4

Jam "Stratum 1" berasal dari 10-11Kristal 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-14jam 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 di 10-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)

  • Mengonversi 44856 ke biner = 1010111100111000
  • 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.

Tony Stewart Sunnyskyguy EE75
sumber
2

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.

Chris Stratton
sumber
0

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.

Henry Crun
sumber
0

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"

D Duck
sumber