Anda di halaman 1dari 11

Accelerometer MMA7260 Antarmuka

oleh les Diterbitkan on 7th Desember 2010 09:09 Accelerometers adalah perangkat menarik, menggabungkan bagian-bagian mekanik kecil yang bergerak dengan elektronik untuk menghasilkan hasil yang benar-benar menakjubkan. Mereka adalah bagian dari keluarga semikonduktor bernama MEMS (sistem Microelectromechanical). Para MMA7260Q Freescale adalah 3-axis accelerometer, yang berarti dapat mendeteksi gaya gravitasi di X, Y dan sumbu Z. Accelerometers yang selalu permukaan mount perangkat, membuat prototipe sulit, namun, ada banyak, sehingga disebut, papan pelarian yang mengandung chip accelerometer dan sekitarnya setiap sirkuit yang dibutuhkan. Ini biasanya dibawa ke format yang lebih bisa digunakan, seperti 0,1 "(2.54mm) header. Ini adalah jenis papan saya menggunakan, dan itu dibeli dari ebay kurang bahwa saya bisa membeli chip accelerometer itu sendiri. Dewan ini dibuat oleh elektronik Tentu dan ditunjukkan di bawah ini, bersama dengan orientasi sumbu itu:

Manual PDF untuk PCB di atas dapat didownload dari sini: 3-Axis rendah g MMA7260.pdf Accelerometer , dan datasheet untuk chip accelerometer MMA7260 dapat didownload dari sini: datasheet.pdf MMA7260QT . PCB adalah sedikit menyesatkan, dalam hal ini memiliki dua baris 0,1 "header, satu baris berisi teks-teks yang berkaitan dengan perangkat SPI serial (J4), dan baris lain berisi teksteks yang berkaitan dengan output accelerometer (J1) Baris teks serial (sisi kiri dari ilustrasi di atas, bernama J4) pin. tidak terhubung ke perangkat konversi serial, dan MMA7260 hanya menghasilkan output analog. pin hanya dihubungkan adalah 5 volt satu, yang menghubungkan ke regulator chip.

Sebagai Amicus18 beroperasi pada 3,3 Volt, dan begitu juga dengan perangkat MMA7260, baris ini dapat sepenuhnya diabaikan, sebagai pin paling tidak ada gunanya dalam hal apapun, dan interfacing semua dilakukan dengan header J1. Seperti biasa, saya menggunakan perisai pendamping terpercaya untuk mengimplementasikan antarmuka, dan tata letak itu ditunjukkan di bawah ini:

Klik di sini untuk gambar lebih besar Sebuah tata letak top down ditampilkan di bawah ini untuk kejelasan lebih lanjut:

Klik di sini untuk gambar lebih besar MMA7260 telah output analog yang bervariasi dalam tegangan sesuai dengan gaya gravitasi diukur. Luar biasa, juga memiliki empat pilihan sensitivitas memaksa melalui penggunaan itu SEL1 dan sel2 masukan:
Masukan sel2 Masukan SEL1 g-Range Kepekaan 0 0 1.5g 800mV per g 0 1 2g 600mV per g 1 0 4g 300mV per g 1 1 6g 200mV per g

Output analog untuk X, Y dan Z dengan mudah dapat dihubungkan ke input ADC tiga dari mikrokontroler yang perifer, masing-masing memproduksi nilai 0-1023 tergantung pada pergerakan sumbu tertentu. Hal ini kemudian dapat dikonversi ke nilai tegangan.

Itulah apa program di bawah ini. Namun, juga menggabungkan median filter sehingga dapat melicinkan nilai ADC agak. Program ini juga dapat didownload dari sini:
MMA7260_Accelerometer_Simple.bas .

Kode:
'MMA7260 Accelerometer antarmuka' '' Tampilkan X, Y dan nilai-nilai sumbu Z pada terminal serial 'Menurut posisi accelerometer' Accelerometer 'koneksi' 'output X terhubung ke AN0 (PORTA.0)' output Y terhubung ke AN1 (PORTA.1) 'output Z terhubung ke AN2 (PORTA.2)' Sel1 masukan terhubung ke 'sel2 masukan terhubung ke PORTB.0' PORTB.5 Sertakan "ADC.inc" 'Load ADC makro ke dalam Simbol Program tSel1 = Accelerometer PORTB 5. "Accelerometer Sel1 pin connection Simbol tSel2 = PORTB. 0 'sel2 pin connection Simbol cQuanta = 3,3 / 1023' ADC untuk konversi tegangan (VDD / Resolusi ADC) wXoutput Dim Word Menyimpan hasil 10-Bit disaring dari wYoutput ADC Dim Word Menyimpan hasil 10-Bit disaring dari wZoutput ADC Dim Word Menyimpan hasil 10-Bit disaring dari fXVoltage Dim ADC Sebagai Lampung 'Memegang tegangan output dari saluran fYVoltage Dim Lampung' Memegang tegangan output dari saluran fZVoltage Dim Lampung 'Menyimpan output tegangan dari saluran' Variabel 'digunakan oleh bubble sort rutin' Dim Dim bSortIndex Byte Dim wSwapTemp tSwapOccured Sebagai Bit Sebagai Firman Dim wSortResult Sebagai Simbol wSwapTemp cSamplesToTake = 9 'Jumlah tersebut sampel untuk mengambil untuk bubble sort Dim wSampleArray [cSamplesToTake] Sebagai Firman'---------------------------------- Langsung GoTo Utama 'atas subrutin'-------- ---------------------------------- ------------------------------------------------- '----------' Pilih sensitivitas MMA7620 '$ mendefinisikan Set_1_5g () rendah tSel1: tSel2 Rendah $ mendefinisikan Set_2g () Tinggi tSel1: tSel2 Rendah $ mendefinisikan Set_4g () rendah tSel1: Tinggi tSel2 $ mendefinisikan Set_6g () tSel1 Tinggi: Tinggi tSel2'--------------------------------------- ---------------------------'Menerapkan gelembung menyortir median filter' Masukan ': wSampleArray memegang nilai-nilai untuk output semacam': wSortResult memegang median dari nilai-nilai 'Catatan: Tidak ada' MedianFilter: Ulangi = 0 tSwapOccured 'Batal bendera yang menunjukkan pertukaran bSortIndex = 0 Ulangi. "Untuk setiap sel dari array ... Jika wSampleArray [bSortIndex]> wSampleArray [bSortIndex + 1] Lalu 'Pindah nilai yang lebih besar atas. wSwapTemp = wSampleArray [bSortIndex]' .. dengan menukar mereka wSampleArray. [bSortIndex] = wSampleArray [bSortIndex + 1] wSampleArray [bSortIndex + 1] = wSwapTemp tSwapOccured bit Set = 1 'jika swap yang terjadi. EndIf Inc Sampai bSortIndex bSortIndex> cSamplesToTake 'Periksa sel berikutnya dari array Sampai tSwapOccured = 0.' Jauhkan menyortir sampai swap tidak lebih. wSortResult = wSampleArray [cSamplesToTake / 2] 'Ekstrak tengah (median) nilai Kembali'------- -------------------------------------------------- ---------- 'Baca output X dari accelerometer (Maju-Mundur)' 'Input: Tidak ada' Output: wXoutput memegang hasil 10-bit dari ADC disaring 'fXVoltage memegang tegangan keluaran dari 'Catatan: Tidak ada ReadChannel_X: Untuk bSortIndex = (cSamplesToTake - 1) Untuk 0 Langkah - 1' saluran Buat loop untuk jumlah sampel untuk mengambil wSampleArray [bSortIndex] = ReadADC (ADC_CH0) 'Baca saluran ke DelayUS Filter Array 2 'Sebuah penundaan kecil untuk memungkinkan kapasitor ADC untuk re-charge Berikutnya' Tutup loop GoSub MedianFilter 'Lakukan filter median pada sampel wXoutput = wSortResult' Mentransfer hasil dari fXVoltage filter = wXoutput * cQuanta 'Convert to Return tegangan '------------------------------------------------ ------------------- 'Baca output Y dari accelerometer (Side ke Side)' 'Masukan: Output Tidak ada': wYoutput memegang hasil 10-bit disaring dari ADC 'fYVoltage memegang tegangan output dari saluran' Catatan: ReadChannel_Y Tidak ada: Untuk bSortIndex = (cSamplesToTake - 1) Untuk 0 Langkah - 1 'Buat loop untuk jumlah sampel untuk mengambil wSampleArray [bSortIndex] = ReadADC (ADC_CH1)' Baca saluran ke DelayUS Array Filter 2 'Sebuah penundaan kecil untuk memungkinkan kapasitor ADC untuk re-charge Berikutnya' Tutup loop GoSub MedianFilter 'Lakukan filter median pada

sampel wYoutput = wSortResult' Mentransfer hasil dari fYVoltage filter = wYoutput * 'cQuanta Mengkonversi ke tegangan Kembali'---------------------------------------- --------------------------- 'Baca output Z dari accelerometer (Up dan Down)' 'Masukan: Output Tidak ada': wZoutput memegang hasil 10-bit dari ADC disaring 'fZVoltage memegang tegangan output dari saluran' Catatan: ReadChannel_Z Tidak ada: Untuk bSortIndex = (cSamplesToTake - 1) Untuk 0 Langkah - 1 'Buat loop untuk jumlah sampel untuk mengambil wSampleArray [ bSortIndex] = ReadADC (ADC_CH2) 'Baca saluran ke DelayUS Array Filter 2' Sebuah penundaan kecil untuk memungkinkan kapasitor ADC untuk re-charge Berikutnya 'Tutup loop GoSub MedianFilter' Lakukan filter median pada sampel transfer wZoutput = wSortResult ' hasil fZVoltage filter = wZoutput * cQuanta 'Convert to Return tegangan'--------------------------------- ---------------------------------- "loop program utama mulai di sini Utama: Set_1_5g () 'accelerometer Set sensitivitas '' Buka ADC dan membuat AN0, AN1, dan AN2 input analog '' Tampilkan nilai accelerometer pada terminal serial 'OpenADC (ADC_FOSC_64 & ADC_RIGHT_JUST & ADC_2_TAD, ADC_REF_VDD_VSS, ADC_1ANA & ADC_2ANA & ADC_3ANA)' Sementara 1 = 1 'Buat infinite loop GoSub ReadChannel_X 'Baca X saluran GoSub ReadChannel_Y' Baca Y saluran GoSub ReadChannel_Z 'Baca Z saluran HRSOut 1' HRSOut Hapus jendela terminal serial itu "sumbu X (Maju-Mundur):", Desember wXoutput, ":" , Dec2 fXVoltage, "Volt \ r" 'Tampilkan HRSOut nilai saluran X "sumbu Y (Side ke Side):", Desember wYoutput, ":", Dec2 fYVoltage, "Volt \ r"' Tampilkan HRSOut nilai saluran Y " sumbu Z (Up dan Down): ", Desember wZoutput,": ", Dec2 fZVoltage," Volt \ r "'Tampilkan nilai saluran Z Delayms 300 Wend' Lakukan selamanya

Kode di atas akan mengirimkan nilai ADC baku serta nilai-nilai tegangan ke terminal serial, seperti yang ditunjukkan di bawah ini:

Kita bisa berhenti di situ, seperti yang telah kita informasi yang cukup untuk banyak aplikasi, namun, kami masih belum diambil kekuatan g yang sebenarnya diukur oleh perangkat, jadi kami akan terus. Mengukur kekuatan g dan kecenderungan. Ketika berpikir tentang accelerometers sering berguna untuk gambar kubus dengan bola di dalamnya:

Jika kita mengambil kotak ini ke lokasi tanpa bidang gravitasi, atau dalam hal ini dengan tidak ada bidang lain yang mungkin mempengaruhi posisi bola, bola hanya akan mengapung di tengah kotak. Anda bisa membayangkan kotak sebagai pesawat ruang angkasa yang mengorbit di sekitar planet di mana segala sesuatu dalam keadaan ringan. Dari ilustrasi di atas Anda dapat melihat bahwa kita tetapkan untuk setiap sumbu sepasang dinding (Y + dinding telah dihapus sehingga kita dapat melihat di dalam kotak). Bayangkan bahwa setiap dinding tekanan sensitif. Jika kita memindahkan kotak ke kiri (kita mempercepat dengan percepatan 1g = 9.8m / s ^ 2), bola akan memukul-X. Dinding Kami kemudian mengukur kekuatan tekanan yang berlaku bola ke dinding dan output nilai-1g pada sumbu X:

Perhatikan bahwa accelerometer benar-benar akan mendeteksi kekuatan yang diarahkan dalam arah yang berlawanan dari vektor percepatan. Gaya ini sering disebut Angkatan Inertial atau Angkatan fiktif. Satu hal yang harus belajar dari ini adalah bahwa langkahlangkah percepatan accelerometer secara tidak langsung melalui kekuatan yang diterapkan pada salah satu dinding itu (mungkin menjadi musim semi di analogi kardus kami, atau dasi semikonduktor dalam accelerometer nyata). Gaya ini dapat disebabkan oleh percepatan, tapi seperti yang akan kita lihat dalam contoh berikut tidak selalu disebabkan oleh percepatan.

Jika kita mengambil model kita dan menaruhnya di atas bumi, bola akan jatuh pada Zdinding dan akan menerapkan kekuatan 1g di dinding bawah, seperti yang ditunjukkan pada ilustrasi di bawah ini:

Dalam hal ini kotak tidak bergerak tapi kita masih mendapatkan pembacaan-1g pada sumbu Z. Tekanan bahwa bola telah diterapkan pada dinding disebabkan oleh kekuatan gravitasi. Secara teori, itu bisa menjadi tipe yang berbeda dari kekuatan, misalnya, jika Anda membayangkan bahwa bola kami adalah logam, menempatkan magnet di samping kotak bisa bergerak sehingga bola hits dinding lain. Hal ini menggambarkan bahwa pada dasarnya, sebuah tindakan tidak accelerometer kekuatan percepatan. Ini hanya terjadi percepatan yang menyebabkan kekuatan inersia yang ditangkap oleh mekanisme deteksi kekuatan accelerometer. Sejauh ini kita telah melihat output accelerometer pada sumbu tunggal dan ini adalah semua yang tersedia dengan accelerometer sumbu tunggal. Nilai riil dari accelerometers triaksial berasal dari fakta bahwa mereka dapat mendeteksi gaya inersia pada ketiga sumbu. Mari kita kembali ke model kotak kami, dan putar 45 derajat ke kanan. Bola akan menyentuh dua dinding sekarang: Z-dan X-seperti yang ditunjukkan pada ilustrasi di bawah ini:

Nilai 0,71 tidak sewenang-wenang, mereka sebenarnya pendekatan untuk sqr (1 / 2). Ini akan menjadi lebih jelas saat kita memperkenalkan model berikutnya kami untuk accelerometer. Dalam model sebelumnya kita sudah tetap gaya gravitasi dan diputar kotak imajiner kita. Dalam dua contoh terakhir kita telah melihat output dalam dua posisi kotak yang berbeda, sedangkan vektor gaya tetap konstan. Sementara ini berguna dalam memahami bagaimana berinteraksi dengan accelerometer kekuatan luar, itu lebih praktis untuk melakukan perhitungan jika kita memperbaiki sistem koordinat terhadap sumbu accelerometer dan membayangkan bahwa vektor gaya berputar di sekitar kita.

Melihat ilustrasi di atas, bayangkan bahwa setiap sumbu dalam model tegak lurus ke wajah

masing-masing kotak dalam ilustrasi sebelumnya. R vektor adalah vektor gaya yang accelerometer adalah mengukur (itu bisa baik gaya gravitasi atau gaya inersia dari contoh di atas atau kombinasi dari keduanya). Rx, Ry, Rz adalah proyeksi dari vektor R pada X, Y, dan Z sumbu. Perhatikan relasi berikut: Persamaan 1. R ^ 2 = Rx ^ 2 + Ry ^ 2 + Rz ^ 2 Ini pada dasarnya adalah setara dengan Teorema Pythagoras, tetapi dalam 3D. Ingat bahwa nilai-nilai sqr (1 / 2) ~ 0,71 tidak acak. Jika mereka dimasukkan ke dalam rumus di atas, setelah mengingat bahwa kekuatan gravitasi kami adalah 1 g kami dapat memverifikasi bahwa: 1 ^ 2 = (-sqr (1 / 2)) ^ 2 + 0 ^ 2 + (-sqr (1 / 2)) ^ 2 hanya dengan menggantikan R = 1, Rx =-sqr (1 / 2), Ry = 0, Rz =-sqr (1 / 2) dalam persamaan 1 Nilai-nilai Rx, Ry, dan Rz sebenarnya linear terkait dengan nilai-nilai yang nyata akan accelerometer output dan berada dalam bentuk yang dapat digunakan untuk melakukan berbagai perhitungan. Kita akan melanjutkan dengan contoh sederhana. Di meja saya, 10-bit ADC dewan Amicus18 memberikan nilai berikut untuk tiga saluran accelerometer (sumbu), ketika dewan itu miring ke kanan dan ke depan: AdcRx = 513 485 AdcRy = 541 480 AdcRz = 687 502 Dalam rangka untuk mengkonversi nilai 10-bit ADC dengan tegangan kita menggunakan rumus berikut: VoltsRx = AdcRx * 3,3 / 1023 Menerapkan rumus ini untuk semua tiga saluran kita mendapatkan: VoltsRx = 513 * (3.3V / 1023) = ~ 1.65V (kita semua bulat hasil untuk 2 poin desimal) VoltsRy = 540 * (3.3V / 1023) = ~ 1.74V VoltsRz = 687 * (3.3V / 1023) = ~ 2.21V Accelerometer memiliki tingkat nol-g tegangan, yang dapat ditemukan dalam datasheet, atau lebih baik masih menggunakan "MMA7260_Accelerometer_Simple.bas" program dan perhatikan nilai-nilai dari terminal serial kapan perisai pendamping duduk horizontal di tingkat meja. ini adalah tegangan yang sesuai dengan 0g. Perisai pendamping perlu pindah ke sisi kanan itu untuk mengambil pembacaan 0g dari sumbu Z dengan benar. Dalam percobaan, nilai-nilai 0g untuk pengaturan sensitivitas 1,5 adalah:

VoltsRx = 1.57V VoltsRy = 1.55V VoltsRz = 1.65V Untuk mendapatkan nilai tegangan ditandatangani kita perlu menghitung pergeseran dari tingkat ini. Sebagai contoh, jika tingkat tegangan 0g kami adalah 1.57V. Kami menghitung pergeseran tegangan dari tegangan nol-g sebagai berikut: DeltaVoltsRx = 1.65V - 1.57V = 0.08V DeltaVoltsRy = 1.74V - 1.55V = 0.19V DeltaVoltsRz = 2.21V - 1.65V = 0.56V Kami sekarang memiliki accelerometer kami bacaan dalam Volt, tapi masih tidak di g (9,8 m / s ^ 2), untuk melakukan konversi akhir kita menerapkan sensitivitas accelerometer, biasanya dinyatakan dalam mV / g. Sensitivitas nilai dapat ditemukan di datasheet accelerometer, dan yang dipilih dengan MMA7260, yaitu 800mV / g, 600mV / g, 300mV / g, dan 200mV / g. Untuk mendapatkan nilai-nilai kekuatan akhir dinyatakan dalam g kita menggunakan rumus berikut: Rx = DeltaVoltsRx / Sensitivitas Rx = 0.08V / 0.6V / g = ~ 0.13g Ry = 0.19V / 0.6V / g = ~ 0.31g Rz = 0.56V / 0.6V / g = ~ 0.93g Kami sekarang memiliki ketiga nilai-nilai yang mendefinisikan vektor gaya inersia kami. Jika kita perlu menghitung kecenderungan dari perangkat relatif terhadap tanah kita dapat menghitung sudut antara vektor dan sumbu Z. Jika kita tertarik dalam arah sumbu per kecenderungan kita bisa membagi hasil ini menjadi dua komponen. yaitu kecenderungan pada sumbu X dan Y yang dapat dihitung sebagai sudut antara vektor gravitasi dan X / Y sumbu. Menghitung sudut-sudut ini lebih sederhana daripada yang Anda bayangkan, sekarang kita telah menghitung nilai untuk Rx, Ry dan Rz.

Sudut bahwa kita tertarik adalah sudut antara X, Y, dan sumbu Z dan vektor gaya R. Kita akan mendefinisikan ini sebagai Axr sudut, Ayr, AZR. Ilustrasi di atas menunjukkan sebuah segitiga siku dibentuk oleh R dan Rx: cos (Axr) = Rx / R dan juga: cos (Ayr) = Ry / R cos (AZR) = Rz / R Kita dapat menyimpulkan dari persamaan sebelumnya 1 bahwa R = sqr (Rx ^ 2 + Ry ^ 2 + Rz ^ 2). Jadi kita sekarang dapat menghitung sudut dengan menggunakan compiler yang ACOs () fungsi (invers cos () fungsi): Axr = ACOs (Rx / R) Ayr = ACOs (Ry / R) AZR = ACOs (Rz / R) Sudut masih dalam radian, sehingga konversi ke derajat disebut untuk. Ini hanyalah sebuah perkalian oleh 180 konstan / 3.14: AXD = Axr * (180 / 3,14) Ayd = Ayr * (180 / 3,14) Azd = AZR * (180 / 3,14) Teori di atas dibuat praktis dalam program yang tercantum di bawah. Ini akan menampilkan kekuatan g dan sudut pada terminal serial. Program ini juga dapat didownload dari sini: MMA7260_Accelerometer_Gravity.bas .

Anda mungkin juga menyukai