Komunikasi serial MSP430 gagal dalam cuaca dingin

8

Saya memiliki produk menggunakan mikroprosesor MSP430, yang telah terjual selama beberapa tahun sekarang. Salah satu tugas MSP430 adalah berkomunikasi melalui serial async ke radio berdaya rendah.

Dengan awal musim dingin ini, ada tingkat kegagalan yang tidak dapat diterima (beberapa persen) dalam suhu dingin. Investigasi telah menemukan bahwa komunikasi serial dengan radio gagal. Generator baudrate untuk port serial diumpankan oleh SMCLK, yang dibagi dari osilator yang dikendalikan secara digital (DCO) MSP430.

Mengapa komunikasi serial gagal pada suhu rendah?

(Catatan: Saya sudah menyelesaikan masalah dan akan segera memposting jawabannya. Petunjuk: itu adalah bug perangkat lunak.)

markrages
sumber

Jawaban:

8

MSP430 mana yang Anda gunakan? Keluarga yang berbeda memiliki struktur dan kemampuan jam yang berbeda.

DCO akan mengubah frekuensi dengan suhu yang menyebabkan baud rate USART melayang keluar dari spesifikasi. MSP memiliki sensor suhu (tidak terlalu akurat). Anda dapat mengubah nilai-nilai dalam register kontrol DCO untuk mengembalikan frekuensi DCO dalam rentang tetapi ini akan membutuhkan tabel pencarian dikalibrasi yang mencakup kisaran suhu yang Anda harapkan. Beberapa perangkat MSP memiliki tabel kalibrasi DCO yang diprogram ke dalam salah satu sektor flash saat pembuatan, tetapi ini hanya berguna jika mereka mencakup frekuensi yang ingin Anda gunakan, dan saya tidak berpikir bahwa mereka memiliki nilai kompensasi suhu.

Apakah Anda memiliki osilator kristal referensi yang dapat Anda gunakan sebagai sumber kalibrasi? Saya akan selalu mendesain kristal 32kHz dan menggunakannya pada ACLK. Untuk baud rate hingga 9600 ini dapat digunakan secara langsung. Untuk baud rate yang lebih tinggi, Anda harus mengkalibrasi DCO terhadap sinyal ACLK. Bagian-bagian yang lebih baru memiliki FLL perangkat keras yang akan melakukan ini secara otomatis.

kamu
sumber
7

Jadi inilah jawabannya:

Produk ini memiliki kristal 32 kHz, dan saya telah membuat kode rutin untuk menyesuaikan frekuensi DCO. Penyesuaian frekuensi menggunakan dua timer, satu dari DCO dan satu dari 32kHz ACLK. Itu didorong oleh sistem yang mengganggu penangkapan / membandingkan, sehingga dapat secara berkala mengkalibrasi ulang dirinya sendiri selama operasi.

Sayangnya, saya memasukkan kalibrasi awal di bagian yang salah dari kode startup saya, di mana interupsi dimatikan. Oleh karena itu kalibrasi tidak terjadi sebelum penggunaan pertama dari port serial, dan inisialisasi akan menunggu respon pada port serial.

Frekuensi DCO dimulai pada nilai kalibrasi pabrik, itulah sebabnya ia bekerja pada suhu kamar.

Plot-plot ini menceritakan kisahnya:

Pertama, kurva suhu-DCO: teks alternatif

Sekarang kurva setelah kalibrasi sebenarnya berfungsi: teks alternatif

markrages
sumber
1
Cerita bagus! Apakah perlu biaya banyak untuk memperbaikinya? : D
tyblu
Sangat menarik bahwa lereng berubah dari grafik pertama ke grafik kedua. Ada teori? Apakah menyetel DCO dalam frekuensi yang lebih rendah memberinya koefisien suhu yang lebih buruk?
W5VO
Perhatikan bahwa sumbu y berubah di antara kedua grafik. Dan jangan terlalu banyak membaca mereka secara umum. Bagian itu dibekukan dalam freezer domestik dan suhu diukur selama pemanasan hingga suhu kamar dengan termokopel pada MAS-345 yang murah ( elexp.com/tst_s345.htm ) yang hanya membaca derajat bilangan bulat. Kemudian saya diinterpolasi secara linear antara perubahan keseluruhan untuk membuat plot.
markrages
5

Temperatur yang rendah menyebabkan frekuensi DCO naik cukup hingga menyebabkan baud rate UART naik terlalu tinggi? Anda mengukur suhu dan kemudian memberi kompensasi osilator dalam perangkat lunak?

W5VO
sumber