Penguasa CCD: dimakan dengan apa


Pada artikel ini saya ingin menyajikan pengalaman saya dalam menggunakan fotodetektor CCD linier. Garis CCD seperti itu dapat digunakan dalam desain spektrometer darurat, pembaca barcode, sensor posisi atau penyimpangan sinar laser, pemindai untuk foto atau film, dan banyak lagi. Dalam kasus saya, itu adalah pemindai laser, yang tidak dapat saya uraikan di jaringan.

Apakah yang dimaksud dengan perangkat yang ditambah biaya?

Paling sering, ketika berbicara tentang CCD, mereka berarti berbagai fotodetektor. Lebih jarang, ini adalah perangkat memori: register geser, saluran tunda. Pada intinya, perangkat ini agak mengingatkan pada memori pada domain magnetik silindris, hanya pada silikon - dengan bantuan gelombang perjalanan medan listrik yang dibuat oleh sistem elektroda, gumpalan pembawa muatan yang entah bagaimana terbentuk di dalamnya bergerak melalui semikonduktor. Dengan demikian, kita mendapatkan register geser yang memiliki struktur yang sangat sederhana dan mampu mengingat tidak hanya urutan unit digital dan nol, tetapi juga sinyal analog.

Dalam penerima gambar CCD, justru kemampuan struktur ini yang digunakan untuk secara berurutan mengeluarkan biaya yang terakumulasi di bawah masing-masing piksel struktur. Selain itu, sistem gerbang yang sama yang digunakan untuk memindahkan muatan selama paparan menciptakan sumur potensial di mana muatan ini terakumulasi (atau lubang ini dibuat selama pembentukan struktur - mirip dengan saluran transistor MOS yang diinduksi dan diinduksi). Struktur yang lebih kompleks termasuk gerbang resistif di mana kemiringan potensial yang mulus terbentuk (ini adalah bagaimana garis CCD Hamamatsu S11155 diatur), serta pemisahan akumulasi muatan dan zona transfer - biaya akumulasi dari seluruh garis pertama-tama ditransfer ke garis buffer dan kemudian maju keluar di sepanjang yang terakhir.
Kesederhanaan struktur internal diterjemahkan ke dalam kompleksitas pengelolaannya. Bahkan versi paling sederhana dari garis CCD memerlukan generasi dua atau tiga fase sinyal bentuk kompleks dengan tingkat tegangan berbeda dengan tepi curam (dengan kapasitansi input tinggi 1000 pF atau lebih), bergeser relatif satu sama lain. Penguasa tipe Hamamatsu S11155 membutuhkan sebanyak delapan sinyal berbeda dengan level tegangan tinggi dan rendah yang berbeda di kedua sisi nol.
Untungnya, beberapa perusahaan (misalnya, Sony) merilis garis di mana semua kerumitan ini terbentuk langsung pada chip. Dan untuk pekerjaan mereka, Anda hanya perlu menghasilkan dua sinyal: rana elektronik pembuka selama durasi pencahayaan, dan jam. Dalam desain kami, ini persis garis ILX554: itu (sebagai aturan, digunakan, tetapi cukup fungsional) mudah dibeli dari Cina di Aliexpress.

Mari kita lihat lembar data

Dan kita melihat bahwa hanya 6 dari 22 pin kasus yang terlibat, yaitu catu daya + 5V, sinyal input ROG dan CLK, sinyal output Vout, input pemilihan mode SHSW, dan ground. Dan itu saja.
ROG adalah kontrol rana elektronik (dan dimulainya transfer biaya dari jalur fotosensitif ke register shift langsung). Dia memiliki level aktif - nol. Untuk mengekspos matriks, harus ditekan ke nol dan tahan selama diperlukan - dari 5 μs hingga beberapa detik. Dan kemudian, melepaskan, tunggu setidaknya 3 μs (selama ini, sirkuit transfer muatan berhasil). Selama ini di pintu masuk CLK kami menjaga level tinggi. Dan kemudian Anda dapat membaca baris, menerapkan input CLK berliku-liku dengan frekuensi dari beberapa puluh kilohertz ke 2 MHz. Dalam hal ini, pada setiap perbedaan dari satu ke nol, piksel berikutnya akan didorong ke output. Ada 2088 piksel dalam barisan, yang 2048 berfungsi, peka terhadap cahaya (pada kenyataannya, itu beberapa lagi, tetapi piksel terluar sebagian dikaburkan). Datashit merekomendasikan penerapan setidaknya 2090 pulsa CLK ke matriks untuk operasi yang benar.
Dan bagaimana itu akan didorong tergantung pada apa yang ada di input SHSW. Jika ini adalah unit logis, maka output akan menghasilkan sinyal yang agak rumit:

Terlebih lagi, ketika CLK berubah dari nol ke satu, terjadi reset, dan dari satu ke nol - penerbitan sinyal yang bermanfaat.
Dan pada nol pada input SHSW, sirkuit penyimpanan-pengambilan sampel bawaan dihidupkan, yang menyederhanakan sinyal ini menjadi sinyal video langkah-demi-langkah yang sederhana, di mana dengan setiap transisi baru CLK ke nol, level sinyal piksel berikutnya hanya muncul dan ditahan untuk seluruh periode sinyal CLK.
Kisaran yang berguna dari sinyal output berasal dari tingkat gelap tertentu, yang menurut datasheet adalah 2,85 V, tetapi dalam kenyataannya bisa berbeda (di baris saya - sekitar 3 V), dan ketika jenuh, tingkat sinyal output turun menjadi 1,5-2 B.
Secara umum, hanya itu yang perlu kita ketahui tentang garis ini.

Sirkuit inklusi


Sederhana dan jelas. Kami menghasilkan sinyal CLK dan ROG secara terprogram menggunakan MK, dan pemicu Schmitt pada input adalah cara paling sederhana untuk beralih dari 3,3 V ke 5 V. Faktanya adalah bahwa tidak ada buffer dalam garis-garis ini dalam garis, dan agar sirkuit internal matriks bekerja dengan benar Anda harus menyerahkan kepada mereka berliku-liku dengan skala penuh dari nol hingga lima volt dan kecuraman yang baik dari front. NC7SZ14M5X yang ditunjukkan dalam diagram adalah pemicu pemicu Schmitt tunggal yang sangat nyaman dengan bagian depan yang curam dan peningkatan kapasitas beban, dan saya sering menggunakannya di proyek saya.
Menggunakan DA1, level sinyal video dari lineup “berakselerasi” ke kisaran di mana ADC beroperasi, sementara “stand” sekitar 1,5 V yang sesuai dengan level saturasi dihilangkan. Karena perbedaan antara amplitudo sinyal dan nilai "tegakan" sangat bervariasi di antara susunan garis CCD yang berbeda, resistansi R1 dan R3 harus dipilih dengan "meletakkan" sinyal keluaran dalam kisaran yang diperlukan. Harus diingat bahwa tidak hanya perpindahan, tetapi juga keuntungan tergantung pada resistansi R1, jadi Anda harus memilihnya terlebih dahulu.
L1 dan L2 adalah manik-manik ferit atau choke kecil untuk 1-2 μG ukuran bingkai 0805 atau 0603. Resistor dan kapasitor digunakan dengan ukuran yang sama. Rangkaian dirakit pada papan dua sisi dengan pemasangan di permukaan. Saya tidak membawa tata letak papan, karena saya masih memiliki banyak hal di atasnya.

Implementasi perangkat lunak pada MK

Tugas MK adalah untuk menghasilkan sinyal ROG tingkat tinggi (jangan lupakan inverter!) Dari durasi yang diperlukan, maka jeda pendek (3-10 μs) berhenti, dan setelah itu urutan 2090 pulsa tingkat tinggi dipisahkan oleh jeda yang sama dalam durasi. Selama pulsa ini (atau jeda), beberapa saat setelah bagian depan, nilai penerangan piksel diambil menggunakan on-board atau ADC eksternal. Setelah membaca bingkai, Anda juga harus berhenti sampai pulsa ROG baru - 3-10 μs yang sama. Setelah menyalakan daya dan, ternyata, setelah lama (lebih dari 100 ms) tidak digunakannya penggaris, Anda perlu "membersihkannya" dengan menerapkan kereta pulsa standar gratis ke CLK beberapa kali.
Pada STM32, sebaiknya lakukan semua ini pada interupsi timer. Dengan mengatur timer untuk menghasilkan interupsi dengan frekuensi yang sesuai dengan frekuensi piksel berlipat ganda, kami membuat setiap operasi timer menjadi interupsi, di mana kami secara bergantian menghasilkan nol atau satu ke port, dan ketika kami mengeluarkan nol, kemudian kami membaca bacaan dari ADC. Dan setelah menghitung 2090 siklus, kami menghentikan timer. Untuk membaca frame berikutnya, Anda perlu mengatur ulang penghitung siklus ke nol, mulai timer dan tunggu sampai semuanya dihitung.
Sesuatu seperti ini, seperti yang ditunjukkan dalam cuplikan kode ini.

bool clkState = false; bool frameOk = true; uint16_t pixCount = 0; uint16_t ccdFrame[2090]; inline uint16_t readADC1(void) //            { . . . } void Delay(unsigned int Val) //     { for( ; Val != 0; Val--) __NOP(); } void readCCD(void) //   - { pixCount = 0; //    frameOk = false; //   TIM_Cmd(TIM6, ENABLE); //   while(frameOk == false); // ,     } // ...    ... // void TIM6_IRQHandler(void) /*      -     CLK       */ { if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET) { if(clkState == true) //   (.0)      { clkState = false; GPIOB->ODR &= ~GPIO_ODR_ODR_1; //      Delay(3); //  ,        ccdFrame[pixCount] = readADC1(); } else //   (.1) { pixCount++; clkState = true; GPIOB->ODR |= GPIO_ODR_ODR_1; //      } if(pixCount >= 2090) //    ,      { pixCount = 0; frameOk = true; TIM_Cmd(TIM6, DISABLE); } TIM_ClearITPendingBit(TIM4, TIM_IT_Update); } } 


Dan inilah hasilnya
Hasilnya tidak buruk. Terlepas dari kenyataan bahwa ADC bawaan tidak memiliki karakteristik apa pun, karakteristik derauinya sepenuhnya sesuai dengan derau garis CCD. Jalur derau dari sinyal gelap dengan waktu akumulasi sekitar 1 ms ternyata ~ tingkat kuantisasi 3-4, dan ketika menggunakan 14-bit ADC eksternal dengan karakteristik yang sangat baik, hasilnya hanya sedikit lebih baik. Dengan peningkatan penerangan, noise meningkat karena alasan sederhana: jumlah fotoelektron pada masing-masing piksel tidak begitu besar (menurut perhitungan saya, sekitar 30 ribu pada saturasi). Untuk perangkat terbaik, nilai ini mencapai 200 ribu.
Pada bagan di bawah ini adalah contoh dari "gambar" terdaftar oleh penguasa, di mana dengan latar belakang dinding diterangi ada dudukan gelap di mana bola berongga kaca dengan diameter 1 cm tetap di dalamnya diisi dengan larutan hitam. Puncak adalah refleksi dari permukaan luar bola ini. Kebisingan di area terang adalah struktur dinding itu sendiri, diperkuat oleh bintik-bintik dari laser, dari bingkai ke bingkai itu tetap diam. Kebisingan garis nyata jauh lebih sedikit.
gambar


Garis serupa lainnya
Beberapa garis hitam dan putih SONY CCD 2048-pixel lainnya oleh ILX511, ILX551 (yang terakhir memiliki pinout yang berbeda dan membutuhkan dua tegangan suplai - 5 dan 9 V), berbeda dalam ukuran piksel transversal (dari 14 hingga 200 mikron) bekerja dengan cara yang sama persis. dan sensitivitas spektral (ILX554A adalah merah dan IR-sensitif, mirip dengan indeks B memiliki sensitivitas berkurang di wilayah IR dan sensitivitasnya dekat dengan mata, dan ILX511B lebih sensitif terhadap biru). Karakteristik dinamisnya berbeda: kisaran dinamis ILX551B karena ukuran piksel kecil mencapai 6000 (garis kami mencapai DD ini dengan kecepatan rana pendek sekitar 10 μs).

* * *
Artikel ini membahas koneksi barangkali jalur CCD yang paling mudah digunakan. Kesederhanaan ini disebabkan oleh kenyataan bahwa semua kompleksitas tersembunyi di dalam dirinya di bawah tenda. Jika bukan untuk driver bawaan, saya harus menghasilkan banyak sinyal bertingkat.
Sayangnya, dengan standar modern, garis CCD dengan driver bawaan tidak memiliki karakteristik terbaik. Jadi, di baris ini, rentang dinamis, yang didefinisikan sebagai rasio sinyal saturasi terhadap sinyal gelap, adalah 333: 1, dan didefinisikan sebagai rasio sinyal saturasi terhadap sinyal minimum yang terdeteksi dengan latar belakang kebisingan - sekitar 1000: 1. Tetapi perangkat seperti itu tidak hanya sulit digunakan, tetapi seringkali sulit diakses (Hamamatsu yang sama membutuhkan formalitas birokrasi yang rumit ketika membeli array CCD dan fotodetektor lain karena tujuan ganda dari produk ini). Namun, kinerja tinggi seperti itu tidak selalu diperlukan, dan untuk banyak tujuan, parameter perangkat ini cukup dapat diterima.

Source: https://habr.com/ru/post/id457762/


All Articles