Daftar Isi:

Mikrokontroler AVR. Modulasi Lebar Pulsa. pengontrol Motor DC dan Intensitas Cahaya LED.: 6 Langkah
Mikrokontroler AVR. Modulasi Lebar Pulsa. pengontrol Motor DC dan Intensitas Cahaya LED.: 6 Langkah

Video: Mikrokontroler AVR. Modulasi Lebar Pulsa. pengontrol Motor DC dan Intensitas Cahaya LED.: 6 Langkah

Video: Mikrokontroler AVR. Modulasi Lebar Pulsa. pengontrol Motor DC dan Intensitas Cahaya LED.: 6 Langkah
Video: Rangkaian dan Simulasi Pengaturan Intensitas Cahaya LED Menggunakan PWM (Proteus dan Arduino) 2024, November
Anonim
Image
Image

Halo semuanya!

Pulse Width Modulation (PWM) adalah teknik yang sangat umum dalam telekomunikasi dan kontrol daya. biasanya digunakan untuk mengontrol daya yang diumpankan ke perangkat listrik, apakah itu motor, LED, speaker, dll. Ini pada dasarnya adalah teknik modulasi, di mana lebar pulsa pembawa divariasikan sesuai dengan sinyal pesan analog.

Kami membuat rangkaian listrik sederhana untuk mengontrol kecepatan putaran motor DC pada intensitas cahaya yang bergantung. Kita akan menggunakan fitur Light Dependent Resistor dan mikrokontroler AVR seperti Analog to Digital Conversion untuk mengukur intensitas cahaya. Juga kita akan menggunakan Modul Driver Motor H-Bridge Ganda-L298N. Ini biasanya digunakan dalam mengendalikan kecepatan dan arah motor, tetapi dapat digunakan untuk proyek lain seperti mengemudi kecerahan proyek pencahayaan tertentu. Juga, menambahkan tombol ke sirkuit kami untuk mengubah arah putaran mesin.

Langkah 1: Deskripsi

Keterangan
Keterangan
Keterangan
Keterangan

Setiap tubuh di dunia ini memiliki beberapa kelembaman. Motor berputar setiap kali dihidupkan. Begitu dimatikan, itu akan cenderung berhenti. Tapi itu tidak langsung berhenti, butuh waktu. Tapi sebelum berhenti sepenuhnya, itu dihidupkan lagi! Dengan demikian ia mulai bergerak. Tetapi bahkan sekarang, butuh beberapa waktu untuk mencapai kecepatan penuhnya. Tapi sebelum itu terjadi, itu dimatikan, dan seterusnya. Dengan demikian, efek keseluruhan dari tindakan ini adalah bahwa motor berputar terus menerus, tetapi pada kecepatan yang lebih rendah.

Pulse Width Modulation (PWM) adalah teknik peralihan daya yang relatif baru untuk menyediakan daya listrik dalam jumlah sedang antara tingkat yang sepenuhnya hidup dan yang sepenuhnya mati. Biasanya, pulsa digital memiliki periode waktu hidup dan mati yang sama, tetapi dalam beberapa situasi kita membutuhkan pulsa digital untuk memiliki waktu / waktu mati yang lebih/lebih sedikit. Dalam teknik PWM, kami membuat pulsa digital dengan jumlah status on dan off yang tidak sama untuk mendapatkan nilai tegangan menengah yang diperlukan.

Siklus kerja ditentukan oleh persentase durasi tegangan tinggi dalam pulsa digital lengkap. Itu dapat dihitung dengan:

% Siklus kerja = T on /T (periode waktu) x 100

Mari kita ambil pernyataan masalah. Kita perlu menghasilkan sinyal PWM 50 Hz yang memiliki siklus kerja 45%.

Frekuensi = 50 Hz

Periode waktu, T = T(on) + T(off) = 1/50 = 0,02 s = 20 ms

Siklus Tugas = 45%

Jadi, penyelesaian menurut persamaan yang diberikan di atas, kita dapatkan

T(on) = 9 ms

T(mati) = 11 ms

Langkah 2: Pengatur Waktu AVR – Mode PWM

Pengatur Waktu AVR – Mode PWM
Pengatur Waktu AVR – Mode PWM
Pengatur Waktu AVR – Mode PWM
Pengatur Waktu AVR – Mode PWM

Untuk membuat PWM, AVR berisi perangkat keras terpisah! Dengan menggunakan ini, CPU menginstruksikan perangkat keras untuk menghasilkan PWM dari siklus tugas tertentu. ATmega328 memiliki 6 keluaran PWM, 2 terletak pada timer/counter0 (8bit), 2 terletak pada timer/counter1 (16bit), dan 2 terletak pada timer/counter2 (8bit). Timer/Counter0 adalah perangkat PWM paling sederhana di ATmega328. Timer/Counter0 mampu berjalan pada 3 mode:

  • PWM cepat
  • Fase dan Frekuensi Dikoreksi PWM
  • Fase Dikoreksi PWM

masing-masing mode ini dapat dibalik atau tidak dibalik.

Inisialisasi Timer0 dalam mode PWM:

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

TCCR0A |= (1 << COM0A1)|(1 << COM0B1) - mengatur bandingkan mode keluaran A, B

TCCR0B |= (1 << CS02) - mengatur timer dengan prescaler = 256

Langkah 3: Pengukuran Intensitas Cahaya - ADC & LDR

Pengukuran Intensitas Cahaya - ADC & LDR
Pengukuran Intensitas Cahaya - ADC & LDR
Pengukuran Intensitas Cahaya - ADC & LDR
Pengukuran Intensitas Cahaya - ADC & LDR
Pengukuran Intensitas Cahaya - ADC & LDR
Pengukuran Intensitas Cahaya - ADC & LDR

Light Dependent Resistor (LDR) adalah transduser yang berubah resistansinya ketika cahaya jatuh pada permukaannya berubah.

LDR terbuat dari bahan semikonduktor untuk memungkinkan mereka memiliki sifat sensitif cahaya. LDR atau RESISTOR FOTO ini bekerja berdasarkan prinsip “Konduktivitas Foto”. Sekarang apa yang dikatakan prinsip ini adalah setiap kali cahaya jatuh di permukaan LDR (dalam hal ini) konduktansi elemen meningkat atau dengan kata lain resistansi LDR berkurang ketika cahaya jatuh di permukaan LDR. Properti penurunan resistansi untuk LDR ini dicapai karena merupakan properti bahan semikonduktor yang digunakan di permukaan. LDR sering digunakan untuk mendeteksi keberadaan cahaya atau untuk mengukur intensitas cahaya.

Untuk mentransfer informasi kontinu eksternal (informasi analog) ke dalam sistem digital/komputasi, kita harus mengubahnya menjadi nilai integer (digital). Jenis konversi ini dilakukan oleh Analog to Digital Converter (ADC). Proses mengubah nilai analog menjadi nilai digital dikenal sebagai Konversi Analog ke Digital. Singkatnya, sinyal Analog adalah sinyal dunia nyata di sekitar kita seperti suara dan cahaya.

Sinyal digital setara analog dalam format digital atau numerik yang dipahami dengan baik oleh sistem digital seperti mikrokontroler. ADC adalah salah satu perangkat keras yang mengukur sinyal analog dan menghasilkan ekuivalen digital dari sinyal yang sama. Mikrokontroler AVR memiliki fasilitas ADC bawaan untuk mengubah tegangan analog menjadi bilangan bulat. AVR mengubahnya menjadi bilangan 10-bit dengan range 0 sampai 1023.

Kami menggunakan analog ke digital mengubah level tegangan dari rangkaian pembagi dengan LDR untuk mengukur intensitas cahaya.

Inisialisasi ADC:

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

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

ADMUX = (1 << REFS0) - mengatur referensi tegangan = AVCC; - mengatur Saluran Input = ADC0

Tonton video dengan penjelasan rinci tentang mikrokontroler ADC AVR: Mikrokontroler AVR. Pengukuran Intensitas Cahaya. ADC & LDR

Langkah 4: Controller DC Motor & Dual H-Bridge Motor Driver Module-L298N

Pengontrol Motor DC & Modul Driver Motor H-Bridge Ganda-L298N
Pengontrol Motor DC & Modul Driver Motor H-Bridge Ganda-L298N
Pengontrol Motor DC & Modul Driver Motor H-Bridge Ganda-L298N
Pengontrol Motor DC & Modul Driver Motor H-Bridge Ganda-L298N
Pengontrol Motor DC & Modul Driver Motor H-Bridge Ganda-L298N
Pengontrol Motor DC & Modul Driver Motor H-Bridge Ganda-L298N

Kami menggunakan driver motor DC karena mikrokontroler tidak mampu mengalirkan arus tidak lebih dari 100 miliampere pada umumnya. Mikrokontroler itu pintar tapi tidak kuat; modul ini akan menambahkan beberapa otot ke mikrokontroler untuk menggerakkan motor DC berdaya tinggi. Hal ini dapat mengontrol 2 motor DC secara bersamaan hingga 2 amp masing-masing atau satu motor stepper. Kita dapat mengontrol kecepatan menggunakan PWM dan juga arah putaran motornya. Juga, Ini digunakan untuk menggerakkan kecerahan pita LED.

Deskripsi pin:

Port OUT1 dan OUT2, yaitu untuk menghubungkan motor DC. OUT3 dan OUT4 untuk menghubungkan pita LED.

ENA dan ENB adalah pin enable: dengan menghubungkan ENA ke high(+5V) memungkinkan port OUT1 dan OUT2.

Jika Anda menghubungkan pin ENA ke rendah (GND), itu menonaktifkan OUT1 dan OUT2. Demikian pula untuk ENB dan OUT3 dan OUT4.

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

Jika IN1-tinggi(+5V), IN2-rendah(GND), OUT1 menjadi tinggi dan OUT2 menjadi rendah, sehingga kita dapat menggerakkan motor.

Jika IN3-tinggi(+5V), IN4-rendah(GND), OUT4 menjadi tinggi dan OUT3 menjadi rendah, sehingga lampu pita LED menyala.

Jika Anda ingin membalikkan arah putaran motor hanya membalikkan polaritas IN1 dan IN2, begitu juga untuk IN3 dan IN4.

Dengan menerapkan sinyal PWM ke ENA dan ENB, Anda dapat mengontrol kecepatan motor pada dua port output yang berbeda.

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

Jumper: Ada tiga pin jumper; Jumper 1: Jika motor Anda membutuhkan suplai lebih dari 12V, Anda harus melepaskan Jumper 1 dan menerapkan tegangan yang diinginkan (maks 35V) pada terminal 12V. Bawa suplai dan input 5V lainnya di terminal 5V. Ya, Anda harus memasukkan 5V jika Anda perlu menerapkan lebih dari 12V (ketika Jumper 1 dilepas).

Input 5V adalah untuk berfungsinya IC dengan benar, karena melepas jumper akan menonaktifkan regulator 5V bawaan dan melindungi dari tegangan input yang lebih tinggi dari terminal 12V.

Terminal 5V bertindak sebagai output jika suplai Anda antara 7V hingga 12V dan bertindak sebagai input jika Anda menerapkan lebih dari 12V dan jumper dilepas.

Jumper 2 dan Jumper 3: Jika Anda melepas kedua jumper ini, Anda harus memasukkan sinyal aktifkan dan nonaktifkan dari mikrokontroler, sebagian besar pengguna lebih suka melepas dua jumper dan menerapkan sinyal dari mikrokontroler.

Jika Anda menyimpan dua jumper, OUT1 ke OUT4 akan selalu diaktifkan. Ingat jumper ENA untuk OUT1 dan OUT2. Jumper ENB untuk OUT3 dan OUT4.

Langkah 5: Menulis Kode untuk Program di C. Mengunggah File HEX Ke Memori Flash Mikrokontroler

Penulisan dan pembuatan aplikasi mikrokontroler AVR dalam C Code menggunakan Integrated Development Platform - Atmel Studio.

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

#include //header untuk mengaktifkan kontrol aliran data melalui pin. Mendefinisikan pin, port, dll. #include //header untuk mengaktifkan fungsi delay dalam program

#define BUTTON1 2 // sakelar tombol terhubung ke port B pin 2 #define DEBOUNCE_TIME 25 // waktu menunggu saat tombol "de-bouncing" #define LOCK_INPUT_TIME 300 // waktu menunggu setelah tombol ditekan

// Timer0, Inisialisasi PWM void timer0_init() { // set up timer OC0A, pin OC0B dalam mode toggle dan mode CTC TCCR0A |= (1 << COM0A1)|(1 << COM0B1)|(1 << WGM00)| (1 << WGM01); // set up timer dengan prescaler = 256 TCCR0B |= (1 << CS02); // inisialisasi penghitung TCNT0 = 0; // inisialisasi nilai perbandingan OCR0A = 0; }

// Inisialisasi ADC void ADC_init() { // Aktifkan ADC, sampling freq=osc_freq/128 set prescaler ke nilai maksimal, 128 ADCSRA |= (1<<ADEN) | (1<<ADPS2)| (1<< ADPS1)| (1<<ADPS0);

ADMUX = (1<<REFS0); // Pilih Referensi Tegangan (AVCC)

// Status sakelar tombol tidak ditandatangani char button_state() {

/* tombol ditekan saat BUTTON1 bit kosong */

jika (!(PIN & (1<

{

_delay_ms(DEBOUNCE_TIME);

jika (!(PIN & (1<

}

kembali 0;

}

// Inisialisasi Port void port_init() { DDRB =0b00011011; //PB0-IN1, PB1-IN2, PB3-IN3, PB4-IN4, PB2 - TOMBOL BERALIH PORTB=0b00010110;

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

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

// Fungsi ini membaca nilai dari konversi analog ke digital. uint16_t get_LightLevel() { _delay_ms(10); // Tunggu beberapa saat sampai channel terpilih ADCSRA |= (1<<ADSC); // Mulai konversi ADC dengan menyetel bit ADSC. Tulis 1 ke ADSC

while(ADCSRA & (1<<ADSC)); // Tunggu hingga konversi selesai

// ADSC menjadi 0 lagi sampai saat itu, jalankan loop terus menerus _delay_ms(10); kembali (ADC); // Kembalikan hasil 10-bit

}

// Fungsi ini Memetakan ulang angka dari satu rentang (0-1023) ke rentang lain (0-100). uint32_t map(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 (kosong)

{ uint16_t i1=0;

port_init();

timer0_init(); ADC_init(); // inisialisasi ADC

sementara (1)

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

OCR0A=i1; // Atur keluaran, bandingkan saluran register A OCR0B=100-i1; // Setel keluaran bandingkan register saluran B (terbalik)

if (button_state()) // Jika tombol ditekan, alihkan status LED dan tunda selama 300ms (#define LOCK_INPUT_TIME) { PORTB ^= (1<<0); // mengubah status pin IN1 saat ini. PORTB ^= (1<<1); // mengubah status pin IN2 saat ini. Membalikkan arah putaran motor

PORTB ^= (1<<3); // mengubah status pin IN3 saat ini. PORTB ^= (1<<4); // mengubah status pin IN4 saat ini. Pita LED mati/hidup. _delay_ms(LOCK_INPUT_TIME); } }; kembali (0); }

Pemrograman selesai. Selanjutnya, membangun dan mengkompilasi kode proyek ke dalam file hex.

Mengunggah file HEX ke memori flash mikrokontroler: ketik di jendela prompt DOS perintah:

avrdude –c [nama programmer] –p m328p –u –U flash:w:[nama file hex Anda]

Dalam kasus saya adalah:

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

Perintah ini menulis file hex ke memori mikrokontroler. Tonton video dengan deskripsi terperinci tentang pembakaran memori flash mikrokontroler: Pembakaran memori flash mikrokontroler…

Oke! Sekarang, mikrokontroler bekerja sesuai dengan instruksi program kami. Mari kita periksa!

Langkah 6: Sirkuit Listrik

Sirkuit Listrik
Sirkuit Listrik
Sirkuit Listrik
Sirkuit Listrik

Hubungkan komponen sesuai dengan diagram skematik.

Direkomendasikan: