İçindekiler:

AVR Mikrodenetleyici. Darbe Genişliği Modülasyonu. DC Motor Kontrolörü ve LED Işık Yoğunluğu: 6 Adım
AVR Mikrodenetleyici. Darbe Genişliği Modülasyonu. DC Motor Kontrolörü ve LED Işık Yoğunluğu: 6 Adım

Video: AVR Mikrodenetleyici. Darbe Genişliği Modülasyonu. DC Motor Kontrolörü ve LED Işık Yoğunluğu: 6 Adım

Video: AVR Mikrodenetleyici. Darbe Genişliği Modülasyonu. DC Motor Kontrolörü ve LED Işık Yoğunluğu: 6 Adım
Video: Mikroişlemciler - 07.05.2020 P3 - PWM Temelleri - 8051 Pulse Width Modulation (PWM) 2024, Kasım
Anonim
Image
Image

Herkese merhaba!

Darbe Genişlik Modülasyonu (PWM), telekomünikasyon ve güç kontrolünde çok yaygın bir tekniktir. Bir motor, bir LED, hoparlörler vb. olsun, bir elektrikli cihaza beslenen gücü kontrol etmek için yaygın olarak kullanılır. Temelde, taşıyıcı darbenin genişliğinin analog mesaj sinyaline göre değiştirildiği bir modülasyon tekniğidir..

DC motorun dönüş hızını ışık şiddetine bağlı olarak kontrol etmek için basit elektrik devresi yapıyoruz. Işık yoğunluğunu ölçmek için Analogdan Dijitale Dönüştürme gibi Light Dependent Resistor ve AVR mikrodenetleyici özelliklerini kullanacağız. Ayrıca Çift H-Bridge Motor Sürücü Modülü-L298N kullanacağız. Genellikle motorların hızını ve yönünü kontrol etmek için kullanılır, ancak belirli aydınlatma projelerinin parlaklığını artırmak gibi diğer projeler için de kullanılabilir. Ayrıca motorun dönüş yönünü değiştirmek için devremize bir buton eklendi.

1. Adım: Açıklama

Açıklama
Açıklama
Açıklama
Açıklama

Bu dünyadaki her cismin bir miktar ataleti vardır. Motor her çalıştırıldığında döner. Kapatıldığında, durma eğiliminde olacaktır. Ama hemen bitmiyor, biraz zaman alıyor. Ancak tamamen durmadan önce tekrar açılır! Böylece hareket etmeye başlar. Ancak şimdi bile tam hızına ulaşması biraz zaman alıyor. Ancak bu gerçekleşmeden önce kapatılır vb. Bu nedenle, bu eylemin genel etkisi, motorun sürekli olarak, ancak daha düşük bir hızda dönmesidir.

Darbe Genişliği Modülasyonu (PWM), tamamen açık ve tamamen kapalı seviyeleri arasında orta miktarda elektrik gücü sağlamak için nispeten yeni bir güç anahtarlama tekniğidir. Genellikle, dijital darbeler aynı açık ve kapalı zaman periyoduna sahiptir, ancak bazı durumlarda dijital palsın daha fazla/daha az açık/kapalı zamanına sahip olması gerekir. PWM tekniğinde, gerekli ara voltaj değerlerini elde etmek için eşit olmayan miktarda açık ve kapalı durumda dijital darbeler oluşturuyoruz.

Görev döngüsü, tam bir dijital darbede yüksek voltaj süresinin yüzdesi ile tanımlanır. Şu şekilde hesaplanabilir:

Görev döngüsünün %'si = T on /T (dönem süresi) x 100

Bir problem cümlesi alalım. %45 görev döngüsüne sahip 50 Hz PWM sinyali üretmemiz gerekiyor.

Frekans = 50 Hz

Zaman periyodu, T = T(açık) + T(kapalı) = 1/50 = 0.02 s = 20 ms

Görev Döngüsü = %45

Böylece, yukarıda verilen denkleme göre çözerek elde ederiz.

T(açık) = 9 ms

T(kapalı) = 11 ms

Adım 2: AVR Zamanlayıcıları – PWM Modu

AVR Zamanlayıcıları – PWM Modu
AVR Zamanlayıcıları – PWM Modu
AVR Zamanlayıcıları – PWM Modu
AVR Zamanlayıcıları – PWM Modu

PWM yapmak için AVR ayrı bir donanım içerir! Bunu kullanarak CPU, donanıma belirli bir görev döngüsünün PWM'sini üretme talimatı verir. ATmega328'in 6 PWM çıkışı vardır, 2'si zamanlayıcı/sayaç0'da (8 bit), 2'si zamanlayıcı/sayaç1'de (16 bit) ve 2'si zamanlayıcı/sayaç2'de (8 bit) bulunur. Timer/Counter0, ATmega328'deki en basit PWM cihazıdır. Zamanlayıcı/Sayaç0, 3 modda çalışabilir:

  • Hızlı PWM
  • Faz ve Frekans Düzeltmeli PWM
  • Faz Düzeltmeli PWM

bu modların her biri ters çevrilebilir veya ters çevrilemez.

PWM modunda Timer0'ı başlatın:

TCCR0A |=(1 << WGM00)|(1 << WGM01) - WGM kurulumu: Hızlı PWM

TCCR0A |= (1 << COM0A1)|(1 << COM0B1) - karşılaştırma çıkış modu A, B'yi ayarlayın

TCCR0B |= (1 << CS02) - ön ölçekleyici ile zamanlayıcıyı ayarla = 256

Adım 3: Işık Yoğunluğu Ölçümü - ADC ve LDR

Işık Yoğunluğu Ölçümü - ADC ve LDR
Işık Yoğunluğu Ölçümü - ADC ve LDR
Işık Yoğunluğu Ölçümü - ADC ve LDR
Işık Yoğunluğu Ölçümü - ADC ve LDR
Işık Yoğunluğu Ölçümü - ADC ve LDR
Işık Yoğunluğu Ölçümü - ADC ve LDR

Işığa Bağlı Direnç (LDR), yüzeyine ışık düştüğünde direncini değiştiren bir dönüştürücüdür.

LDR'ler, ışığa duyarlı özelliklerine sahip olmalarını sağlamak için yarı iletken malzemelerden yapılmıştır. Bu LDR'ler veya FOTO DİRENÇLER “Foto İletkenlik” prensibi ile çalışır. Şimdi bu ilkenin söylediği, ışık LDR'nin yüzeyine düştüğünde (bu durumda) elemanın iletkenliği artar veya başka bir deyişle, ışık LDR'nin yüzeyine düştüğünde LDR'nin direnci azalır. LDR direncindeki bu azalma özelliği, yüzeyde kullanılan yarı iletken malzemenin bir özelliği olduğu için elde edilir. LDR, çoğu zaman ışığın varlığını tespit etmek veya ışığın yoğunluğunu ölçmek için kullanılır.

Harici sürekli bilgiyi (analog bilgi) bir dijital/bilgisayar sistemine aktarmak için, onları tamsayı (dijital) değerlere dönüştürmemiz gerekir. Bu tür dönüştürme, Analogdan Dijitale Dönüştürücü (ADC) tarafından gerçekleştirilir. Analog bir değeri dijital değere dönüştürme işlemi, Analogdan Dijitale Dönüştürme olarak bilinir. Kısacası Analog sinyaller, ses ve ışık gibi etrafımızdaki gerçek dünya sinyalleridir.

Dijital sinyaller, mikrodenetleyiciler gibi dijital sistemler tarafından iyi anlaşılan dijital veya sayısal formattaki analog eşdeğerlerdir. ADC, analog sinyalleri ölçen ve aynı sinyalin dijital bir eşdeğerini üreten böyle bir donanımdır. AVR mikrodenetleyicileri, analog voltajı bir tamsayıya dönüştürmek için dahili ADC tesisine sahiptir. AVR, onu 0 ila 1023 arasında 10 bitlik bir sayıya dönüştürür.

Işık yoğunluğunu ölçmek için LDR ile bölücü devreden gelen voltaj seviyesinin analogdan dijitale dönüştürülmesini kullanıyoruz.

ADC'yi başlat:

TADCSRA |= (1<<ADEN) - ADC'yi etkinleştir

ADCSRA |= (1<<ADPS2)| (1<<ADPS1)| (1ADPS0) - ADC ön ölçekleyicisini ayarla = 128

ADMUX = (1 << REFS0) - ayar gerilimi referansı = AVCC; - Giriş Kanalını ayarlayın = ADC0

ADC AVR mikrodenetleyicisinin ayrıntılı bir açıklamasını içeren videoyu izleyin: AVR Mikrodenetleyici. Işık Yoğunluğu Ölçümü. ADC ve LDR

Adım 4: Kontrol Cihazı DC Motor ve Çift H-Köprü Motor Sürücü Modülü-L298N

Kontrolör DC Motor ve Çift H-Köprü Motor Sürücü Modülü-L298N
Kontrolör DC Motor ve Çift H-Köprü Motor Sürücü Modülü-L298N
Kontrolör DC Motor ve Çift H-Köprü Motor Sürücü Modülü-L298N
Kontrolör DC Motor ve Çift H-Köprü Motor Sürücü Modülü-L298N
Kontrolör DC Motor ve Çift H-Köprü Motor Sürücü Modülü-L298N
Kontrolör DC Motor ve Çift H-Köprü Motor Sürücü Modülü-L298N

DC motor sürücüleri kullanıyoruz çünkü mikrodenetleyiciler genel olarak 100 miliamperden daha fazla akım iletme yeteneğine sahip değiller. Mikrodenetleyiciler akıllıdır ancak güçlü değildir; Bu modül, yüksek güçlü DC motorları sürmek için mikrodenetleyicilere bazı kaslar ekleyecektir. Her biri 2 amper veya bir step motora kadar aynı anda 2 DC motoru kontrol edebilir. PWM kullanarak hızı ve ayrıca motorların dönüş yönünü kontrol edebiliriz. Ayrıca, LED bandın parlaklığını sürmek için kullanılır.

Pin açıklaması:

DC motoru bağlamak için OUT1 ve OUT2 portu. LED bandı bağlamak için OUT3 ve OUT4.

ENA ve ENB etkinleştirme pinleridir: ENA'yı yüksek(+5V)'ye bağlayarak OUT1 ve OUT2 bağlantı noktalarını etkinleştirir.

ENA pinini low(GND)'ye bağlarsanız OUT1 ve OUT2'yi devre dışı bırakır. Benzer şekilde ENB ve OUT3 ve OUT4 için.

IN1 ila IN4, AVR'ye bağlanacak olan giriş pinleridir.

IN1-yüksek(+5V), IN2-düşük(GND) ise OUT1 yüksek ve OUT2 düşük olur, böylece motoru çalıştırabiliriz.

IN3-yüksek(+5V), IN4-düşük(GND) ise, OUT4 yüksek ve OUT3 düşük olur, böylece LED şerit ışığı yanar.

Motorun dönüş yönünü tersine çevirmek istiyorsanız, IN3 ve IN4 için benzer şekilde IN1 ve IN2 polaritesini ters çevirmeniz yeterlidir.

ENA ve ENB'ye PWM sinyali uygulayarak iki farklı çıkış portundaki motorların hızını kontrol edebilirsiniz.

Kart nominal olarak 7V'den 12V'a kadar kabul edebilir.

Jumper'lar: Üç adet jumper pini vardır; Jumper 1: Motorunuz 12V'den fazla beslemeye ihtiyacınız varsa, Jumper 1'i ayırmanız ve 12V terminalinde istenen voltajı (maks 35V) uygulamanız gerekir. 5V terminalinde başka bir 5V besleme ve giriş getirin. Evet, 12V'den fazla uygulamanız gerekiyorsa (Jumper 1 çıkarıldığında) 5V girmelisiniz.

5V girişi, IC'nin düzgün çalışması içindir, çünkü jumper'ın çıkarılması dahili 5V regülatörü devre dışı bırakacak ve 12V terminalinden gelen daha yüksek giriş voltajına karşı koruma sağlayacaktır.

5V terminali, beslemeniz 7V ile 12V arasındaysa çıkış görevi görür ve 12V'den fazla uygularsanız ve jumper çıkarılırsa giriş görevi görür.

Jumper 2 ve Jumper 3: Bu iki jumper'ı kaldırırsanız, mikrodenetleyiciden etkinleştirme ve devre dışı bırakma sinyalini girmeniz gerekir, kullanıcıların çoğu iki jumper'ı çıkarmayı ve mikrodenetleyiciden gelen sinyali uygulamayı tercih eder.

İki jumper'ı tutarsanız, OUT1'den OUT4'e her zaman etkinleştirilecektir. OUT1 ve OUT2 için ENA jumper'ını hatırlayın. OUT3 ve OUT4 için ENB jumper'ı.

Adım 5: C'de Bir Program İçin Kod Yazma. HEX Dosyasını Mikrodenetleyici Flash Belleğine Yükleme

Entegre Geliştirme Platformu - Atmel Studio'yu kullanarak AVR mikrodenetleyici uygulamasının C Kodunda yazılması ve oluşturulması.

#ifndef F_CPU#define F_CPU 16000000UL // denetleyici kristal frekansını söylüyor (16 MHz AVR ATMega328P) #endif

#include // pinler üzerinde veri akışı kontrolünü etkinleştirmek için üstbilgi. Pinleri, portları vb. tanımlar. Programda gecikme fonksiyonunu etkinleştirmek için #include //başlık

#define BUTTON1 2 // buton switch B portuna bağlı pin 2 pin 2'ye bağlı #define DEBOUNCE_TIME 25 // "de-bouncing" butonu için bekleme süresi #define LOCK_INPUT_TIME 300 // butona basıldıktan sonra bekleme süresi

// Timer0, PWM Başlatma void timer0_init() { // geçiş modunda ve CTC modunda zamanlayıcı OC0A, OC0B pinini ayarlayın TCCR0A |= (1 << COM0A1)|(1 << COM0B1)|(1 << WGM00)| (1 << WGM01); // ön ölçekleyici ile zamanlayıcıyı ayarla = 256 TCCR0B |= (1 << CS02); // sayacı başlat TCNT0 = 0; // karşılaştırma değerini başlat OCR0A = 0; }

// ADC Başlatma void ADC_init() { // ADC'yi etkinleştir, örnekleme freq=osc_freq/128 ön ölçekleyiciyi maksimum değere ayarla, 128 ADCSRA |= (1<<ADEN) | (1<<ADPS2)| (1<< ADPS1)| (1<<ADPS0);

ADMUX = (1<<REFS0); // Voltaj Referansını (AVCC) seçin

// Düğme anahtarı durumu unsigned char button_state() {

/* BUTTON1 biti temizlendiğinde butona basılır */

if (!(PINB & (1<)

{

_delay_ms(DEBOUNCE_TIME);

if (!(PINB & (1<)

}

0 döndür;

}

// Bağlantı Noktaları Başlatma void port_init() { DDRB =0b00011011; //PB0-IN1, PB1-IN2, PB3-IN3, PB4-IN4, PB2 - BUTON ANAHTARI DOĞRUDAN PORTB=0b00010110;

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

DDRC = 0b00000000; // PC0-ADC PORTC=0b00000000; // PORTC'nin tüm pinlerini kapatacak şekilde düşük ayarlayın. }

// Bu işlev, analogdan dijitale dönüştürmenin değerini okur. uint16_t get_LightLevel() { _delay_ms(10); // Kanalın seçilmesi için biraz bekleyin ADCSRA |= (1<<ADSC); // ADSC bitini ayarlayarak ADC dönüşümünü başlatın. ADSC'ye 1 yaz

while(ADCSRA & (1<<ADSC)); // Dönüşümün tamamlanmasını bekleyin

// ADSC o zamana kadar tekrar 0 olur, döngüyü sürekli çalıştır _delay_ms(10); dönüş (ADC); // 10 bitlik sonucu döndür

}

// Bu işlev, bir sayıyı (0-1023) bir aralıktan diğerine (0-100) yeniden eşler. uint32_t haritası(uint32_t x, uint32_t in_min, uint32_t in_max, uint32_t out_min, uint32_t out_max) { dönüş (x - in_min) * (out_max - out_min) / (in_maks - in_min) + out_min; }

int ana(boşluk)

{ uint16_t i1=0;

port_init();

timer0_init(); ADC_init(); // başlatma ADC'si

süre (1)

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

OCR0A=i1; // Çıkış karşılaştırma kayıt kanalını ayarla A OCR0B=100-i1; // Çıkış karşılaştırma kayıt kanalı B'yi ayarla (ters çevrilmiş)

if (button_state()) // Düğmeye basılırsa, LED'in durumunu değiştirin ve 300ms (#define LOCK_INPUT_TIME) { PORTB ^= (1<<0); // IN1 pininin mevcut durumunu değiştiriyoruz. PORTB ^= (1<<1); // IN2 pininin mevcut durumunu değiştiriyoruz. Motorun dönüş yönünü ters çevirin

PORTB ^= (1<<3); // IN3 pininin mevcut durumunu değiştiriyoruz. PORTB ^= (1<<4); // IN4 pininin mevcut durumunu değiştiriyoruz. LED Bant kapalı/açık. _delay_ms(LOCK_INPUT_TIME); } }; dönüş (0); }

Programlama tamamlandı. Ardından, proje kodunu hex dosyasına derlemek ve derlemek.

HEX dosyasını mikrodenetleyici flash belleğine yükleme: DOS komut penceresine şu komutu yazın:

avrdude –c [programcının adı] –p m328p –u –U flash:w:[hex dosyanızın adı]

Benim durumumda:

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

Bu komut, hex dosyasını mikrodenetleyicinin belleğine yazar. Mikrodenetleyici flash bellek yakma işleminin ayrıntılı bir açıklamasını içeren videoyu izleyin: Mikrodenetleyici flash bellek yakma…

Tamam! Artık mikrodenetleyici programımızın talimatlarına göre çalışmaktadır. Hadi kontrol edelim!

Adım 6: Elektrik Devresi

Elektrik Devresi
Elektrik Devresi
Elektrik Devresi
Elektrik Devresi

Bileşenleri şematik diyagrama göre bağlayın.

Önerilen: