Isi kandungan:

Mikrokontroler AVR. Modulasi Lebar Nadi. Pengawal Motor DC dan Intensiti Lampu LED .: 6 Langkah
Mikrokontroler AVR. Modulasi Lebar Nadi. Pengawal Motor DC dan Intensiti Lampu LED .: 6 Langkah

Video: Mikrokontroler AVR. Modulasi Lebar Nadi. Pengawal Motor DC dan Intensiti Lampu LED .: 6 Langkah

Video: Mikrokontroler AVR. Modulasi Lebar Nadi. Pengawal Motor DC dan Intensiti Lampu LED .: 6 Langkah
Video: PWM - PULSE WIDTH MODULATION menggunakan Osciloscope digital || Mikrokontroller AVR 2024, November
Anonim
Image
Image

Hai semua!

Pulse Width Modulation (PWM) adalah teknik yang sangat biasa dalam telekomunikasi dan kawalan kuasa. biasanya digunakan untuk mengontrol daya yang disalurkan ke alat elektrik, baik itu motor, LED, speaker, dll. Pada dasarnya ini adalah teknik modulasi, di mana lebar nadi pembawa bervariasi sesuai dengan isyarat mesej analog.

Kami membuat litar elektrik sederhana untuk mengawal kelajuan putaran motor DC bergantung kepada intensiti cahaya. Kami akan menggunakan ciri Light Dependent Resistor dan AVR mikrokontroler seperti Analog ke Digital Conversion untuk mengukur intensiti cahaya. Kita juga akan menggunakan Modul Pemandu Motor Dual H-Bridge-L298N. Ini biasanya digunakan dalam mengendalikan kecepatan dan arah motor, tetapi dapat digunakan untuk projek lain seperti mendorong kecerahan projek pencahayaan tertentu. Juga, tambahkan butang ke litar kami untuk menukar arah putaran mesin.

Langkah 1: Penerangan

Penerangan
Penerangan
Penerangan
Penerangan

Setiap badan di dunia ini mempunyai sedikit inersia. Motor berpusing setiap kali dihidupkan. Sebaik sahaja dimatikan, ia akan cenderung berhenti. Tetapi ia tidak berhenti serta-merta, memerlukan sedikit masa. Tetapi sebelum berhenti sepenuhnya, ia dihidupkan semula! Oleh itu ia mula bergerak. Tetapi walaupun sekarang, ia memerlukan sedikit masa untuk mencapai kepantasan sepenuhnya. Tetapi sebelum ia berlaku, ia dimatikan, dan seterusnya. Oleh itu, kesan keseluruhan tindakan ini adalah bahawa motor berputar secara berterusan, tetapi pada kelajuan yang lebih rendah.

Pulse Width Modulation (PWM) adalah teknik menukar kuasa yang agak baru-baru ini untuk menyediakan jumlah kuasa elektrik antara antara tahap aktif dan mati sepenuhnya. Biasanya, denyutan digital mempunyai jangka waktu hidup dan mati yang sama, tetapi dalam beberapa keadaan kita memerlukan denyutan digital untuk mempunyai lebih banyak / kurang pada waktu / waktu henti. Dalam teknik PWM, kami membuat denyutan digital dengan jumlah keadaan hidup dan mati yang tidak sama untuk mendapatkan nilai voltan perantaraan yang diperlukan.

Duty cycle ditentukan oleh peratusan jangka masa voltan tinggi dalam nadi digital lengkap. Ia boleh dikira dengan:

% Duty cycle = T on / T (jangka masa) x 100

Mari kita ambil penyataan masalah. Kita perlu menghasilkan isyarat PWM 50 Hz yang mempunyai kitaran tugas 45%.

Kekerapan = 50 Hz

Tempoh masa, T = T (aktif) + T (mati) = 1/50 = 0.02 s = 20 ms

Kitaran Tugas = 45%

Oleh itu, menyelesaikan berdasarkan persamaan yang diberikan di atas, kita dapat

T (on) = 9 ms

T (mati) = 11 ms

Langkah 2: Pemasa AVR - Mod PWM

Pemasa AVR - Mod PWM
Pemasa AVR - Mod PWM
Pemasa AVR - Mod PWM
Pemasa AVR - Mod PWM

Untuk membuat PWM, AVR mengandungi perkakasan yang berasingan! Dengan menggunakan ini, CPU memerintahkan perkakasan untuk menghasilkan PWM kitaran tugas tertentu. ATmega328 mempunyai 6 output PWM, 2 terletak pada timer / counter0 (8bit), 2 terletak pada timer / counter1 (16bit), dan 2 terletak pada timer / counter2 (8bit). Timer / Counter0 adalah peranti PWM termudah pada ATmega328. Timer / Counter0 mampu berjalan pada 3 mod:

  • PWM pantas
  • Fasa dan Frekuensi yang Dibetulkan PWM
  • PWM yang Dibetulkan Fasa

setiap mod ini boleh terbalik atau tidak terbalik.

Memulakan Pemasa0 dalam mod PWM:

TCCR0A | = (1 << WGM00) | (1 << WGM01) - sediakan WGM: PWM Cepat

TCCR0A | = (1 << COM0A1) | (1 << COM0B1) - siapkan mod output output A, B

TCCR0B | = (1 << CS02) - sediakan pemasa dengan prescaler = 256

Langkah 3: Pengukuran Intensiti Cahaya - ADC & LDR

Pengukuran Intensiti Cahaya - ADC & LDR
Pengukuran Intensiti Cahaya - ADC & LDR
Pengukuran Intensiti Cahaya - ADC & LDR
Pengukuran Intensiti Cahaya - ADC & LDR
Pengukuran Intensiti Cahaya - ADC & LDR
Pengukuran Intensiti Cahaya - ADC & LDR

Light Dependent Resistor (LDR) adalah transduser yang mengubah rintangannya apabila cahaya jatuh di permukaannya berubah.

LDR dibuat dari bahan semikonduktor untuk membolehkan mereka mempunyai sifat sensitif cahaya. LDR atau FOTO RESISTOR ini berfungsi berdasarkan prinsip "Photo Conductivity". Sekarang apa yang dikatakan oleh prinsip ini adalah setiap kali cahaya jatuh di permukaan LDR (dalam kes ini) konduktansi elemen meningkat atau dengan kata lain rintangan LDR menurun apabila cahaya jatuh di permukaan LDR. Ini sifat penurunan rintangan untuk LDR dicapai kerana ia adalah sifat bahan semikonduktor yang digunakan di permukaan. LDR digunakan paling kerap untuk mengesan kehadiran cahaya atau untuk mengukur intensiti cahaya.

Untuk memindahkan maklumat berterusan luaran (maklumat analog) ke dalam sistem digital / pengkomputeran, kita mesti mengubahnya menjadi nilai integer (digital). Jenis penukaran ini dilakukan oleh Analog to Digital Converter (ADC). Proses menukar nilai analog menjadi nilai digital dikenali sebagai Analog to Digital Conversion. Ringkasnya, isyarat Analog adalah isyarat dunia nyata di sekitar kita seperti bunyi dan cahaya.

Isyarat digital adalah setara analog dalam format digital atau angka yang dapat difahami dengan baik oleh sistem digital seperti mikrokontroler. ADC adalah salah satu perkakasan yang mengukur isyarat analog dan menghasilkan setara digital dengan isyarat yang sama. Mikrokontroler AVR mempunyai kemudahan ADC bawaan untuk menukar voltan analog menjadi integer. AVR menukarnya menjadi nombor 10-bit dari 0 hingga 1023.

Kami menggunakan penukaran tahap voltan analog ke digital dari litar pembahagi dengan LDR untuk mengukur intensiti cahaya.

Memulakan ADC:

TADCSRA | = (1 << ADEN) - Dayakan ADC

ADCSRA | = (1 << ADPS2) | (1 << ADPS1) | (1ADPS0) - sediakan ADC prescaler = 128

ADMUX = (1 << REFS0) - tetapkan rujukan voltan = AVCC; - sediakan Input Channel = ADC0

Tonton video dengan penerangan terperinci mengenai mikrokontroler ADC AVR: Mikrokontroler AVR. Pengukuran Intensiti Cahaya. ADC & LDR

Langkah 4: Pengawal Motor DC & Modul Pemacu Motor Dual H-Bridge-L298N

Controller DC Motor & Modul Pemacu Motor Dual H-Bridge-L298N
Controller DC Motor & Modul Pemacu Motor Dual H-Bridge-L298N
Controller DC Motor & Modul Pemacu Motor Dual H-Bridge-L298N
Controller DC Motor & Modul Pemacu Motor Dual H-Bridge-L298N
Controller DC Motor & Modul Pemacu Motor Dual H-Bridge-L298N
Controller DC Motor & Modul Pemacu Motor Dual H-Bridge-L298N

Kami menggunakan pemacu motor DC kerana pengawal mikro tidak mampu menyampaikan arus tidak lebih dari 100 miliamp secara umum. Pengawal mikro pintar tetapi tidak kuat; modul ini akan menambahkan beberapa otot pada pengawal mikro untuk menggerakkan motor DC berkuasa tinggi. Ia dapat mengawal 2 motor DC secara serentak hingga 2 amp masing-masing atau satu motor stepper. Kita dapat mengawal kelajuan menggunakan PWM dan juga arah putaran motornya. Juga, ini digunakan untuk mendorong kecerahan pita LED.

Huraian pin:

Port OUT1 dan OUT2, iaitu untuk menyambungkan motor DC. OUT3 dan OUT4 untuk menyambungkan pita LED.

ENA dan ENB adalah pin yang diaktifkan: dengan menghubungkan ENA ke tinggi (+ 5V) ia membolehkan port OUT1 dan OUT2.

Sekiranya anda menyambungkan pin ENA ke rendah (GND), ia mematikan OUT1 dan OUT2. Begitu juga untuk ENB dan OUT3 dan OUT4.

IN1 hingga IN4 adalah pin input yang akan disambungkan ke AVR.

Sekiranya tinggi IN1 (+ 5V), rendah IN2 (GND), OUT1 bertukar tinggi dan OUT2 bertukar rendah, maka kita dapat menggerakkan motor.

Sekiranya tinggi IN3 (+ 5V), rendah IN4 (GND), OUT4 bertukar tinggi dan OUT3 bertukar rendah, maka lampu pita LED menyala.

Sekiranya anda mahu membalikkan arah putaran motor, sebaliknya terbalikkan polaritas IN1 dan IN2, sama untuk IN3 dan IN4.

Dengan menggunakan isyarat PWM ke ENA dan ENB, anda dapat mengawal kelajuan motor pada dua port output yang berbeza.

Papan boleh menerima dari 7V hingga 12V secara nominal.

Pelompat: Terdapat tiga pin pelompat; Jumper 1: Sekiranya motor memerlukan bekalan lebih dari 12V, anda mesti memutuskan sambungan Jumper 1 dan menggunakan voltan yang dikehendaki (maksimum 35V) pada terminal 12V. Bawa bekalan dan input 5V lain di terminal 5V. Ya, anda harus memasukkan 5V jika anda perlu menggunakan lebih dari 12V (semasa Jumper 1 dikeluarkan).

Input 5V adalah untuk berfungsi dengan baik IC, kerana melepaskan jumper akan mematikan pengatur 5V bawaan dan melindungi dari voltan input yang lebih tinggi dari terminal 12V.

Terminal 5V bertindak sebagai output jika bekalan anda antara 7V hingga 12V dan bertindak sebagai input jika anda menggunakan lebih dari 12V dan jumper dikeluarkan.

Jumper 2 dan Jumper 3: Sekiranya anda melepaskan kedua pelompat ini, anda mesti memasukkan isyarat aktif dan nyahaktifkan dari mikrokontroler, kebanyakan pengguna lebih suka mengeluarkan dua pelompat dan menggunakan isyarat dari mikrokontroler.

Sekiranya anda menyimpan dua pelompat, OUT1 hingga OUT4 akan sentiasa diaktifkan. Ingat pelompat ENA untuk OUT1 dan OUT2. Jumper ENB untuk OUT3 dan OUT4.

Langkah 5: Menulis Kod untuk Program di C. Memuat naik Fail HEX Ke Memori Kilat Mikrokontroler

Menulis dan membangun aplikasi mikrokontroler AVR dalam C Code menggunakan Integrated Development Platform - Atmel Studio.

#ifndef F_CPU # define F_CPU 16000000UL // memberitahu frekuensi kristal pengawal (16 MHz AVR ATMega328P) #endif

#include // header untuk membolehkan kawalan aliran data ke atas pin. Mentakrifkan pin, port, dan lain-lain #include // header untuk mengaktifkan fungsi kelewatan dalam program

#define BUTTON1 // suis butang disambungkan ke port B pin 2 #define DEBOUNCE_TIME 25 // masa untuk menunggu sementara butang "de-bouncing" #define LOCK_INPUT_TIME 300 // masa untuk menunggu setelah tekan butang

// Timer0, PWM Initialization void timer0_init () {// sediakan pemasa OC0A, pin OC0B dalam mod togol dan mod CTC TCCR0A | = (1 << COM0A1) | (1 << COM0B1) | (1 << WGM00) | (1 << WGM01); // tetapkan pemasa dengan prescaler = 256 TCCR0B | = (1 << CS02); // memulakan kaunter TCNT0 = 0; // memulakan nilai perbandingan OCR0A = 0; }

// ADC Initialization batal ADC_init () {// Aktifkan ADC, pengambilan sampel freq = osc_freq / 128 set prescaler ke nilai maksimum, 128 ADCSRA | = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);

ADMUX = (1 << REFS0); // Pilih Rujukan Voltan (AVCC)

// Status suis butang char_state char tidak bertanda () {

/ * butang ditekan ketika BUTTON1 bit kosong * /

jika (! (PINB & (1 <

{

_delay_ms (DEBOUNCE_TIME);

jika (! (PINB & (1 <

}

pulangan 0;

}

// Permulaan Pelabuhan batal port_init () {DDRB = 0b00011011; // PB0-IN1, PB1-IN2, PB3-IN3, PB4-IN4, PB2 - BUTTON SWITCH LANGSUNG PORTB = 0b00010110;

DDRD = 0b01100000; // PD5-ENB (OC0B), PD6-ENA (OC0A) PORTD = 0b00000000;

DDRC = 0b00000000; // PC0-ADC PORTC = 0b00000000; // Tetapkan semua pin PORTC rendah yang mematikannya. }

// Fungsi ini membaca nilai analog ke digital convert. uint16_t get_LightLevel () {_delay_ms (10); // Tunggu beberapa saat sehingga saluran terpilih ADCSRA | = (1 << ADSC); // Mulakan penukaran ADC dengan menetapkan bit ADSC. Tulis 1 hingga ADSC

sementara (ADCSRA & (1 << ADSC)); // Tunggu penukaran selesai

// ADSC menjadi 0 lagi sehingga kemudian, jalankan gelung berterusan _delay_ms (10); pulangan (ADC); // Kembalikan hasil 10-bit

}

// Fungsi ini Memetakan semula nombor dari satu jarak (0-1023) ke yang lain (0-100). peta uint32_t (uint32_t x, uint32_t in_min, uint32_t in_max, uint32_t out_min, uint32_t out_max) {return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; }

int utama (tidak sah)

{uint16_t i1 = 0;

port_init ();

pemasa0_init (); ADC_init (); // inisialisasi ADC

semasa (1)

{i1 = peta (get_LightLevel (), 0, 1023, 0, 100);

OCR0A = i1; // Tetapkan output bandingkan saluran daftar A OCR0B = 100-i1; // Tetapkan output bandingkan saluran B (terbalik)

if (button_state ()) // Jika butang ditekan, alihkan keadaan LED dan tunda 300ms (#define LOCK_INPUT_TIME) {PORTB ^ = (1 << 0); // menukar keadaan pin IN1 semasa. PORTB ^ = (1 << 1); // menukar keadaan pin IN2 semasa. Balikkan arah putaran motor

PORTB ^ = (1 << 3); // menukar keadaan pin IN3 semasa. PORTB ^ = (1 << 4); // menukar keadaan pin IN4 semasa. Pita LED dimatikan / dihidupkan. _delay_ms (LOCK_INPUT_TIME); }}; pulangan (0); }

Pengaturcaraan selesai. Seterusnya, membina dan menyusun kod projek ke dalam fail hex.

Memuat naik fail HEX ke dalam memori flash mikrokontroler: ketik tetingkap prompt DOS arahan:

avrdude –c [nama programmer] –p m328p –u –U flash: w: [nama fail hex anda]

Dalam kes saya adalah:

avrdude –c ISPProgv1 –p m328p –u –U flash: w: PWM.hex

Perintah ini menulis fail hex ke memori mikrokontroler. Tonton video dengan penerangan terperinci mengenai pembakaran memori kilat mikrokontroler: Pembakaran memori kilat mikrokontroler…

Okey! Kini, mikrokontroler berfungsi mengikut arahan program kami. Mari kita periksa!

Langkah 6: Litar Elektrik

Litar Elektrik
Litar Elektrik
Litar Elektrik
Litar Elektrik

Sambungkan komponen mengikut gambarajah skematik.

Disyorkan: