Memperbaiki... Hama Pertumbuhan 

AVR. Deskripsi pengoperasian ADC. Register ADC konverter analog-ke-digital

Dalam pelajaran terakhir, kami merakit programmer pertama kami dan mem-flash MK dengannya. Selamat atas proyek nyata pertama Anda. Memkedipkan LED tentu saja bagus, tapi mari kita lakukan sesuatu yang lebih menarik. Hari ini saya akan memberi tahu Anda cara bekerja dengan ADC (konverter analog-ke-digital). Ayo pergi. Sebelum kita masuk ke pemrograman, mari kita kembali ke sekolah. Iya iya tepatnya ke sekolah, ke pelajaran aljabar dan mengingat apa itu grafik. Sejak kecil, saya ingat ketika membuat grafik untuk fungsi tertentu, banyak siswa di kelas yang kesal. Iya ya, grafiknya saja yang tidak jelas, sama seperti vektornya. Meskipun saya tidak mengerti apa yang ada di sana. Atau mungkin gurunya kurang menjelaskannya dengan baik. Baiklah, saya akan mencoba menghilangkan titik putih ini. Mereka yang bisa menggambar grafik dengan cepat X = Y mungkin tidak membaca bagian teks ini. Bagi yang belum paham cara melakukannya, ada baiknya membacanya baik-baik. Mari kita lihat ekspresinya X = Y. Kami memiliki hal yang tidak diketahui X dan tidak diketahui kamu. Jika kita mengambil nomor apa pun dan menggantinya, sebutkan di bawah X, maka sesuai kamu akan mengambil nilai yang sama. Tidak perlu dikatakan lagi, karena kita memiliki tanda sama dengan. Bagaimana sekarang kita dapat membuat grafik menggunakan persamaan ini? Dan itu sangat sederhana. Hal pertama yang perlu Anda pahami adalah bahwa grafik apa pun adalah garis lurus atau kurva yang terdiri dari banyak titik. Apa artinya. Artinya jika Anda mengambil spidol dan mencoba menggambar garis lurus, tidak hanya dengan menggambarnya melintasi lembaran, tetapi dengan menempatkan titik-titik satu demi satu, maka Anda akan mendapatkan semacam garis lurus atau kurva. Inilah yang paling mendekati konsep grafik. Namun sekadar garis yang digambar di selembar kertas bukanlah segalanya. Lagi pula, kita perlu membuat garis persis sesuai persamaan. Dan bagaimana cara melakukannya? Di sinilah sumbu koordinat akan membantu kita. Apa itu. Apa yang bisa kamu lakukan dengan penggaris kayu sederhana? Benar sekali, ukur panjangnya. Dan apa? Tentu saja di mm atau cm. Anda mungkin mengajukan pertanyaan bodoh, tetapi Anda salah. Skala yang Anda lihat untuk menentukan panjangnya adalah sumbu koordinat. Dan di unit apa, tidak masalah. Lagi pula, orang Inggris punya satuan inci. Sekarang mari kita bayangkan bahwa penguasa kita memiliki nilai-nilai X-Oh. Dan itu sama dari 0 sampai, katakanlah, 20. Ini berarti bahwa untuk seluruh panjang penggaris kita memiliki 20 tanda masing-masing dari 0 sampai 20. Dan sebut saja itu sumbu X. Mari kita ambil juga penggaris lain dengan 20 tanda dan beri nama sumbu kamu. Sekarang mari kita hubungkan garis-garis ini dengan tanda nol sehingga menjadi garis X berbaring secara horizontal dan kamu Tegak lurus. Gambar 1. Jadi kita mendapat kotak koordinat. Sekarang mari kita coba menggunakan kisi koordinat ini untuk menggambar grafik kita berdasarkan persamaan X = Y X. Mari kita gantikan X nomor 2. Sekarang mari kita menggambar 2 sumbu dari tanda tersebut kamu barisan atas. Karena x kita sama dengan igrik, kita akan menggambar garis lain dari garis 2, tapi kali ini dari sumbu X. Sekarang, dengan melihat kedua garis ini, kita akan menemukan tempat perpotongannya. Jadi, kami telah menemukan salah satu dari banyak titik grafik masa depan kami. Mari kita cari poin lain. Katakanlah itu kamu sama dengan 4. Jadi X, kamu sama dengan 4. Secara teoritis, kita bisa mengakhirinya di situ. Karena sudah jelas, untuk nilai berapa pun mengambil nilai yang sama, dan grafiknya akan terlihat seperti garis lurus sederhana. Tapi kami tidak mempercayainya. Mari kita periksa. Mari kita temukan tiga poin lagi. Misalnya, 6, 8 dan, katakanlah, 18. Setelah menemukan semua titik, mari kita hubungkan dengan garis lurus. Inilah yang saya dapatkan. Gambar 2. Seperti yang Anda lihat, garis lurusnya ternyata lurus. Dan jika diperhatikan lebih dekat, kita dapat menyimpulkan bahwa garis lurus ini memiliki kemiringan dari kedua sumbunya sebesar 45°. Ini mengikuti persamaan dari kedua hal yang tidak diketahui. Mari belajar kimia. Misalnya, mari kita gandakan nilainya X. Sekarang kesetaraan kita akan terwujud X Y=2X . Mari kita coba membuat grafik. Mari kita ambil contoh nilainya sama dengan 2, 4 dan 9. Ini yang saya dapat. Gambar 3.. Hal ini mengarah pada pernyataan bahwa semakin besar koefisien suatu variabel, semakin besar perpindahan garis lurus tersebut dari dirinya sendiri. Nah, hal ini bisa dilihat dari grafik yang diplot. Anda lihat bagaimana garis lurus ditekan terhadap sumbu Y. Nah, kita mengurutkan garis lurus tersebut. Sekarang mari kita membangun sesuatu yang melengkung. Ini tidak berarti bahwa itu adalah bangunan yang buruk. Mari kita ambil persamaan kuadrat klasik. Y = X² (Persegi, ini bukan karena terlihat seperti persegi, tetapi karena ia memiliki salah satu pangkat kedua yang tidak diketahui.) Sekarang mari kita cari empat titik dengan nilai X sama dengan 1, 2, 3 dan 4. Jangan khawatir, grafiknya akan menjadi besar meskipun Xnya kecil. Bagaimanapun, mereka ada di alun-alun kita. Inilah yang saya dapatkan.. Di sini Anda hanya perlu mengingat satu hal: nilai X adalah sudut yang bervariasi dari 0° hingga 360°. Itu adalah giliran penuh. Nilainya mungkin lebih besar, tapi itu hanya revolusi berikutnya, lalu revolusi berikutnya, dan seterusnya. Sekarang mari kita gantikan X nilainya adalah 0°, 90°, 180°, 270° dan 360°. Ya, ya, ini adalah perubahan haluan total. Inilah yang saya dapatkan.
Gambar 5.
Baiklah, kita akan menyelesaikannya dengan grafiknya. Saya harap semuanya jelas. Apa itu digitalisasi sinyal? Izinkan saya segera mencatat bahwa kami tidak akan menganalisis teorema Kotelnikov, karena akan memakan banyak waktu dan banyak pertanyaan akan muncul. Kami akan mencari tahu dengan jari kami. Jadi, digitalisasi adalah pembagian sinyal tertentu menjadi banyak garis lurus kecil. Mari kita ingat parabola kita, yang dibangun dari empat garis lurus. Ini tidak cukup, seperti yang Anda lihat. Cabangnya agak patah. Tetapi jika kita mengambil bukan lima poin, tetapi katakanlah seratus, maka jelas bahwa cabangnya akan terlihat kurang lebih mulus. Bagaimana jika kita mengambil seribu poin? Oke, kita bagi sinyal kita menjadi garis lurus, lalu bagaimana? Dan disini kita akan membutuhkan ilmu yang kita terima di atas. Hanya saja kita akan beralih dari yang sebaliknya. Jika kita memiliki grafik dan salah satu hal yang tidak diketahui, maka kita dapat dengan aman menemukan grafik kedua yang tidak diketahui. Agar lebih jelas, lihat gambar di bawah ini. Gambar 6. X Apa yang kita lihat di sini? Sumbu kamu waktu diplot dalam hitungan detik, dan sepanjang sumbu
Namun seperti yang Anda lihat, ini bukanlah hal yang ingin kami lihat. Kenapa ini terjadi? Namun karena kita sangat jarang mengukur nilai tegangannya. Untuk memperlancar grafik, Anda perlu mengurangi periode pemungutan suara. Artinya, lihat bukan setelah 1 detik, tetapi setelah seperseratus detik. Dan kemudian kita tidak akan mendapatkan 13 poin, tetapi 1300. Apakah ada perbedaan? Sekarang mari kita beralih ke perangkat keras. Bagaimana skema ini diimplementasikan pada perangkat keras. ADC tidak dapat mengingat tegangannya. Lalu bagaimana, Anda bertanya. Dan menurut saya ini cukup sederhana. Lihat disini. Kami mengambil kapasitor dan menerapkan sinyal kami padanya. Saat kapasitor sedang diisi, kita menghitung waktu mundur, misalnya 1 milidetik. Setelah waktu habis, kami berhenti mengirimkan sinyal. Sekarang semuanya sebaliknya, kita mulai mengosongkan kapasitor kita, dan saat ini kita menghitung dari nol hingga akhir pelepasan kapasitor. Angka yang dihasilkan adalah titik yang muncul pada grafik setelah 1 milidetik. Di MK prosedur ini disebut “sampling”. Baiklah, sepertinya kita sudah selesai dengan teorinya, mari kita lanjutkan ke praktiknya. Kami membutuhkan Atmega8 MK. MK ini memiliki 6 saluran ADC 10-bit, dua di antaranya 8-bit. Untuk mulai bekerja dengan ADC, kita hanya memerlukan tegangan referensi. Mari kita mulai dengan 5 volt. Ini berarti digitalisasi sinyal dimungkinkan dari 0 hingga 5 volt. Karena salurannya 10-bit, maka diperoleh 5/2 10 = 0,0048 V per unit. Artinya jika ADC kita menghasilkan angka 482 pada saat sampling, maka tegangannya akan sama dengan 482 * 0,0048 = 2,3136 V. Pada prinsipnya akurasinya baik. Berdasarkan parameter yang ditentukan, MK menghasilkan 15.000 sampel per detik. Dari sini grafik kita dapat dibagi menjadi 14999 garis lurus. Pertama mari kita buat diagramnya agar lebih jelas. Angka 8.
Beberapa klarifikasi. LCD 16x2 dihubungkan ke port B MK. Sekarang saya tidak akan menjelaskan secara detail cara kerjanya, itu tidak ada dalam pelajaran ini. Hubungkan saja seperti yang ditunjukkan pada gambar. Pin AREF dan AVCC terhubung ke 5V. Inilah ketegangan abutment. Di port C, kontak dengan voltmeter dan resistor variabel dihubungkan ke digit nol untuk mengubah tegangan input. Tugas kita adalah ini. Kita harus menampilkan nilai tegangan yang ditunjukkan voltmeter. Mari kita mulai pemrograman. Kami meluncurkan proyek baru. Pada pengaturan Chip, pilih Atmega8, 4.00000000 MHz. Di tab LCD, pilih PORTB. Dan kami menyimpan proyek dengan nama, dalam kasus saya, ADC. Anda dapat menyebutnya apa pun yang Anda inginkan. Pertama-tama, kami menambahkan dua arahan praprosesor untuk bekerja dengan teks dan penundaan. Untuk melakukan ini, setelah arahan LCD, tambahkan dua baris ini. #termasuk #termasuk Yang pertama diperlukan untuk membuat penundaan, dan yang kedua untuk bekerja dengan teks. Selanjutnya kita perlu membuat array untuk menyimpan sementara teks yang diformat. Setelah tulisan "// Deklarasikan variabel global Anda di sini" kami menulis string char;. // Deklarasikan variabel global Anda di sini string karakter; Sekarang setelah membuka fungsi main main, kita harus mendeklarasikan dua variabel. Satu untuk menyimpan nilai setelah pengambilan sampel, dan yang lainnya untuk menyimpan nilai keluaran. Untuk melakukan ini, mari kita tulis seperti ini. batal utama(batal) ( // Deklarasikan variabel lokal Anda di sini ke dalam data; // Variabel untuk menyimpan data sampel. int karena registernya 10 bit. mengapung V; // Variabel untuk nilai keluaran. float karena kami memiliki presisi hingga 2 digit. Sekarang mari kita mulai menyiapkan ADC itu sendiri. Untuk melakukan ini, setelah menyiapkan komparator, kami akan segera menuliskan dua baris. // Inisialisasi Komparator Analog // Komparator Analog: Mati // Pengambilan Input Komparator Analog berdasarkan Timer/Penghitung 1: Mati ACSR=0x80; SFIOR=0x00; ADMUX=0; // Baris pertama, nomor port. ADCSR=0x85; // Pengaturan ADC baris kedua. Baiklah, semuanya jelas dengan nomor port, nomor mana yang terdaftar dan itulah yang sedang kami kerjakan, tapi mari kita bahas lebih detail pengaturannya di sini. Untuk mulai bekerja dengan ADC, MK memiliki register yang disebut ADCSR. Apa yang ada di dalam itu? bit ke-0 ADPS0 Pemilihan frekuensi konversi bit pertama ADPS1 Pemilihan frekuensi konversi bit ke-2 ADPS2 Pemilihan frekuensi konversi bit ke-3 SEBUAH KEMATIAN Interupsi mengaktifkan bit ke-4 ADIF Interupsi bendera bit ke-5 ADFR Memilih pengoperasian ADC. 1-kontinyu 0-on ADSC memicu bit ke-6 IKLAN Mulai transformasi 1-mulai. Setelah konversi, perangkat keras menyetel ulang ke nol. bit ke-7 Resolusi operasi ADC 1-ya 0-tidak Sekarang mari kita konfigurasikan. Untuk mengaktifkan ADC kita perlu mengatur bit ke 7 menjadi 1. Selanjutnya, setel ke 0 untuk memulai konversi. Nanti kita tarik. Kemudian kita akan mengatur digit ke 5 menjadi 0. Kami akan memulai transformasi sendiri. Kami akan menyetel digit ke-3 dan ke-4 ke 0. Kami tidak akan bekerja dengan interupsi. Sekarang yang tersisa hanyalah memilih frekuensi. Jika Anda membaca manual MK, dikatakan bahwa untuk pengoperasian ADC yang lebih stabil, ADC harus memiliki clock pada frekuensi dalam kisaran 50 kHz - 200 kHz. Karena kita memiliki kuarsa pada 4000 kHz, kita perlu membaginya. Inilah sebabnya kami akan menggunakan tiga digit pertama. Kita lihat tabel koefisien pembagian di bawah ini. Apa yang harus kita pilih? Kami mengambil frekuensi kuarsa dan membaginya dengan koefisien. Bagilah 4000 kHz dengan 8 untuk mendapatkan 500 kHz. Banyak. Sekarang mari kita ubah menjadi 16 dan dapatkan 250 kHz, yang juga agak berlebihan. Bagilah dengan 32 dan kita mendapatkan 125 kHz. Hanya apa yang Anda butuhkan. Kami tetap berada dalam batasan yang diberikan. Kita melihat tabel dan melihat bahwa koefisien 32 ditentukan oleh nilai angka 101. Sepertinya kita sudah mendapatkan semuanya. sekarang mari kita lihat register kita. Berikut maknanya. 10000101 Semua nilai semua digit yang dibahas sebelumnya dikumpulkan di sini. Jika kita mengonversi nomor ini ke HEX kita mendapatkan 0x85. Sekarang Anda mengerti mengapa saya menulis di register ADCSR nilai 0x85. Pengaturan ADC selesai. Sekarang mari kita cetak niat kita pada baris pertama. Untuk melakukan ini, setelah menginisialisasi LCD, tuliskan satu baris. lcd_putsf("Bekerja dengan ADC"); // inisialisasi modul LCD lcd_init(16); lcd_putsf("Bekerja dengan ADC"); // Keluarkan entri Sekarang, ketika program dimulai, kita akan melihat tulisan kita di baris pertama. Selanjutnya, dalam perulangan tanpa akhir, kita menulis isi program itu sendiri. sementara (1) ( penundaan_ms(20); // Atur penundaan menjadi 20 milidetik ADCSR |= 0x40; // Tulis 1 ke ADSC data = ADCW; // Kurangi nilainya V = (mengambang) data*0,0048828; // Ubah ke volt sprintf(string, "Data: %1.2f", V); // memformat lcd_gotoksi(0,1); // Atur kursor lcd_puts(string); // Keluarkan nilainya }; Seperti yang Anda perhatikan, keseluruhan program terdiri dari tujuh baris. Mari kita bereskan semuanya. penundaan_ms(20); Ini adalah fungsi yang akan membuat penundaan sebesar 20 milidetik. ADCSR |= 0x40; Di sini kita melakukan bitwise OR. Angka 0x40 dalam biner terlihat seperti ini: 0b01000000. Jika kita melakukan bitwise OR dengan 0x85 (0b10000101), maka kita akan menulis 1 di bit ke-6. Ingat apa yang perlu dilakukan untuk memulai konversi. Ya, ya, di bit ke-6 Anda perlu menulis 1. Dan setelah konversi, itu akan diatur ulang ke 0 oleh perangkat keras. data = ADCW; Setelah konversi, MK menulis nilai yang dihasilkan ke register ADCW. Jadi kami menariknya keluar dari sana. V = (mengambang) data*0,0048828; Di sini kita mengubah angka yang dihasilkan menjadi volt. Karena tegangan referensi kita adalah 5V, dan nilai registernya adalah 1024, maka kita mempunyai 5/1024=0,0048828 Ini adalah koefisien tegangan. Nah, atau nilai tegangan minimum pada nilai minimum register ADCW. Artinya, jika register berisi nilai 1, maka nilai tegangannya akan sama dengan 0,0048828 V. Oleh karena itu, pada saluran tersebut kita kalikan data ADCW dengan 0,0048828. Kata float di dalam kurung diperlukan untuk mengubah variabel data dari integer menjadi floating-point nyata. sprintf(string, "Data: %1.2f", V); Di sini kita memasukkan nilai tegangan ke dalam array string dengan format. Pertama kita akan memasukkan Data: . Diikuti dengan tanda persentase. Ini memberi tahu Anda berapa banyak karakter yang akan dihasilkan. 1.2f mengatakan bahwa kita ingin menampilkan satu tempat desimal dan 2 tempat desimal setelahnya, dan huruf f mengatakan bahwa kita berurusan dengan nilai floating-point. lcd_gotoksi(0,1); Ya, semuanya jelas di sini. Tempatkan kursor pada posisi nol pada baris kedua. lcd_puts(string); Kami menampilkan nilainya di layar. Sebelum merakit proyek, Anda perlu melakukan beberapa penyesuaian kecil. Buka pengaturan proyek "Proyek-> Konfigurasi" dan di jendela yang terbuka, buka tab "Kompiler C" Selanjutnya di pojok kiri bawah, ubah nilainya (s) Fitur printf: Dengan int, lebar pada float, lebar, presisi. Saya akan memberi tahu Anda mengapa ini diperlukan dalam artikel tentang bekerja dengan layar LCD, tetapi sekarang ubah saja. Itulah keseluruhan programnya. Gambar di bawah menunjukkan cara kerjanya. Gambar 9.

ADC – konverter analog-ke-digital (ADC-Analog-to-Digital Converter). Mengubah sinyal analog menjadi sinyal digital. Kedalaman sedikit ADC menentukan keakuratan konversi sinyal. Waktu konversi adalah kecepatan operasi ADC yang sesuai. ADC dibangun di banyak mikrokontroler keluarga AVR dan menyederhanakan penggunaan mikrokontroler di sirkuit kontrol mana pun yang memerlukan digitalisasi sinyal analog tertentu.

Mari kita lihat prinsip pengoperasiannya ADC. Untuk konversinya kita memerlukan sumber tegangan referensi dan tegangan aktual yang ingin kita digitalkan (tegangan yang dikonversi harus lebih kecil dari tegangan referensi). Kita juga membutuhkan register dimana nilai yang dikonversi akan disimpan, sebut saja Z. Tegangan input = Tegangan referensi*Z/2^N, di mana N adalah ukuran bit ADC. Mari kita sepakati bahwa register ini, seperti ATmega8, adalah 10-bit. Transformasi dalam kasus kami terjadi dalam 10 tahap. MSB Z9 diatur ke satu. Selanjutnya, tegangan dihasilkan (Tegangan referensi*Z/1024), tegangan ini dibandingkan dengan masukan menggunakan komparator analog, jika lebih besar dari masukan, bit Z9 menjadi sama dengan nol, dan jika lebih kecil maka tetap satu. Selanjutnya kita beralih ke bagian kecil Z8 dan menggunakan metode yang dijelaskan di atas kita memperoleh nilainya. Setelah perhitungan register Z selesai, tanda tertentu disetel, yang menandakan bahwa konversi telah selesai dan nilai yang dihasilkan dapat dibaca. Keakuratan konversi dapat sangat dipengaruhi oleh interferensi dan interferensi, serta kecepatan konversi. Semakin lambat transformasi terjadi, semakin akurat transformasi tersebut. Kebisingan dan interferensi harus diatasi dengan menggunakan induktansi dan kapasitansi, seperti yang disarankan pabrikan dalam lembar data:

Dalam mikrokontroler AVR pin dapat digunakan sebagai sumber tegangan referensi AREF, atau sumber internal 2.56V atau 1.23V. Selain itu, sumber tegangan referensi dapat berupa tegangan suplai. Beberapa casing dan model mikrokontroler memiliki pin terpisah untuk memberi daya pada ADC: AVCC Dan AGND. kesimpulan ADCn– saluran ADC. Dari saluran mana sinyal akan didigitalkan dapat dipilih menggunakan multiplexer.
Sekarang mari kita tunjukkan dengan contoh apa yang dikatakan di atas. Mari kita buat model yang berfungsi seperti voltmeter dengan skala digital. Mari kita sepakat bahwa tegangan terukur maksimum adalah 10V. Biarkan juga tata letak kita menampilkan isi register pada LCD ADC.

Untuk memperbesar, klik pada diagram.

Menghubungkan mikrokontroler dan LCD WH1602A standar. X1– Resonator kuarsa 4 MHz, kapasitor C1, C2– 18-20 hal. R1-C7 rangkaian pada pin reset masing-masing adalah 10 kOhm dan 0,1 µF. Sinyal LED D1 dan membatasi resistor R2 200 Ohm dan R3– 20 ohm. Penyesuaian kontras LCD – VR1 pada 10 kOhm. Kami akan menggunakan sumber tegangan referensi 2.56V bawaan. Menggunakan pembagi R4-R5 kita akan mencapai tegangan maksimum 2.5V pada input PC0, dengan tegangan pada probe 10V. R4– 3 kOhm, R5– 1 kOhm, ratingnya harus diperhatikan dengan hati-hati, tetapi jika tidak memungkinkan untuk memilih nilai yang sama persis, Anda dapat membuat pembagi resistif 1:4 dan mengoreksi pembacaan secara terprogram jika perlu. Induktor 10 µH dan kapasitor 0,1 µF untuk menghilangkan kebisingan dan interferensi ADC tidak ditampilkan pada diagram. Kehadirannya tersirat dengan sendirinya jika digunakan ADC. Sekarang terserah programnya:

(kodesitisasi style="brush: xml;") #include

#definisikan RS 2 //RS=PD2
#definisikan E 3 //E=PD3

#define TIME 10 //Konstanta waktu tunda untuk LCD
//Frekuensi pencatatan MK - 4 MHz

#define R_division 3.837524 //= Konstanta R4/R5

Tidak ditandatangani int u=0; //Variabel global dengan isi transformasi

Batal jeda (unsigned int a)
{
tidak ditandatangani ke dalam saya;
untuk (i=a;i>0;i--);
}

Void lcd_com (unsigned char lcd) //Mentransmisikan perintah LCD
{
suhu karakter yang tidak ditandatangani;

Suhu=(lcd&~(1<PORTD=suhu; //Keluarkan tetrad paling signifikan dari perintah, RS, sinyal E ke portD
PORTD=suhu&~(1<
suhu=((lcd*16)&~(1<PORTD=suhu; //Keluarkan perintah tetrad orde rendah, sinyal RS, E ke portD
asm("tidak"); //Penundaan kecil 1 siklus MK, untuk stabilisasi
PORTD=suhu&~(1<
jeda(10*WAKTU); //Jeda untuk eksekusi perintah
}

Void lcd_dat (unsigned char lcd) //Menulis data ke LCD
{
suhu karakter yang tidak ditandatangani;

Suhu=(lcd|(1<PORTD=suhu; //Output sinyal tetrad, RS, E data paling signifikan ke portD
asm("tidak"); //Penundaan kecil 1 siklus MK, untuk stabilisasi
PORTD=suhu&~(1<
suhu=((lcd*16)|(1<PORTD=suhu; //Output sinyal tetrad, RS, E data orde rendah ke portD
asm("tidak"); //Penundaan kecil 1 siklus MK, untuk stabilisasi
PORTD=suhu&~(1<
jeda(WAKTU); //Jeda untuk keluaran data
}

Void lcd_init (void) //Inisialisasi LCD
{
lcd_com(0x2c); //antarmuka 4 kabel, ukuran karakter 5x8
jeda(100*WAKTU);
lcd_com(0x0c); //Tampilkan gambar, jangan tampilkan kursor
jeda(100*WAKTU);
lcd_com(0x01); //Hapus DDRAM dan atur kursor ke 0x00
jeda(100*WAKTU);
}

Unsigned int getADC(void) //Membaca ADC
( tidak ditandatangani int v;

ADCSRA|=(1<
while ((ADCSRA&_BV(ADIF))==0x00) //Tunggu hingga konversi selesai
;

V=(ADCL|ADCH<<8); br="">kembali v;
}

Batalkan write_data (tidak ditandatangani ke dalam u)
( karakter tidak bertanda tangan saya;
tegangan ganda=0;

Lcd_com(0x84); //Output register ADC pada LCD
untuk (saya=0;saya<10;i++) br="">if ((u&_BV(9-i))==0x00) lcd_dat (0x30);
lain lcd_dat(0x31);

Lcd_com(0xc2);
tegangan= R_divisi*2,56*u*1,024; //Perhitungan tegangan

Saya=tegangan/10000; //Menampilkan tegangan pada LCD
tegangan=tegangan-i*10000;
jika (saya!=0) lcd_dat(0x30+i);

Saya=tegangan/1000;
tegangan=tegangan-i*1000;
lcd_dat(0x30+i);

Saya=tegangan/100;
tegangan=tegangan-i*100;
lcd_dat(0x30+i);

Saya=tegangan/10;
tegangan=tegangan-i*10;
lcd_dat(0x30+i);

Lcd_dat("v");
}

Int utama (batal)
{
DDRD=0xfc;

Jeda (3000); //Penundaan untuk menyalakan LCD
lcd_init(); //Inisialisasi LCD

Lcd_dat("A"); //Tulis "ADC=" dan "U=" pada LCD
lcd_dat("D");
lcd_dat("C");
lcd_dat("=");
lcd_com(0xc0);
lcd_dat("kamu");
lcd_dat("=");

ADCSRA=(1<//Nyalakan ADC, konverter frekuensi jam =/8 dari jam mikrokontroler
ADMUX=(1<//Tegangan referensi internal Vref=2,56, input ADC adalah PC0

Sementara(1)
{
u=dapatkanADC(); //Baca datanya
tulis_data(u); //Tampilkan di LCD
jeda(30000);
}

Kembali 1;
}

Programnya sederhana. Pertama kita menginisialisasi port I/O. Untuk berfungsi sebagai pintu masuk ADC, sematkan PC0 harus bekerja untuk pintu masuk. Selanjutnya kita melakukan inisialisasi LCD Dan ADC. Inisialisasi ADC adalah menyalakannya sebentar Mulai transformasi 1-mulai. Setelah konversi, perangkat keras menyetel ulang ke nol. bit ke-7 di daftar ADCSRA. Dan memilih frekuensi konversi bit ADPS2, ADPS1, ADPS0 dalam register yang sama. Kami juga memilih sumber tegangan referensi, bit REFS1 REFS0 di daftar ADMUX dan pintu masuk ADC: bit MUX0,MUX1,MUX2, MUX3(dalam kasus kami, pintu masuk ADC adalah PC0, Itu sebabnya MUX0,3=0). Selanjutnya, dalam perulangan abadi, kita memulai transformasi dengan menyetel bit Memilih pengoperasian ADC. 1-kontinyu 0-on ADSC memicu bit ke-6 di daftar ADCSRA. Kami menunggu akhir konversi (bit Interupsi mengaktifkan bit ke-4 V ADCSRA menjadi sama dengan 1). Selanjutnya, kami menghapus data dari register ADC dan bawa mereka ke LCD. Ekstrak data dari ADC butuhkan dalam urutan ini: v=(ADCL+ADCH*256); jika digunakan v=(ADCH*256+ADCL);- tidak berfungsi secara langsung. Ada juga trik untuk menghindari bekerja dengan bilangan pecahan. Kapan menghitung tegangan input dalam volt. Kami hanya akan menyimpan voltase kami dalam milivolt. Misalnya nilai variabel tegangan 4234 berarti kita mempunyai 4,234 volt. Secara umum, operasi dengan bilangan pecahan menghabiskan banyak memori mikrokontroler (firmware voltmeter kami berbobot sedikit lebih dari 4 kilobyte, ini adalah setengah dari memori program ATmega8!), disarankan untuk digunakan hanya jika benar-benar diperlukan. Menghitung tegangan input dalam milivolt sangatlah sederhana: tegangan=R_divisi*2,56*u*1,024;
Di Sini R_divisi– koefisien pembagi resistif R4-R5. Karena koefisien pembagi sebenarnya mungkin berbeda dari yang dihitung, voltmeter kita akan berbohong. Tapi mudah untuk memperbaikinya. Dengan menggunakan tester kita mengukur tegangan tertentu, kita dapatkan Gambar 2. volt, dan biarkan voltmeter kami menunjukkan Y volt. Kemudian R_pembagian = 4*X/Y, Jika Y lebih besar dari X Dan 4*Y/X Jika X lebih besar dari Y. Ini menyelesaikan pengaturan voltmeter dan Anda dapat menggunakannya.
Unduh firmware sebagai proyek untuk AVR Studio 4.
Anda dapat melihat cara kerja voltmeter di video:

Anda juga dapat memodifikasi catu daya Anda. Dengan memasukkan ke dalamnya voltmeter-ammeter digital pada LCD dan proteksi beban berlebih (untuk mengukur arus kita memerlukan shunt yang kuat dengan resistansi sekitar 1 Ohm).

Saya juga memasang perlindungan kelebihan beban pada catu daya saya; ketika arus melebihi 2A, tweeter piezo mulai berbunyi bip keras, menandakan kelebihan beban:

Mari kita lihat berbagai masalah utama yang dapat dikaitkan dengan berbagai jenis prinsip pengoperasian. Penghitungan berurutan, penyeimbangan bitwise - apa yang tersembunyi di balik kata-kata ini? Apa prinsip pengoperasian mikrokontroler ADC? Kami akan mempertimbangkan hal ini, serta sejumlah pertanyaan lainnya, dalam kerangka artikel. Kami akan mencurahkan tiga bagian pertama pada teori umum, dan dari subjudul keempat kami akan mempelajari prinsip operasinya. Anda mungkin menemukan istilah ADC dan DAC di berbagai literatur. Cara kerja perangkat ini sedikit berbeda, jadi jangan bingung. Jadi, artikel ini akan membahas dari bentuk analog ke digital, sedangkan DAC bekerja sebaliknya.

Definisi

Sebelum mempertimbangkan prinsip pengoperasian ADC, mari kita cari tahu jenis perangkatnya. Konverter analog-ke-digital adalah perangkat yang mengubah kuantitas fisik menjadi representasi numerik yang sesuai. Parameter awal bisa berupa apa saja - arus, tegangan, kapasitansi, resistansi, sudut putaran poros, frekuensi pulsa, dan sebagainya. Namun yang pasti, kami hanya akan bekerja dengan satu transformasi. Ini adalah "kode tegangan". Pemilihan format kerja ini bukanlah suatu kebetulan. Bagaimanapun, ADC (prinsip pengoperasian perangkat ini) dan fitur-fiturnya sangat bergantung pada konsep pengukuran yang digunakan. Hal ini dipahami sebagai proses membandingkan nilai tertentu dengan standar yang telah ditetapkan sebelumnya.

Karakteristik ADC

Yang utama adalah kedalaman bit dan frekuensi konversi. Yang pertama dinyatakan dalam bit, dan yang kedua dalam hitungan per detik. Konverter analog-ke-digital modern dapat memiliki resolusi 24-bit atau kecepatan konversi yang mencapai satuan GSPS. Harap dicatat bahwa ADC hanya dapat memberi Anda satu karakteristik dalam satu waktu. Semakin tinggi indikatornya, semakin sulit bekerja dengan perangkat tersebut, dan perangkat itu sendiri semakin mahal. Namun untungnya, Anda bisa mendapatkan indikator kedalaman bit yang diperlukan dengan mengorbankan kecepatan perangkat.

Jenis ADC

Prinsip pengoperasiannya berbeda-beda di antara kelompok perangkat yang berbeda. Kami akan melihat jenis-jenis berikut:

  1. Dengan konversi langsung.
  2. Dengan perkiraan berturut-turut.
  3. Dengan konversi paralel.
  4. Konverter analog-ke-digital dengan penyeimbang muatan (delta-sigma).
  5. Mengintegrasikan ADC.

Masih banyak jenis konveyor dan kombinasi lainnya yang memiliki ciri khas tersendiri dengan arsitektur berbeda. Tetapi sampel-sampel yang akan dipertimbangkan dalam kerangka artikel ini menarik karena fakta bahwa sampel-sampel tersebut memainkan peran indikatif dalam ceruk perangkat dengan kekhususan ini. Oleh karena itu, mari kita pelajari prinsip pengoperasian ADC, serta ketergantungannya pada perangkat fisik.

Konverter analog-ke-digital langsung

Mereka menjadi sangat populer di tahun 60an dan 70an abad terakhir. Mereka telah diproduksi dalam bentuk ini sejak tahun 80an. Ini adalah perangkat yang sangat sederhana, bahkan primitif yang tidak dapat membanggakan kinerja yang signifikan. Lebar bitnya biasanya 6-8 bit, dan kecepatannya jarang melebihi 1 GSPS.

Prinsip pengoperasian ADC jenis ini adalah sebagai berikut: masukan positif dari komparator secara bersamaan menerima sinyal masukan. Tegangan dengan besaran tertentu diterapkan pada terminal negatif. Dan kemudian perangkat menentukan mode operasinya. Hal ini dilakukan berkat tegangan referensi. Katakanlah kita memiliki perangkat dengan 8 pembanding. Ketika ½ tegangan referensi diterapkan, hanya 4 tegangan referensi yang akan menyala. Encoder prioritas akan dihasilkan dan dicatat dalam register keluaran. Mengenai kelebihan dan kekurangannya, kita dapat mengatakan bahwa pekerjaan ini memungkinkan Anda untuk membuat perangkat berkecepatan tinggi. Tetapi untuk mendapatkan kedalaman bit yang dibutuhkan Anda harus bekerja keras.

Rumus umum jumlah pembanding terlihat seperti ini: 2^N. Di bawah N Anda harus memasukkan jumlah digit. Contoh yang telah dibahas sebelumnya dapat digunakan kembali: 2^3=8. Totalnya, untuk mendapatkan digit ketiga dibutuhkan 8 pembanding. Ini adalah prinsip pengoperasian ADC yang pertama kali dibuat. Ini sangat tidak nyaman, sehingga arsitektur lain kemudian muncul.

Konverter analog-ke-digital pendekatan berturut-turut

Ini menggunakan algoritma "pembobotan". Singkatnya, perangkat yang beroperasi menggunakan teknik ini disebut ADC penghitungan serial. Prinsip pengoperasiannya adalah sebagai berikut: perangkat mengukur nilai sinyal input, kemudian dibandingkan dengan angka yang dihasilkan menggunakan metode tertentu:

  1. Setengah dari kemungkinan tegangan referensi telah diatur.
  2. Jika sinyal sudah melampaui batas nilai dari titik no. 1, maka dibandingkan dengan angka yang terletak di tengah-tengah antara nilai yang tersisa. Jadi, dalam kasus kita ini akan menjadi ¾ dari tegangan referensi. Jika sinyal referensi tidak mencapai indikator ini, maka perbandingan akan dilakukan dengan bagian lain dari interval sesuai dengan prinsip yang sama. Dalam contoh ini tegangan referensinya adalah ¼.
  3. Langkah 2 harus diulang N kali, yang akan memberi kita N bit hasilnya. Hal ini disebabkan dilakukannya sejumlah N perbandingan.

Prinsip operasi ini memungkinkan untuk memperoleh perangkat dengan kecepatan konversi yang relatif tinggi, yang merupakan ADC aproksimasi berturut-turut. Prinsip pengoperasiannya, seperti yang Anda lihat, sederhana, dan perangkat ini sempurna untuk berbagai kasus.

Konverter A/D Paralel

Mereka beroperasi mirip dengan perangkat serial. Rumus perhitungannya adalah (2^H)-1. Untuk kasus yang dibahas sebelumnya, kita memerlukan (2^3)-1 pembanding. Untuk mengoperasikannya, rangkaian tertentu dari perangkat ini digunakan, yang masing-masing dapat membandingkan tegangan input dan referensi individual. Konverter analog-ke-digital paralel adalah perangkat yang cukup cepat. Namun prinsip desain perangkat ini sedemikian rupa sehingga diperlukan daya yang signifikan untuk mempertahankan fungsinya. Oleh karena itu, tidak disarankan menggunakannya dengan daya baterai.

Konverter analog-ke-digital dengan penyeimbangan bit

Ini beroperasi sesuai dengan skema yang mirip dengan perangkat sebelumnya. Oleh karena itu, untuk menjelaskan fungsi ADC penyeimbangan bitwise, prinsip pengoperasian untuk pemula akan dibahas secara sekilas. Perangkat ini didasarkan pada fenomena dikotomi. Dengan kata lain, perbandingan berurutan antara nilai terukur dilakukan dengan bagian tertentu dari nilai maksimum. Dapat diambil nilai ½, 1/8, 1/16 dan seterusnya. Oleh karena itu, konverter analog-ke-digital dapat menyelesaikan seluruh proses dalam N iterasi (langkah berturut-turut). Selain itu, H sama dengan kapasitas bit ADC (lihat rumus yang diberikan sebelumnya). Oleh karena itu, kami memperoleh keuntungan waktu yang signifikan, terutama jika kecepatan peralatan sangat penting. Meskipun kecepatannya tinggi, perangkat ini juga memiliki ciri kesalahan statis yang rendah.

Konverter analog-ke-digital dengan penyeimbang muatan (delta-sigma)

Ini adalah jenis perangkat yang paling menarik, terutama karena prinsip pengoperasiannya. Ini terdiri dari membandingkan tegangan input dengan tegangan yang diakumulasikan oleh integrator. Pulsa dengan polaritas negatif atau positif disuplai ke input (semuanya tergantung pada hasil operasi sebelumnya). Dengan demikian, kita dapat mengatakan bahwa konverter analog-ke-digital adalah sistem pelacakan sederhana. Namun ini hanyalah contoh perbandingan agar kalian dapat memahami ADC. Prinsip operasinya bersifat sistemik, tetapi agar konverter analog-ke-digital berfungsi secara efektif, ini tidak cukup. Hasil akhirnya adalah aliran satu dan nol tanpa akhir yang mengalir melalui filter low-pass digital. Urutan bit tertentu terbentuk darinya. Perbedaan dibuat antara konverter ADC orde pertama dan kedua.

Mengintegrasikan konverter analog-ke-digital

Ini adalah kasus khusus terakhir yang akan dibahas dalam artikel ini. Selanjutnya, kami akan menjelaskan prinsip pengoperasian perangkat ini, tetapi pada tingkat umum. ADC ini merupakan konverter analog-ke-digital dengan integrasi push-pull. Anda dapat menemukan perangkat serupa di multimeter digital. Dan ini tidak mengherankan, karena mereka memberikan akurasi yang tinggi dan sekaligus menekan interferensi dengan baik.

Sekarang mari kita fokus pada prinsip kerjanya. Terdiri dari fakta bahwa sinyal input mengisi kapasitor untuk waktu yang tetap. Biasanya, periode ini adalah satuan frekuensi jaringan yang memberi daya pada perangkat (50 Hz atau 60 Hz). Bisa juga banyak. Dengan demikian, interferensi frekuensi tinggi dapat ditekan. Pada saat yang sama, pengaruh tegangan tidak stabil dari sumber listrik jaringan terhadap keakuratan hasil dinetralkan.

Ketika waktu pengisian konverter analog-ke-digital berakhir, kapasitor mulai mengeluarkan daya pada laju tetap tertentu. Penghitung internal perangkat menghitung jumlah pulsa jam yang dihasilkan selama proses ini. Jadi, semakin lama jangka waktunya, semakin signifikan pula indikatornya.

ADC integrasi dorong-tarik sangat akurat dan oleh karena itu, serta struktur konstruksi yang relatif sederhana, ADC dirancang sebagai sirkuit mikro. Kerugian utama dari prinsip operasi ini adalah ketergantungannya pada indikator jaringan. Ingatlah bahwa kemampuannya terikat pada durasi periode frekuensi sumber listrik.

Beginilah cara kerja ADC integrasi ganda. Meskipun prinsip pengoperasian perangkat ini cukup kompleks, namun memberikan indikator kualitas. Dalam beberapa kasus, hal ini hanya diperlukan.

Kami memilih APC dengan prinsip pengoperasian yang kami butuhkan

Katakanlah kita dihadapkan pada suatu tugas tertentu. Perangkat mana yang harus kita pilih agar dapat memenuhi semua kebutuhan kita? Pertama, mari kita bicara tentang resolusi dan akurasi. Sangat sering mereka bingung, walaupun dalam prakteknya mereka sangat lemah bergantung satu sama lain. Ingatlah bahwa konverter A/D 12-bit mungkin memiliki akurasi yang lebih rendah dibandingkan konverter A/D 8-bit. Dalam hal ini, resolusi adalah ukuran berapa banyak segmen yang dapat diekstraksi dari rentang masukan sinyal yang diukur. Jadi, ADC 8-bit memiliki 2 8 =256 unit tersebut.

Akurasi merupakan simpangan total hasil konversi yang dihasilkan dari nilai ideal yang seharusnya pada tegangan masukan tertentu. Artinya, parameter pertama mencirikan potensi kemampuan yang dimiliki ADC, dan parameter kedua menunjukkan apa yang kita miliki dalam praktiknya. Oleh karena itu, jenis yang lebih sederhana (misalnya, konverter analog-ke-digital langsung) mungkin cocok untuk kita, yang akan memenuhi kebutuhan karena akurasinya yang tinggi.

Untuk mengetahui apa yang dibutuhkan, pertama-tama Anda perlu menghitung parameter fisik dan membuat rumus matematika untuk interaksinya. Kesalahan statis dan dinamis penting di dalamnya, karena ketika menggunakan komponen dan prinsip yang berbeda untuk membangun suatu perangkat, mereka akan memiliki efek berbeda pada karakteristiknya. Informasi lebih rinci dapat ditemukan di dokumentasi teknis yang ditawarkan oleh produsen setiap perangkat tertentu.

Contoh

Mari kita lihat ADC SC9711. Prinsip pengoperasian perangkat ini rumit karena ukuran dan kemampuannya. Ngomong-ngomong, berbicara tentang yang terakhir, perlu dicatat bahwa mereka sangat beragam. Misalnya, frekuensi operasi yang mungkin berkisar antara 10 Hz hingga 10 MHz. Dengan kata lain, diperlukan 10 juta sampel per detik! Dan perangkat itu sendiri bukanlah sesuatu yang kokoh, tetapi memiliki struktur modular. Tapi ini biasanya digunakan dalam teknologi yang kompleks, di mana perlu bekerja dengan sejumlah besar sinyal.

Kesimpulan

Seperti yang Anda lihat, ADC didasarkan pada prinsip operasi yang berbeda. Hal ini memungkinkan kami memilih perangkat yang akan memenuhi kebutuhan Anda, dan pada saat yang sama memungkinkan Anda mengelola dana yang tersedia dengan bijak.

Fitur utama ADC

Mikrokontroler stm32f1xx memiliki 3 ADC 12-bit. Setiap ADC dapat dihubungkan ke salah satu dari 16 input analog. Selain itu, setiap ADC dapat memindai input ini, mengambil data dari input tersebut dalam urutan yang ditentukan pengguna.
Di akhir konversi, ADC mungkin mengeluarkan interupsi. Secara umum, ADC dapat mengeluarkan salah satu dari tiga interupsi: Tentang akhir konversi saluran reguler (reguler), tentang akhir konversi melalui saluran injeksi, dan peristiwa Watchdog.
Dalam mode pemindaian, interupsi penyelesaian konversi dikeluarkan hanya setelah seluruh pemindaian selesai. Dan bila menggunakan pipa biasa, di mana data selalu ditulis ke register yang sama, Anda hanya akan menerima hasil konversi terakhir.
Untuk mencegah hal ini terjadi, mikrokontroler dilengkapi dengan saluran injeksi, yang memiliki 4 register berbeda untuk merekam data. Itu. jika Anda perlu memindai tidak lebih dari 4 saluran, maka Anda tidak akan kehilangan hasil transformasinya. Karena Setiap saluran akan menulis data ke registernya sendiri.
Untuk akuisisi data paralel melalui beberapa saluran sekaligus, dimungkinkan untuk meluncurkan beberapa ADC secara bersamaan. Mode ini disebut Mode Ganda.

koneksi ADC

Pertama-tama, mari kita lihat menghubungkan ADC. Kebutuhan setiap kaki ditunjukkan pada Tabel 1.

Tabel 1

Dari kaki yang terdaftar, -Vop dan +Vop menarik. Mereka menentukan kisaran tegangan yang dirasakan oleh ADC. Jika Anda menghubungkan -Vop ke ground dan +Vop ke daya, ADC akan dapat mendigitalkan sinyal analog pada seluruh rentang dari 0 hingga daya. Karena Catu daya MK adalah 3.3V, dan kapasitas ADC adalah 12, mis. kita memiliki 2^12=4096 tingkat kuantum, kebisingan ADC akan menjadi 3,3/4096=0,8 mV.

Jenis ADC

Ada 2 jenis saluran ADC pada mikrokontroler: reguler dan injeksi. 2 saluran ini dikonfigurasi secara independen. Namun hanya satu yang dapat berfungsi untuk setiap saluran. Perbedaan utama antara saluran-saluran ini adalah hanya satu register yang digunakan untuk menyimpan data yang diterima menggunakan saluran biasa. Ini tidak buruk jika Anda hanya perlu mengambil data dari satu saluran untuk setiap ADC dalam satu waktu. Namun, jika Anda perlu memindai data, maka semua data yang diambil akan ditulis ke register yang sama. Itu. Saat membaca data dalam interupsi di akhir konversi, Anda hanya akan menerima data yang terakhir dibaca. Saluran injeksi dirancang untuk memperbaiki masalah ini. Mereka memiliki 4 register untuk menyimpan data. Itu. Anda dapat menyimpan data dari 4 saluran pemindaian. Kerugian dari saluran injeksi adalah sistem konfigurasi yang sedikit lebih rumit, di mana perlu untuk menjelaskan data dari saluran mana yang akan ditulis ke register mana.

Menyiapkan saluran reguler

Mari pertimbangkan untuk menyiapkan saluran ADC biasa. Mari kita konfigurasikan ADC pada pin A4. Pertama-tama, Anda perlu mencari tahu ADC mana yang memiliki akses ke pin ini dan saluran mana yang terhubung dengannya. Secara khusus, ini adalah saluran ke-4 dari ADC pertama.
Seperti biasa, kami menggunakan skema standar:
1) Aktifkan pencatatan jam kerja port
2) Atur keluaran
3) Aktifkan pencatatan jam kerja ADC
4) Siapkan ADC
5) Aktifkan interupsi yang diperlukan
6) Aktifkan interupsi global
7) Aktifkan ADC

Saat mengatur port, hal utama adalah mengatur mode ke mode analog.

Mengonfigurasi Keluaran Analog

GPIO_InitTypeDef GPIO_Init_pengguna;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, AKTIFKAN);

GPIO_Init_pengguna.GPIO_Pin = GPIO_Pin_4;
GPIO_Init_user.GPIO_Mode = GPIO_Mode_AN;
GPIO_Init_user.GPIO_Speed ​​​​= GPIO_Speed_2MHz;
GPIO_Init_user.GPIO_OType = GPIO_OType_PP;
GPIO_Init_user.GPIO_PuPd = GPIO_PuPd_NOPULL;

GPIO_Init(GPIOA, & GPIO_Init_pengguna);


Aktifkan pencatatan jam kerja ADC:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, AKTIFKAN);

Menyiapkan ADC:

Menyiapkan saluran ADC reguler

ADC_InitTypeDef ADC_InitType;

ADC_InitType.ADC_ContinuousConvMode = NONAKTIFKAN;
ADC_InitType.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitType.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
ADC_InitType.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
ADC_InitType.ADC_NbrOfConversion = 1;
ADC_InitType.ADC_Resolution = ADC_Resolution_12b;
ADC_InitType.ADC_ScanConvMode = NONAKTIFKAN;

ADC_Init(ADC1, &ADC_InitType);


Mari kita lihat lebih dekat pengaturannya:
Mode Konv. Berkelanjutan– Mode ini, jika diaktifkan, memulai konversi berikutnya segera setelah konversi sebelumnya selesai. Dengan cara ini Anda dapat mencapai kecepatan ADC maksimum. Dalam kasus kami, ini tidak diperlukan dan fungsi ini dinonaktifkan.
Penyelarasan Data– penyelarasan data dalam kata 2-byte. Ada 2 pilihan. ADC_DataAlign_Right di mana data disejajarkan ke kanan dan bit yang tidak digunakan disetel ke nol. Itu. kita mendapatkan angka reguler dalam 2 byte dari 0 hingga 8192. Dengan ADC_DataAlign_Left, data disejajarkan ke kiri. Itu. faktanya, untuk konversi 12-bit jumlahnya meningkat 16 kali lipat. Ini dapat digunakan, misalnya, saat mengirimkannya melalui SPI, yang mendukung transfer data 12-bit. Jika Anda mengkonfigurasi SPI untuk mengirimkan mulai dari bit paling signifikan. EksternalTrigConvEdge– mengonfigurasi konversi agar dipicu oleh beberapa peristiwa, misalnya, pengatur waktu meluap. Dalam kasus kami, ini tidak diperlukan.
EksternalTrigConv– Menetapkan peristiwa mana yang akan memicu ADC. Karena pemicunya dinonaktifkan, fungsi ini tidak digunakan.
NbrOfConversion– jumlah saluran yang akan dipindai oleh MK. Nilai yang diperlukan ditulis di sini, dan di bawah, jika angka ini lebih besar dari 1 dan ADC_ ScanConvMode=ENABLE, ini menjelaskan saluran mana dan dalam urutan apa saluran tersebut akan dipindai
ScanConvMode– Parameter ini menentukan apakah ADC akan memindai beberapa saluran. Jika mode ini diaktifkan, ADC akan mendigitalkan data secara berurutan dari saluran tertentu dalam urutan yang ditentukan. Saluran dan urutan dapat diatur dengan mudah. Namun ada sedikit masalah dalam pengambilan data.

Menyiapkan saluran tertentu. Dalam kasus kami, ini hanya satu saluran, jadi pengaturannya akan terlihat seperti ini:

ADC_RegularChannelConfig(ADC1,ADC_Channel_4,1, DC_SampleTime_56Cycles);

Dari parameter di sini:
ADC1 – nomor ADC yang dikonfigurasi.
ADC_Channel_4 menentukan saluran yang akan diambil.
1 – yang disebut peringkat. Menunjukkan urutan saluran ini akan didigitalkan. Dalam kasus kami hanya ada satu saluran, oleh karena itu peringkat=1.
DC_SampleTime_56Cycles – menentukan berapa lama waktu yang dibutuhkan untuk digitalisasi. Semakin lambat semakin akurat.

Sekarang yang tersisa hanyalah mengkonfigurasi interupsi dan mengaktifkannya:

NVIC_EnableIRQ(ADC_IRQn);
ADC_ITConfig(ADC1, ADC_IT_EOC, AKTIFKAN);

ADC_Cmd(ADC1, AKTIFKAN);

Ini menyelesaikan penyiapan.

Untuk menjalankan konversi, gunakan fungsi:

ADC_SoftwareStartConv(ADC1);

Setelah konversi selesai, program akan masuk ke fungsi interupsi:

Batal ADC_IRQHandler(batal)
{
ADC_ClearFlag(ADC1, ADC_FLAG_EOC);
ADC_result = ADC_GetConversionValue(ADC1);
}

Kami menyetel ulang bendera dan membaca hasil konversi.
Anda dapat mengunduh contoh pekerjaan dari

Pelajaran 22

Bagian 1

Mempelajari ADC

Hari ini kita akan mulai mempelajari teknologi yang sangat menarik, dan untuk mikrokontroler - periferal - inilah konverter analog-ke-digital atau apa pun sebutannya ADC. Dalam singkatan bahasa Inggris, lebih sering ditemukan dalam dokumentasi teknis - ADC (Konverter Analog-ke-Digital). Ini adalah sesuatu yang mengubah besarnya sinyal listrik menjadi kode digital. Kemudian kami menggunakan kode ini untuk memproses atau menampilkan besaran listrik ini dengan satu atau lain cara. Ini adalah perangkat atau teknologi yang sangat umum. ADC secara aktif digunakan dalam perekaman suara, teknologi pengukuran, perekaman video, dan banyak kasus lainnya. Oleh karena itu, tidak ada cara untuk mem-bypass hal ini, terutama karena ADC didukung pada perangkat keras di pengontrol AVR.

Pada pengontrol Atmega8, ADC memiliki ciri-ciri sebagai berikut

  • Resolusi 10 bit,
  • Waktu konversi satu pembacaan adalah dari 13 hingga 250 mikrodetik, tergantung pada kedalaman bit pengukuran, serta pada frekuensi jam generator yang mengatur jam pengontrol,
  • Dukungan pemicu interupsi

Masih banyak lagi karakteristik berbeda yang mungkin akan kita ketahui di masa mendatang.

Bagaimana sebenarnya transformasi digital bekerja?

Tegangan referensi diambil dan dibandingkan dengan yang diukur. Oleh karena itu, tegangan referensi harus selalu lebih besar dari tegangan terukur. Jika tidak, maka Anda perlu menggunakan pembagi tegangan.

Mari kita gambarkan secara skematis proses pengukuran

Segmen adalah rentang pengukuran. Itu berada di antara nol dan tegangan referensi. Dan panahnya adalah tegangan yang diukur.

Segmen ini dibagi dua, dan ADC memperkirakan setengahnya berisi tegangan yang diberikan

Jika berada di sisi nol, maka 0 ditulis pada bit hasil yang paling signifikan, dan jika berada di sisi tegangan maksimum, maka satu. Kami akan memilikinya. Kemudian setengah dari segmen dimana tegangan terukur berada dibagi lagi menjadi dua, dan ADC kembali mengukur di mana setengah dari segmen ini tegangan terukur berada.

Penilaiannya mengikuti prinsip yang sama - ke arah mana segmen tersebut berada. Dalam kasus kami, nilainya adalah 0. Dan nol ini ditulis ke bit bawah berikutnya

Kemudian kuartal tersebut dibagi lagi menjadi dua dan ADC kembali mengevaluasi di mana lokasi segmen tersebut

Dan ADC melanjutkan proses ini sampai sel untuk bit habis. Artinya, jika kita menggunakan mode 10-bit, maka. karenanya, akan ada 10 pengukuran serupa dan 10 bit nilai akan diisi. Semakin banyak bit, semakin akurat hasilnya, tetapi ini akan membutuhkan lebih banyak waktu dan ADC yang lebih serius dan akurat. Dengan adanya hasil ini maka akan mudah bagi kita untuk menghitung nilai tegangan yang diukur. Kita tahu. bahwa jika kita memiliki ADC 10-bit, maka hasilnya terletak pada rentang 0 hingga 1024, kita mendapatkan total 1023 segmen. Dan hasilnya kita bagi dengan 1023 dan kalikan dengan nilai tegangan referensi.

Mari kita lihat diagram blok ADC pada pengontrol Atmega8

Kita melihat bahwa kita memiliki multiplexer dengan 8 saluran, sebuah input untuk tegangan referensi AREF. Ada juga bus data 8-bit, yang nilainya ditulis ke register tertentu. Ada register data, register kontrol dan status, dan register kontrol multiplekser.

Kami akan menggunakan input pertama ADC0 dan sebagai sumber tegangan terukur kami akan menggunakan kaki tengah dari resistor variabel yang terhubung ke kontak daya.

Kami akan bekerja dulu di Proteus. Kami juga melihat bahwa layar kami terhubung dengan cara yang paling biasa.

Kami juga akan menghubungkan semuanya pada pengontrol langsung

Ada beberapa pilihan tegangan referensi yang dapat kita gunakan pada ADC kita. Kami akan menggunakan referensi internal 2,56 volt, lebih sederhana dan tidak memerlukan apa pun untuk dihubungkan. Mungkin opsi ini tidak memiliki akurasi yang sangat kuat, tetapi kita tidak dihadapkan pada tugas untuk membuat alat pengukur yang akurat. Tugas kami adalah mempelajari kemungkinan menggunakan ADC di pengontrol AVR.

Dan berikut adalah tabel pilihan tegangan referensi untuk ADC

Mari kita daftarkan opsi-opsi ini dari atas ke bawah dalam tabel. Opsi 1 adalah tegangan referensi internal yang sama dengan tegangan suplai, opsi 2 adalah tegangan referensi yang disuplai ke input AREF dari luar, opsi 3 adalah internal 2,56 volt menggunakan kapasitor eksternal, yang telah kita solder ke papan debug untuk kaki tertentu dari pengontrol.

ADC juga memiliki pembagi frekuensi mulai dari 2 hingga 128. Pembagi ini dimaksudkan agar kita mencapai frekuensi operasi ADC tidak lebih dari 200 kHz, jika tidak, keakuratan pengukuran akan sangat rendah dan kita hanya akan kehilangan bit paling tidak signifikan. Jika persyaratan kecepatan dan akurasi pengukuran tidak lagi penting bagi kami, maka kami akan dapat menggunakan frekuensi pengukuran yang lebih tinggi.

Sekarang mari kita lihat lebih dekat register ADC.

Daftar ADCSRA- kontrol dan daftar status

Sekarang sedikit demi sedikit.

Mulai transformasi 1-mulai. Setelah konversi, perangkat keras menyetel ulang ke nol. bit ke-7— bit ini menyalakan ADC.

Memilih pengoperasian ADC. 1-kontinyu 0-on ADSC memicu bit ke-6— bila diatur ke 1, menyebabkan ADC memulai konversi.

Interupsi bendera bit ke-5- digunakan dalam mode berbasis interupsi. Bila diatur ke 1, aktifkan mode melingkar, yang mana pengukuran secara otomatis mengikuti satu demi satu.

Interupsi mengaktifkan bit ke-4- sedikit juga hanya digunakan dalam mode interupsi. Ini adalah tanda interupsi yang disetel dalam kondisi tertentu.

Pemilihan frekuensi konversi bit ke-3— bit yang mengaktifkan mode interupsi.

ADPS2-ADPS0- bit, kombinasinya menentukan nilai pembagi

Daftar ADMUX- ini adalah register untuk mengontrol saluran multiplexer ADC

Namun, selain bit kontrol saluran itu sendiri, register ini juga memiliki beberapa bit kontrol

REFS1-REFS0— bit yang mengaktifkan mode penggunaan tegangan referensi tertentu. Tabel telah diposting pada halaman ini di atas.

ADLAR adalah bit yang mengatur susunan 10 bit terukur dalam dua byte pasangan data register. Kita akan melihat lebih dekat pengaturan ini nanti.

MUX3-MUX0— bit yang menyertakan saluran multiplekser tertentu

Hal ini menunjukkan bahwa kita dapat menggunakan beberapa saluran sekaligus hanya secara bergantian, secara bergantian mengaktifkan berbagai kombinasi bit-bit tersebut. Ada juga dua kombinasi di bawah ini untuk mengkalibrasi ADC kami.

Dan terakhir, pasangan register ADCH Dan ADCL, terdiri dari byte tinggi dan rendah tempat hasil pengukuran dimasukkan. Dan bagaimana tepatnya itu cocok di sana, hasil ini tergantung pada keadaan bit ADLAR, yang dibahas di atas dalam register ADMUX

Artinya, jika bit ADLAR tidak disetel, maka 8 bit terbawah hasilnya berada di byte rendah pasangan register, dan 2 bit paling signifikan berada di bit rendah byte tinggi. Jika bit ADLAR diset, maka 8 bit hasil paling signifikan berada pada byte terendah, dan 2 bit paling signifikan berada pada 2 bit paling signifikan byte rendah pasangan register. Opsi kedua menarik bagi kami saat menggunakan mode 8-bit. Dalam hal ini, kita hanya membaca byte tinggi.

Proyek ini dibuat seluruhnya dari proyek Tes09 dan diberi nama ADCLCD saya.

Selain itu, untuk mengekspor kode implementasi periferal ADC, dua file dibuat dengan cara standar adc.h Dan adc.c. Oleh karena itu, file adc.h disertakan dalam file main.h dan adc.c.

Kode dalam file MyADCLCD.c juga disalin sepenuhnya dari file proyek Test09 utama, semua yang tidak diperlukan telah dihapus. Kode dalam file ini setelah operasi ini mengambil bentuk berikut

#termasuk"utama.h"

//—————————————-

ruang kosongport_ini( ruang kosong)

PORTD=0x00;