- PWM Sinyali nedir?
- PIC16F877A kullanan PWM:
- PIC'i PWM sinyalleri oluşturacak şekilde programlama:
- Şemalar ve Testler:
- Donanım Üzerinde Çalışmak:
Bu, MPLAB ve XC8 kullanarak PIC mikro denetleyicilerini öğrenmeye ilişkin 10. öğreticimizdir. Şimdiye kadar, PIC ile yanıp sönen LED, PIC'de Zamanlayıcılar, LCD arayüz oluşturma, 7 segmentli arayüz oluşturma, PIC kullanarak ADC vb. Gibi birçok temel öğreticiyi ele aldık. Mutlak bir acemiyseniz, lütfen PIC öğreticilerinin tam listesini buradan ziyaret edin ve öğrenmeye başla.
Bu eğitimde, PIC PIC16F877A kullanarak PWM sinyallerinin nasıl üretileceğini öğreneceğiz. PIC MCU'muz, PWM sinyalleri oluşturmak için kullanılabilen Karşılaştırma Yakalama modülü (CCP) adlı özel bir modüle sahiptir. Burada,% 0 ile% 100 arasında değişken bir görev döngüsüne sahip 5 kHz'lik bir PWM üreteceğiz. Görev döngüsünü değiştirmek için bir potansiyometre kullanıyoruz, bu nedenle PWM'ye başlamadan önce ADC eğitimini öğrenmeniz önerilir. PWM modülü ayrıca frekansını ayarlamak için zamanlayıcılar kullanır, dolayısıyla burada önceden zamanlayıcıları nasıl kullanacağınızı öğrenin. Ayrıca, bu eğitimde PWM değerlerini Analog voltaja dönüştürmek için bir RC devresi ve bir LED kullanacağız ve LED ışığını kısmak için kullanacağız.
PWM Sinyali nedir?
Darbe Genişlik Modülasyonu (PWM), en yaygın olarak kontrol devrelerinde kullanılan dijital bir sinyaldir. Bu sinyal, önceden tanımlanmış bir süre ve hızda yüksek (5v) ve düşük (0v) olarak ayarlanır. Sinyalin yüksek kaldığı süreye "açık kalma süresi" ve sinyalin düşük kaldığı süre "kapalı kalma süresi" olarak adlandırılır. Aşağıda tartışıldığı gibi bir PWM için iki önemli parametre vardır:
PWM'nin görev döngüsü:
PWM sinyalinin YÜKSEK (açık kalma süresi) kaldığı sürenin yüzdesi görev döngüsü olarak adlandırılır. Sinyal her zaman AÇIK ise% 100 görev döngüsündedir ve her zaman kapalıysa% 0 görev çevrimidir.
Görev Döngüsü = Açma süresi / (Açma süresi + Kapatma süresi)
Bir PWM'nin Frekansı:
Bir PWM sinyalinin frekansı, bir PWM'nin bir periyodu ne kadar hızlı tamamladığını belirler. Bir Periyot, yukarıdaki şekilde gösterildiği gibi bir PWM sinyalinin AÇIK ve KAPALI durumudur. Eğitimimizde 5KHz'lik bir frekans ayarlayacağız.
PIC16F877A kullanan PWM:
PIC Mikrodenetleyicimizde CCP (PWM Yakalama Karşılaştır) modülünü kullanarak PWM sinyalleri üretilebilir. PWM sinyalimizin çözünürlüğü 10 bittir, yani 0 değeri için% 0 görev döngüsü ve 1024 (2 ^ 10) değeri için% 100 görev döngüsü olacaktır. PIC MCU'muzda (CCP1 ve CCP2) iki CCP modülü vardır, bu, iki farklı pim (pim 17 ve 16) üzerinde aynı anda iki PWM sinyali oluşturabileceğimiz anlamına gelir, eğitimimizde pim 17'de PWM sinyalleri oluşturmak için CCP1 kullanıyoruz.
Aşağıdaki kayıtlar, PIC MCU'yu kullanarak PWM sinyalleri oluşturmak için kullanılır:
- CCP1CON (CCP1 kontrol Kaydı)
- T2CON (Zamanlayıcı 2 Kontrol Kaydı)
- PR2 (Zamanlayıcı 2 modüllü Dönem Kaydı)
- CCPR1L (CCP Register 1 Low)
PIC'i PWM sinyalleri oluşturacak şekilde programlama:
Programımızda bir potansiyometreden 0-5V'luk bir Analog voltaj okuyacağız ve ADC modülümüzü kullanarak 0-1024'e eşleştireceğiz. Daha sonra 5000Hz frekanslı bir PWM sinyali oluşturuyoruz ve görev döngüsünü Analog giriş voltajına göre değiştiriyoruz. Yani 0-1024,% 0-% 100 Görev döngüsüne dönüştürülecektir. Bu eğitim, ADC'yi PIC'de kullanmayı zaten öğrendiğinizi varsayar, buradan okuyun, çünkü bu eğitimde onunla ilgili ayrıntıları atlayacağız.
Böylece, konfigürasyon bitleri ayarlandıktan ve program bir Analog değeri okuyacak şekilde yazıldığında, PWM ile devam edebiliriz.
CCP modülünü PWM işlemi için yapılandırırken aşağıdaki adımlar uygulanmalıdır:
- PR2 yazmacına yazarak PWM süresini ayarlayın.
- CCPR1L yazmacına ve CCP1CON <5: 4> bitlerine yazarak PWM görev döngüsünü ayarlayın.
- TRISC <2> bitini temizleyerek CCP1 pinini bir çıkış yapın.
- TMR2 ön ölçek değerini ayarlayın ve T2CON'a yazarak Timer2'yi etkinleştirin.
- CCP1 modülünü PWM işlemi için yapılandırın.
Bu programda PWM sinyalleri oluşturmak için iki önemli işlev vardır. Biri, PWM modülünü kurmak için gerekli kayıtları başlatan ve ardından PWM'nin çalışması gereken frekansı ayarlayan PWM_Initialize () işlevidir, diğer işlev, PWM sinyalinin görev döngüsünü ayarlayacak PWM_Duty () işlevidir. gerekli kayıtlar.
PWM_Initialize () {PR2 = (_XTAL_FREQ / (PWM_freq * 4 * TMR2PRESCALE)) - 1; // Veri Sayfasını kullanarak PR2 formüllerini ayarlamak // PWM'nin 5KHZ'de çalışmasını sağlar CCP1M3 = 1; CCP1M2 = 1; // CCP1 modülünü yapılandırın T2CKPS0 = 1; T2CKPS1 = 0; TMR2ON = 1; // Zamanlayıcı modülünü yapılandırın TRISC2 = 0; // C üzerindeki bağlantı noktası pinini çıktı olarak yapın}
Yukarıdaki fonksiyon PWM başlatma fonksiyonudur, bu fonksiyonda CCP1 modülü, bit CCP1M3 ve CCP1M2'yi yüksek yaparak PWM'yi kullanacak şekilde ayarlanır.
Zamanlayıcı modülünün ön ölçekleyicisi, T2CKPS0 bitini yüksek ve T2CKPS1'i düşük hale getirerek ayarlanır.
Şimdi, PWM sinyalinin Frekansını ayarlamalıyız. Frekans değeri PR2 yazmacına yazılmalıdır. Aşağıdaki formüller kullanılarak istenen frekans ayarlanabilir
PWM Süresi = * 4 * TOSC * (TMR2 Ön Ölçek Değeri)
PR2 elde etmek için bu formülleri yeniden düzenlemek, PR2 = (Dönem / (4 * Tosc * TMR2 Ön Ölçeklendirme)) - 1
Periyod = (1 / PWM_freq) ve Tosc = (1 / _XTAL_FREQ) olduğunu biliyoruz. Bu nedenle…..
PR2 = (_XTAL_FREQ / (PWM_freq * 4 * TMR2PRESCALE)) - 1;
Frekans bir kez ayarlandıktan sonra, frekansı tekrar değiştirmemiz gerekmedikçe bu işlevin tekrar çağrılmasına gerek yoktur. Bizim eğitimde ben atamış PWM_freq = 5000; Böylece PWM sinyalimiz için 5 KHz çalışma frekansı elde edebiliriz.
Şimdi aşağıdaki işlevi kullanarak PWM'nin görev döngüsünü ayarlayalım
PWM_Duty (unsigned int duty) {if (duty <1023) {duty = ((float) duty / 1023) * (_ XTAL_FREQ / (PWM_freq * TMR2PRESCALE)); // Azaltmada // duty = (((float) duty / 1023) * (1 / PWM_freq)) / ((1 / _XTAL_FREQ) * TMR2PRESCALE); CCP1X = görev & 1; // 1. biti saklayın CCP1Y = duty & 2; // 0. biti saklayın CCPR1L = duty >> 2; // Geriye dönük 8 biti saklayın}}
PWM sinyalimiz 10 bit çözünürlüğe sahiptir, bu nedenle PIC'miz sadece 8 bit veri hatlarına sahip olduğundan bu değer tek bir kayıtta saklanamaz. Bu nedenle, son iki LSB'yi saklamak ve sonra kalan 8 biti CCPR1L Kaydında saklamak için diğer iki bitlik CCP1CON <5: 4> (CCP1X ve CCP1Y) kullanıyoruz.
PWM görev döngüsü süresi aşağıdaki formüller kullanılarak hesaplanabilir:
PWM Görev Döngüsü = (CCPRIL: CCP1CON <5: 4>) * Tosc * (TMR2 Ön Ölçek Değeri)
CCPR1L ve CCP1CON'un değerini elde etmek için bu formülleri yeniden düzenlemek:
CCPRIL: CCP1Con <5: 4> = PWM Görev Döngüsü / (Tosc * TMR2 Ön Ölçek Değeri)
ADC'mizin değeri 0-1024 olacaktır, bunun% 0 -% 100 olması gerekir, bu nedenle PWM Görev Döngüsü = görev / 1023. Ayrıca, bu görev döngüsünü bir süreye dönüştürmek için onu dönemle (1 / PWM_freq) çarpmamız gerekir
Ayrıca Tosc = (1 / PWM_freq) olduğunu biliyoruz, dolayısıyla..
Görev = (((float) görev / 1023) * (1 / PWM_freq)) / ((1 / _XTAL_FREQ) * TMR2PRESCALE);
Yukarıdaki denklemi çözmek bize şunları verecektir:
Görev = ((float) görev / 1023) * (_XTAL_FREQ / (PWM_freq * TMR2PRESCALE));
Programın tamamını ayrıntılı Video ile birlikte aşağıdaki Kod bölümünde kontrol edebilirsiniz.
Şemalar ve Testler:
Her zamanki gibi, çıktıyı Proteus simülasyonu kullanarak doğrulayalım. Devre Şeması aşağıda gösterilmiştir.
7 potansiyometre bağlayın inci 0-5 bir voltaj beslemesine pimi. CCP1 modülü pin 17'ye (RC2) sahiptir, burada Dijital osiloskop kullanılarak doğrulanabilen PWM oluşturulacaktır. Ayrıca bunu değişken bir voltaja dönüştürmek için, çıkışı kapsam olmadan doğrulamak için bir RC filtresi ve bir LED kullandık.
RC Filtresi nedir?
Bir RC filtresi veya bir Düşük geçiş filtresi, direnç ve kapasitör olmak üzere iki pasif elemana sahip basit bir devredir. Bu iki bileşen, PWM sinyalimizin frekansını filtrelemek ve onu değişken bir DC voltajı yapmak için kullanılır.
Devreyi inceleyecek olursak, R girişine değişken voltaj uygulandığında C kondansatörü şarj olmaya başlayacaktır. Şimdi kapasitörün değerine bağlı olarak, kapasitörün tam olarak şarj olması biraz zaman alacak, bir kez şarj edildiğinde DC akımını engelleyecektir (kapasitörlerin DC'yi bloke ettiğini ancak AC'ye izin verdiğini unutmayın), bu nedenle giriş DC voltajı çıkışta görünecektir. Yüksek frekanslı PWM (AC sinyali) kapasitör üzerinden topraklanacaktır. Böylece kapasitör boyunca saf bir DC elde edilir. Bu proje için 1000Ohm ve 1uf değerlerinin uygun olduğu bulunmuştur. R ve C değerlerinin hesaplanması, bu eğitimin kapsamı dışında kalan transfer fonksiyonunu kullanarak devre analizini içerir.
Programın çıktısı aşağıda gösterildiği gibi Dijital Osiloskop kullanılarak doğrulanabilir, Potansiyometreyi değiştirin ve PWM'nin Görev döngüsü değişmelidir. Voltmetreyi kullanarak RC devresinin çıkış voltajını da görebiliriz. Her şey beklendiği gibi çalışıyorsa, donanımımıza devam edebiliriz. İşlemin tamamı için sonunda Videoyu kontrol edin.
Donanım Üzerinde Çalışmak:
Projenin donanım kurulumu çok basit, sadece aşağıda gösterilen PIC Perf kartımızı yeniden kullanacağız.
Analog voltajı beslemek için bir potansiyometreye de ihtiyacımız olacak, potuma (aşağıda gösterilmektedir) bazı dişi uç kabloları ekledim, böylece onları doğrudan PIC Perf panosuna bağlayabiliriz.
Son olarak çıkışı doğrulamak için, PWM sinyalinin nasıl çalıştığını görmek için bir RC devresine ve bir LED'e ihtiyacımız var, sadece küçük bir performans kartı kullandım ve aşağıda gösterildiği gibi RC devresini ve LED'i (parlaklığı kontrol etmek için) lehimledim.
Basit dişi-dişi bağlantı tellerini kullanabilir ve bunları yukarıda gösterilen şemalara göre bağlayabiliriz. Bağlantı tamamlandıktan sonra, programı pickit3'ümüzü kullanarak PIC'e yükleyin ve potansiyometrenizin girişine göre değişken bir voltaj elde edebilmelisiniz. Değişken çıkış, burada LED'in parlaklığını kontrol etmek için kullanılır.
Değişken çıkışları ölçmek için multimetreyi kullandım, farklı voltaj seviyeleri için LED'in parlaklığının değiştiğini de görebiliriz.
İşte bu, Analog gerilimi POT'tan okumak ve sırasıyla RC filtresi kullanılarak Değişken gerilime dönüştürülen PWM sinyallerine dönüştürmek için programladık ve sonuç donanımımız kullanılarak doğrulandı. Şüpheniz varsa veya bir yere takılırsanız lütfen aşağıdaki yorum bölümünü kullanın, size yardımcı olmaktan memnuniyet duyarız. Tüm çalışma videoda çalışmaktadır.
Ayrıca diğer mikrodenetleyicilerle ilgili diğer PWM Öğreticilerimize bakın:
- Raspberry Pi PWM Eğitimi
- Arduino Due ile PWM
- PWM kullanarak Arduino Tabanlı LED Dimmer
- ATmega32 Mikrodenetleyiciyi kullanan Güç LED Dimmer