Mundarija:

AVR mikrokontroller. Puls kengligi modulyatsiyasi. DC vosita va LED yorug'lik intensivligini boshqaruvchi: 6 qadam
AVR mikrokontroller. Puls kengligi modulyatsiyasi. DC vosita va LED yorug'lik intensivligini boshqaruvchi: 6 qadam

Video: AVR mikrokontroller. Puls kengligi modulyatsiyasi. DC vosita va LED yorug'lik intensivligini boshqaruvchi: 6 qadam

Video: AVR mikrokontroller. Puls kengligi modulyatsiyasi. DC vosita va LED yorug'lik intensivligini boshqaruvchi: 6 qadam
Video: ESP32 Tutorial 15 - DC Motor Speed Control with ESP32 L293D | SunFounder's ESP32 IoT Learnig kit 2024, Noyabr
Anonim
Image
Image

Hammaga salom!

Puls kengligi modulyatsiyasi (PWM) - telekommunikatsiya va quvvatni boshqarishda juda keng tarqalgan usul. u odatda elektr moslamasiga uzatiladigan quvvatni boshqarish uchun ishlatiladi, u vosita bo'ladimi, LED, karnay va hokazo. Bu asosan modulyatsiya texnikasi bo'lib, unda analog pulsning kengligi analog signal signaliga muvofiq o'zgaradi..

Biz yorug'lik zo'riqishida doimiy dvigatelning aylanish tezligini boshqarish uchun oddiy elektr sxemasini qilamiz. Yorug'lik intensivligini o'lchash uchun biz nurga bog'liq rezistor va AVR mikrokontrollerining analogdan raqamli konversiyasiga o'tamiz. Shuningdek, biz L298N Dual H-Bridge dvigatel drayverini ishlatmoqchimiz. U odatda dvigatellarning tezligi va yo'nalishini boshqarishda ishlatiladi, lekin boshqa loyihalarda, masalan, ba'zi yorug'lik loyihalarining yorqinligini oshirish uchun ishlatilishi mumkin. Shuningdek, dvigatelning aylanish yo'nalishini o'zgartirish uchun bizning davrimizga tugma qo'shildi.

1 -qadam: tavsif

Tavsif
Tavsif
Tavsif
Tavsif

Bu dunyodagi har bir tananing o'ziga xos inertsiyasi bor. Dvigatel yoqilganda har doim aylanadi. Quvvat o'chirilishi bilan u to'xtashga moyil bo'ladi. Ammo bu darhol to'xtamaydi, biroz vaqt talab etiladi. Ammo to'liq to'xtashidan oldin, u yana yoqiladi! Shunday qilib, u harakatlana boshlaydi. Ammo hozir ham uning to'liq tezligiga erishish uchun biroz vaqt kerak. Lekin bu sodir bo'lishidan oldin, u o'chiriladi va hokazo. Shunday qilib, bu harakatning umumiy ta'siri shundaki, vosita uzluksiz, lekin past tezlikda aylanadi.

Pulse Width Modulation (PWM) - bu elektrni to'liq yoqish va o'chirish darajalari o'rtasida oraliq miqdorda elektr energiyasini etkazib berish uchun nisbatan yaqinda ishlatilgan quvvatni almashtirish usuli. Odatda, raqamli impulslar bir xil va bir xil vaqtga ega, lekin ba'zi hollarda bizga raqamli puls ko'proq/kamroq bo'lishi kerak. PWM texnikasida biz kerakli oraliq kuchlanish qiymatlarini olish uchun teng bo'lmagan yoqish va o'chirish holatiga ega raqamli pulslarni yaratamiz.

Ish tsikli to'liq raqamli pulsda yuqori kuchlanish davomiyligi foizi bilan belgilanadi. Buni quyidagicha hisoblash mumkin:

Duty davrining % = T on /T (davr vaqti) x 100

Keling, muammoning bayonotini olaylik. Biz 45% ish aylanishiga ega 50 Gts PWM signalini ishlab chiqarishimiz kerak.

Chastotasi = 50 Gts

Vaqt davri, T = T (yoqilgan) + T (o'chirilgan) = 1/50 = 0,02 s = 20 ms

Ish tsikli = 45%

Shunday qilib, yuqorida keltirilgan tenglama bo'yicha echim topamiz

T (yoqilgan) = 9 milodiy

T (o'chirilgan) = 11 milodiy

2 -qadam: AVR taymerlari - PWM rejimi

AVR taymerlari - PWM rejimi
AVR taymerlari - PWM rejimi
AVR taymerlari - PWM rejimi
AVR taymerlari - PWM rejimi

PWMni ishlab chiqarish uchun AVR alohida uskunani o'z ichiga oladi! Buni ishlatib, protsessor apparatga ma'lum bir ish tsiklidagi PWM ishlab chiqarishni buyuradi. ATmega328 -da 6 ta PWM chiqishi mavjud, 2 ta taymerda/taymerda (8bit), 2 ta taymerda/taymerda 1 (16bit), 2 ta taymerda/taymerda 2 (8bit) joylashgan. Taymer/Counter0 - ATmega328 -dagi eng oddiy PWM qurilmasi. Taymer/Counter0 3 rejimda ishlashga qodir:

  • Tez PWM
  • Bosim va chastota tuzatilgan PWM
  • Bosqich tuzatilgan PWM

bu rejimlarning har biri teskari yoki teskari bo'lishi mumkin.

PWM rejimida Timer0 -ni ishga tushiring:

TCCR0A | = (1 << WGM00) | (1 << WGM01) - WGMni sozlash: Tez PWM

TCCR0A | = (1 << COM0A1) | (1 << COM0B1) - A, B chiqish rejimini solishtiring

TCCR0B | = (1 << CS02) - taymerni oldindan hisoblagich bilan sozlash = 256

3 -qadam: yorug'lik intensivligini o'lchash - ADC & LDR

Yorug'lik intensivligini o'lchash - ADC & LDR
Yorug'lik intensivligini o'lchash - ADC & LDR
Yorug'lik intensivligini o'lchash - ADC & LDR
Yorug'lik intensivligini o'lchash - ADC & LDR
Yorug'lik intensivligini o'lchash - ADC & LDR
Yorug'lik intensivligini o'lchash - ADC & LDR

Nurga bog'liq rezistor (LDR) - yorug'lik o'zgarganda, uning qarshiligini o'zgartiradi.

LDRlar nur o'tkazuvchanlik xususiyatlariga ega bo'lish uchun yarimo'tkazgichli materiallardan tayyorlangan. Bu LDR yoki PHOTO RESISTORS "Foto o'tkazuvchanlik" tamoyili asosida ishlaydi. Endi LDR yuzasiga yorug'lik tushganda (bu holda) elementning o'tkazuvchanligi oshadi yoki boshqacha aytganda, yorug'lik LDR yuzasiga tushganda LDR qarshiligi pasayadi. LDR uchun qarshilik pasayishining bu xususiyatiga erishiladi, chunki u sirtda ishlatiladigan yarimo'tkazgichli materiallarga xosdir. LDR ko'pincha yorug'lik mavjudligini aniqlash yoki yorug'lik intensivligini o'lchash uchun ishlatiladi.

Tashqi uzluksiz ma'lumotni (analog ma'lumotni) raqamli/hisoblash tizimiga o'tkazish uchun biz ularni tamsayı (raqamli) qiymatlarga aylantirishimiz kerak. Ushbu turdagi konvertatsiya analog -raqamli konvertor (ADC) tomonidan amalga oshiriladi. Analog qiymatni raqamli qiymatga aylantirish jarayoni analogdan raqamli konversiyaga aylanadi. Qisqasi, analog signallar - bu atrofimizdagi tovush va yorug'lik kabi haqiqiy dunyo signallari.

Raqamli signallar raqamli yoki raqamli formatdagi analog ekvivalentlar bo'lib, ular mikrokontroller kabi raqamli tizimlar tomonidan yaxshi tushuniladi. ADC - analog signallarni o'lchaydigan va bir xil signalning raqamli ekvivalentini ishlab chiqaradigan apparat. AVR mikrokontrolerlarida analog kuchlanishni butun songa aylantirish uchun o'rnatilgan ADC qurilmasi mavjud. AVR uni 10 bitli 0 dan 1023 oralig'iga o'zgartiradi.

Yorug'lik intensivligini o'lchash uchun biz LDR bilan ajratuvchi sxemadan kuchlanish darajasini analogdan raqamli konvertatsiyaga o'tkazamiz.

ADC -ni ishga tushiring:

TADCSRA | = (1 << ADEN) - ADC ni yoqish

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

ADMUX = (1 << REFS0) - kuchlanish referansini o'rnatish = AVCC; - kirish kanali = ADC0 ni sozlash

Videoni ADC AVR mikrokontrollerining batafsil tavsifi bilan tomosha qiling: AVR Mikrokontroller. Yorug'lik intensivligini o'lchash. ADC va LDR

4-qadam: Dvigatel dvigatelini boshqaruvchi va er-xotin ko'prikli dvigatel drayveri moduli-L298N

Tekshiruvchi DC Motor va Dual H-Bridge Dvigatel Haydovchi Moduli-L298N
Tekshiruvchi DC Motor va Dual H-Bridge Dvigatel Haydovchi Moduli-L298N
Dvigatel dvigatelini boshqaruvchi va ikkitomonlama ko'prikli dvigatel drayveri moduli-L298N
Dvigatel dvigatelini boshqaruvchi va ikkitomonlama ko'prikli dvigatel drayveri moduli-L298N
Tekshiruvchi DC Motor va Dual H-Bridge Dvigatel Haydovchi Moduli-L298N
Tekshiruvchi DC Motor va Dual H-Bridge Dvigatel Haydovchi Moduli-L298N

Biz shahar motorli drayverlardan foydalanamiz, chunki mikrokontroller umuman 100 milliampdan oshmaydigan tokni uzatishga qodir emas. Mikrokontrollerlar aqlli, lekin kuchli emas; Ushbu modul yuqori quvvatli doimiy dvigatellarni haydash uchun mikrokontrollerlarga ba'zi mushaklarni qo'shadi. U bir vaqtning o'zida har birining 2 ampergacha yoki bir qadamli dvigatelini boshqarishi mumkin. Biz PWM yordamida tezlikni va dvigatellarning aylanish yo'nalishini nazorat qila olamiz. Bundan tashqari, u LED lentasining yorqinligini oshirish uchun ishlatiladi.

Pin tavsifi:

OUT1 va OUT2 porti, bu shahar motorini ulash uchun mo'ljallangan. LED tasmasini ulash uchun OUT3 va OUT4.

ENA va ENB - bu kirish pinlari: ENA ni yuqori (+5V) ga ulab, OUT1 va OUT2 portlarini yoqadi.

Agar siz ENA pinini past (GND) ga ulasangiz, u OUT1 va OUT2 ni o'chiradi. Xuddi shunday, ENB va OUT3 va OUT4 uchun.

IN1 - IN4 - bu AVR -ga ulanadigan kirish pinlari.

Agar IN1 baland (+5V), IN2 past (GND) bo'lsa, OUT1 balandga, OUT2 pastga burilsa, biz motorni haydashimiz mumkin.

Agar IN3-yuqori (+5V), IN4-past (GND) bo'lsa, OUT4 balandga, OUT3 esa pastga aylanadi, shuning uchun LED lenta nuri yonadi.

Agar siz dvigatelning aylanish yo'nalishini o'zgartirishni xohlasangiz, xuddi IN3 va IN4 uchun xuddi shunday IN1 va IN2 qutbini teskari aylantiring.

ENA va ENB ga PWM signalini qo'llash orqali siz dvigatellarning tezligini ikki xil chiqish portida boshqarishingiz mumkin.

Kengash nominal 7V dan 12V gacha qabul qilishi mumkin.

Jumpers: uchta o'tish pimi bor; 1 -jumper: Agar sizda dvigatelga 12V dan ortiq kuchlanish kerak bo'lsa, siz 1 -jumperni uzishingiz va 12V terminalda kerakli kuchlanishni (maksimal 35V) qo'llashingiz kerak. 5V terminalda yana 5V kuchlanish va kirishni keltiring. Ha, agar siz 12V dan yuqori kuch ishlatishingiz kerak bo'lsa, 5V kiritishingiz kerak (jumper 1 o'chirilganda).

5V kirish ICning to'g'ri ishlashi uchun mo'ljallangan, chunki o'tish moslamasini olib tashlash 5V regulyatorni o'chiradi va 12V terminaldan yuqori kirish kuchlanishidan himoya qiladi.

5V terminali, agar sizning ta'minotingiz 7V dan 12V gacha bo'lsa, chiqish vazifasini bajaradi va agar siz 12V dan yuqori kuchlanish ishlatilsa, o'tish vazifasini bajaradi.

Jumper 2 va Jumper 3: Agar siz bu ikkita o'tish moslamasini olib tashlasangiz, siz mikrokontrolderdan signalni yoqishingiz va o'chirishingiz kerak bo'ladi, ko'pchilik foydalanuvchilar ikkita o'tish moslamasini olib tashlashni va mikrokontrollerdan signalni qo'llashni afzal ko'rishadi.

Agar siz ikkita o'tish moslamasini ushlab tursangiz, OUT1 dan OUT4 har doim yoqiladi. OUT1 va OUT2 uchun ENA o'tish moslamasini eslang. OUT3 va OUT4 uchun ENB o'tish moslamasi.

5 -qadam: C dasturida kod yozish. HEX faylini mikrokontroller flesh xotirasiga yuklash

Integratsiyalashgan rivojlanish platformasi - Atmel Studio yordamida AVR mikrokontroller dasturini C kodida yozish va qurish.

#ifndef F_CPU #F_CPU 16000000UL ni aniqlang // nazoratchi kristalli chastotasini bildiradi (16 MGts AVR ATMega328P) #endif

#include // sarlavhasi pinlar ustidan ma'lumotlar oqimini boshqarishni yoqish uchun. Pim, port va boshqalarni belgilaydi. #Include // header dasturda kechiktirish funksiyasini yoqish uchun

#define BUTTON1 2 // tugmachasi B pin 2 ga ulangan #DEBOUNCE_TIME 25 ni aniqlang // "o'chirish" tugmachasini kutish vaqti #define LOCK_INPUT_TIME 300 // tugmani bosgandan keyin kutish vaqti

// Timer0, PWM Initialization void timer0_init () {// OC0A taymerini, OC0B pinini almashtirish rejimida va CTC rejimida sozlash TCCR0A | = (1 << COM0A1) | (1 << COM0B1) | (1 << WGM00) | (1 << WGM01); // taymerni oldindan hisoblagich bilan o'rnatish = 256 TCCR0B | = (1 << CS02); // hisoblagichni ishga tushirish TCNT0 = 0; // solishtirish qiymatini ishga tushirish OCR0A = 0; }

// ADC ishga tushirilishi bekor ADC_init () {// ADC ni yoqish, namuna olish chastotasi = osc_freq/128 prescalerni maksimal qiymatiga, 128 ADCSRA | = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);

ADMUX = (1 << REFS0); // Voltaj ma'lumotnomasini tanlang (AVCC)

// Tugmani almashtirish holati imzolanmagan char button_state () {

/ * BUTTON1 biti bo'sh bo'lganda tugma bosiladi */

agar (! (PINB va (1 <

{

_delay_ms (DEBOUNCE_TIME);

agar (! (PINB va (1 <

}

qaytarish 0;

}

// Portlarni ishga tushirish port_init () {DDRB = 0b00011011; // PB0-IN1, PB1-IN2, PB3-IN3, PB4-IN4, PB2-TUGMALARNI O'NIRISH To'g'ridan-to'g'ri PORTB = 0b00010110;

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

DDRC = 0b00000000; // PC0-ADC PORTC = 0b00000000; // PORTC -ning barcha pinlarini pastroq qilib qo'ying, u o'chadi. }

// Bu funksiya analog qiymatini raqamli konvertatsiyaga o'qiydi. uint16_t get_LightLevel () {_delay_ms (10); // Kanal tanlangan ADCSRA olishini biroz kuting | = (1 << ADSC); // ADSC bitini sozlash orqali ADC konvertatsiyasini boshlang. ADSCga 1 yozing

while (ADCSRA & (1 << ADSC)); // Konvertatsiya tugashini kuting

// ADSC yana 0 ga aylanadi, tsiklni doimiy ravishda ishga tushiring _delay_ms (10); qaytish (ADC); // 10 bitli natijani qaytaring

}

// Bu funksiya raqamni bir diapazondan (0-1023) boshqasiga (0-100) qayta xaritada ko'rsatadi. uint32_t xaritasi (uint32_t x, uint32_t in_min. }

int main (bekor)

{uint16_t i1 = 0;

port_init ();

taymer0_init (); ADC_init (); // ADCni ishga tushirish

vaqt (1)

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

OCR0A = i1; // Chiqish taqqoslash registri kanalini o'rnatish A OCR0B = 100-i1; // Chiqish taqqoslash registri kanalini o'rnating B (teskari)

if (button_state ()) // Agar tugma bosilsa, LED holatini o'zgartiring va 300ms kechiktiring (#define LOCK_INPUT_TIME) {PORTB ^= (1 << 0); // IN1 pinining hozirgi holatini o'zgartirish. PORTB ^= (1 << 1); // IN2 pinining hozirgi holatini o'zgartirish. Dvigatelning aylanish yo'nalishini teskari aylantiring

PORTB ^= (1 << 3); // IN3 pinining hozirgi holatini o'zgartirish. PORTB ^= (1 << 4); // IN4 pinining hozirgi holatini o'zgartirish. LED tasmasi o'chirilgan/yoqilgan. _delay_ms (LOCK_INPUT_TIME); }}; qaytish (0); }

Dasturlash tugallandi. Keyin, loyiha kodini hex faylga yaratish va yig'ish.

HEX faylini mikrokontroller flesh xotirasiga yuklash: DOS buyruq oynasiga buyruqni kiriting:

avrdude –c [dasturchining ismi] –p m328p –u –U chirog'i: w: [olti burchakli faylingizning nomi]

Mening holimda shunday:

avrdude –c ISPProgv1 –p m328p –u –U chirog'i: w: PWM.hex

Bu buyruq olti burchakli faylni mikrokontroller xotirasiga yozadi. Videoni mikrokontroller flesh xotirasining yonishi haqida batafsil tavsif bilan tomosha qiling: mikrokontroller flesh xotirasi yonmoqda…

Ok! Endi mikrokontroller dasturimiz ko'rsatmalariga muvofiq ishlaydi. Keling, buni tekshirib ko'ramiz!

6 -qadam: Elektr davri

Elektr davri
Elektr davri
Elektr davri
Elektr davri

Komponentlarni sxematik sxema bo'yicha ulang.

Tavsiya: