- PWM (Darbe Genişlik Modülasyonu)
- ARM7-LPC2148'deki PWM Pimleri
- ARM7-LPC2148'deki PWM Kayıtları
- Gerekli Bileşenler
- Devre Şeması ve Bağlantılar
- PWM için ARM7-LPC2148'i programlama
- PWM ve ADC için LPC2148'in programlanmasına dahil olan adımlar
Bildiğimiz gibi, mikro denetleyiciler analog sensörlerden analog giriş alır ve bu sinyalleri işlemek için ADC (Analogdan Dijitale dönüştürücü) kullanır. Ancak bir mikro denetleyici, Servo motor, DC motor vb. Gibi analog çalıştırılan cihazları kontrol etmek için analog bir sinyal üretmek isterse ne olur? Mikrodenetleyiciler 1V, 5V gibi çıkış voltajı üretmezler, bunun yerine analog cihazları çalıştırmak için PWM adı verilen bir teknik kullanırlar. PWM'ye bir örnek, dizüstü bilgisayarımızın sıcaklığa göre hız kontrolüne tabi tutulması gereken soğutma fanıdır (DC motor) ve aynısı anakartlarda Darbe Genişliği Modülasyonu (PWM) tekniği kullanılarak gerçekleştirilir.
Bu eğitimde , ARM7-LPC2148 mikro denetleyicideki PWM'yi kullanarak bir LED'in parlaklığını kontrol edeceğiz.
PWM (Darbe Genişlik Modülasyonu)
PWM, motorun hızını, bir ledin parlaklığını vb. Kontrol etmek gibi dijital değerleri kullanarak analog cihazları kontrol etmenin iyi bir yoludur. PWM, saf analog çıkış sağlamasa da, Analog Cihazları kontrol etmek için iyi analog darbeler üretir. PWM, ortaya çıkan dalganın ortalama değerinde bir değişim elde etmek için aslında dikdörtgen bir darbe dalgasının genişliğini modüle eder.
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)
ARM7-LPC2148'deki PWM Pimleri
Aşağıdaki resim ARM7-LPC2148'in PWM çıkış pinlerini göstermektedir. PWM için toplam altı pin vardır.
PWM Kanalı |
LPC2148 Bağlantı Noktası Pimleri |
PWM1 |
P0.0 |
PWM2 |
P0.7 |
PWM3 |
P0.1 |
PWM4 |
P0.8 |
PWM5 |
P0.21 |
PWM6 |
P0.9 |
ARM7-LPC2148'deki PWM Kayıtları
Projemize başlamadan önce LPC2148'deki PWM kayıtlarını bilmemiz gerekiyor.
İşte PWM için LPC2148'de kullanılan kayıtların listesi
1. PWMPR: PWM Ön Ölçek Kaydı
Kullanım: 32-Bitlik bir kayıttır. PWM Zamanlayıcı Sayacını artırmadan önce PCLK'nin kaç kez çevrilmesi gerektiğini (eksi 1) içerir (Aslında ön ölçek sayacının maksimum değerini tutar).
2. PWMPC: PWM Ön Ölçek Sayacı
Kullanım: 32 bitlik bir kayıt . Artan sayaç değerini içerir. Bu değer PR değeri artı 1'e eşit olduğunda, PWM Zamanlayıcı Sayacı (TC) artırılır.
3. PWMTCR: PWM Zamanlayıcı Kontrol Kaydı
Kullanım: Sayaç Etkinleştirme, Sayaç Sıfırlama ve PWM Etkinleştirme kontrol bitlerini içerir. 8-Bitlik bir kayıttır.
7: 4 |
3 |
2 |
1 |
0 |
AYRILMIŞ |
PWM ETKİN |
AYRILMIŞ |
SAYAÇ SIFIRLAMA |
SAYAÇ ETKİNLEŞTİRME |
- PWM Etkinleştir: (Bit-3)
0- PWM Devre Dışı
1- PWM Etkin
- Sayaç Etkinleştirme: (Bit-0)
0- Sayaçları Devre Dışı Bırak
1- Sayacı Etkinleştir
- Sayaç sıfırlama: (Bit-1)
0- Hiçbir Şey Yapma.
1- PCLK'nin pozitif kenarında PWMTC & PWMPC'yi sıfırlar.
4. PWMTC: PWM Zamanlayıcı Sayacı
Kullanım: 32-Bitlik bir kayıttır. Artan PWM Zamanlayıcısının mevcut değerini içerir. Ön Ölçekleyici Sayacı (PC), Ön Ölçekleyici Kayıt (PR) değeri artı 1'e ulaştığında, bu sayaç artar.
5. PWMIR: PWM Kesme Kaydı
Kullanım: 16 Bitlik bir Kayıt. 0-6 PWM Maç Kanalları için kesme bayraklarını içerir. Bu kanal için bir kesinti meydana geldiğinde (MRx Interrupt), X'in kanal numarası olduğu (0 ila 6) bir kesme bayrağı ayarlanır.
6. PWMMR0-PWMMR6: PWM Maç Kaydı
Kullanım: 32-Bitlik bir kayıttır . Aslında Match Channel grubu, 6 tek kenar kontrollü veya 3 çift kenar kontrollü PWM çıkışının ayarlanmasına izin verir. Bu PWM çıkışlarını PWMPCR'deki gereksinimlerinize uyacak şekilde yapılandırmak için yedi Eşleştirme Kanalını değiştirebilirsiniz.
7. PWMMCR: PWM Maç Kontrol Kaydı
Kullanım: 32-Bitlik bir kayıttır. Seçilen Maç Kanalını kontrol eden Kesme, Sıfırlama ve Durdurma bitlerini içerir. PWM maç kayıtları ve PWM Zamanlayıcı sayaçları arasında bir eşleşme gerçekleşir.
31:21 |
20 |
19 |
18 |
.. |
5 |
4 |
3 |
2 |
1 |
0 |
AYRILMIŞ |
PWMMR6S |
PWMMR6R |
PWMMR6I |
.. |
PWMMR1S |
PWMMR1R |
PWMMR11 |
PWMMR0S |
PWMMR0R |
PWMMR01 |
Burada x, 0'dan 6'ya kadardır
- PWMMRxI (Bit-0)
PWM kesintilerini ETKİNLEŞTİR VEYA DEVRE DIŞI BIRAK
0- PWM Maç kesintilerini devre dışı bırakın.
1- PWM Match interrupt'ını etkinleştirin.
- PWMMRxR: (Bit-1)
RESET PWMTC - PWMRx ile her eşleştiğinde zamanlayıcı sayacı değeri
0- Hiçbir Şey Yapma.
1- PWMTC'yi sıfırlar.
- PWMMRxS: (Bit 2)
PWMTC Maç kayıt değerine ulaştığında PWMTC ve PWMPC'yi DURDURUN
0- PWM durdurma özelliğini devre dışı bırakın.
1- PWM Durdurma özelliğini etkinleştirin.
8. PWMPCR: PWM Kontrol Kaydı
Kullanım: 16 Bitlik bir kayıttır. 0-6 PWM çıkışlarını etkinleştiren bitleri içerir ve her çıkış için tek kenar veya çift kenar kontrolü seçer.
31:15 |
14: 9 |
8: 7 |
6: 2 |
1: 0 |
KULLANILMAYAN |
PWMENA6-PWMENA1 |
KULLANILMAYAN |
PWMSEL6-PWMSEL2 |
KULLANILMAYAN |
- PWMSELx (x: 2 ila 6)
- PWMx için Tek Kenar modu
- 1- PWMx için Çift Kenar Modu.
- PWMENAx (x: 1 ila 6)
- PWMx Devre Dışı Bırak.
- 1- PWMx Etkin.
9. PWMLER: PWM Latch Etkinleştirme Kaydı
Kullanım: 8-Bitlik bir Kayıt. Her Maç Kanalı için Match x Latch bitlerini içerir.
31: 7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
KULLANILMAYAN |
LEN6 |
UZUNLUK5 |
LEN4 |
LEN3 |
UZUNLUK2 |
LEN1 |
UZUNLUK0 |
LENx (x: 0 ila 6):
0- Yeni Eşleşme Değerlerinin yüklenmesini devre dışı bırakın
1- Yeni Eşleşme değerlerini (PWMMRx) PWMMatch Register'dan zamanlayıcı sıfırlandığında yükleyin.
Şimdi ARM mikro denetleyicideki Darbe Genişliği Modülasyonunu göstermek için donanım kurulumunu oluşturmaya başlayalım.
Gerekli Bileşenler
Donanım
- ARM7-LPC2148 Mikrodenetleyici
- 3.3V Voltaj Regülatörü IC
- 10k Potansiyometre
- LED (Herhangi bir renk)
- LCD (16x2) Ekran Modülü
- Breadboard
- Kabloların Bağlanması
Yazılım
- Keil uVision5
- Flash Magic Aracı
Devre Şeması ve Bağlantılar
LCD ve ARM7-LPC2148 arasındaki bağlantılar
ARM7-LPC2148 |
LCD (16x2) |
P0.4 |
RS (Kayıt Seçimi) |
P0.6 |
E (Etkinleştir) |
P0.12 |
D4 (Veri pini 4) |
P0.13 |
D5 (Veri pimi 5) |
P0.14 |
D6 (Veri pini 6) |
P0.15 |
D7 (Veri pini 7) |
GND |
VSS, R / W, K |
+ 5V |
VDD, A |
LED ve ARM7-LPC2148 arasındaki bağlantı
LED'in ANODE, LPC2148'in PWM çıkışına (P0.0) bağlanırken, LED'in CATHODE pini LPC2148'in GND pinine bağlıdır.
ARM7-LPC2148 ve 3.3V voltaj regülatörlü potansiyometre arasındaki bağlantı
3.3V Voltaj Regülatörü IC |
Pin işlevi |
ARM-7 LPC2148 Pimi |
1. Sol Pim |
- Ve GND'den |
GND pimi |
2. Merkez Pimi |
Düzenlenmiş + 3.3V Çıkış |
Potansiyometreye Giriş ve potansiyometrenin çıkışı LPC2148'in P0.28'ine |
3. Sağ Pim |
5V'den + Ve GİRİŞ |
+ 5V |
Dikkat edilecek noktalar
1. Burada LPC2148'in ADC pinine (P0.28) analog giriş değeri sağlamak için 3.3V'luk bir voltaj regülatörü kullanılmıştır ve 5V güç kullandığımız için 3.3V voltaj regülatörü ile voltajı düzenlememiz gerekir.
2. Analog girişi (ADC) LPC2148 pin P0.28'e sağlamak için voltajı (0V ila 3.3V) arasında değiştirmek için bir potansiyometre kullanılır.
PWM için ARM7-LPC2148'i programlama
ARM7-LPC2148'i programlamak için keil uVision ve Flash Magic aracına ihtiyacımız var. ARM7 Stick'i mikro USB portu üzerinden programlamak için USB Kablosu kullanıyoruz. Keil kullanarak kod yazıyoruz ve bir hex dosyası oluşturuyoruz ve ardından HEX dosyası Flash Magic kullanarak ARM7 çubuğuna flash yapıyor. Keil uVision ve Flash Magic'in yüklenmesi ve bunların nasıl kullanılacağı hakkında daha fazla bilgi için ARM7 LPC2148 Mikrodenetleyiciye Başlarken bağlantısını izleyin ve Keil uVision kullanarak Programlayın.
Bu eğitimde, LED'in parlaklığını kontrol etmek için ADC ve PWM tekniğini kullanacağız. Burada LPC2148'e ADC giriş pini P0.28 üzerinden analog giriş (0 ila 3.3V) verilir, ardından bu analog giriş dijital değere (0 ila 1023) dönüştürülür. Daha sonra LPC2148'in PWM çıkışı sadece 8 bit çözünürlüğe sahip olduğundan (2 8) bu değer tekrar dijital değere (0 - 255) dönüştürülür. LED, PWM pin P0.0'a bağlanır ve LED'in parlaklığı potansiyometre kullanılarak kontrol edilebilir. ARM7-LPC2148'deki ADC hakkında daha fazla bilgi edinmek için bağlantıyı takip edin.
PWM ve ADC için LPC2148'in programlanmasına dahil olan adımlar
Adım 1: - ilk şey etmektir PLL yapılandırmak sistem saatini ve programcılar ihtiyacı başına LPC2148 periferik saatini ayarlar olarak saat nesil için. LPC2148 için maksimum saat frekansı 60Mhz'dir. PLL saat üretimini yapılandırmak için aşağıdaki satırlar kullanılır.
void initilizePLL (void) // Saat üretimi için PLL kullanma işlevi { PLL0CON = 0x01; PLL0CFG = 0x24; PLL0FEED = 0xAA; PLL0FEED = 0x55; while (! (PLL0STAT & 0x00000400)); PLL0CON = 0x03; PLL0FEED = 0xAA; PLL0FEED = 0x55; VPBDIV = 0x01; }
Adım 2: - Sonraki şey, PINSEL kaydını kullanarak LPC2148'in PWM pinlerini ve PWM işlevini seçmektir. LPC2148'in PWM çıkışı için P0.0 kullandığımız için PINSEL0 kullanıyoruz.
PINSEL0 = 0x00000002; // PWM çıkışı için P0.0 pinini ayarlama
Adım 3: - Daha sonra, PWMTCR (Zamanlayıcı Kontrol Kaydı) kullanarak zamanlayıcıları SIFIRLAMAK gerekir.
PWMTCR = (1 << 1); // PWM Zamanlayıcı Kontrol Kaydını sayaç sıfırlama olarak ayarlama
Ve sonra, PWM'nin çözünürlüğüne karar veren ön ölçek değerini ayarlayın. Sıfıra ayarlıyorum
PWMPR = 0X00; // PWM ön ölçek değerini ayarlama
Adım 4: - Daha sonra, PWMMR0 için sıfırlama, kesmeler gibi işlemleri ayarlarken PWMMCR'yi (PWM eşleşme kontrol kaydı) ayarlamamız gerekir.
PWMMCR = (1 << 0) - (1 << 1); // PWM Maç Kontrol Kaydını Ayarlama
Adım 5: - PWM kanalının maksimum süresi PWMMR kullanılarak ayarlanır.
PWMMR0 = PWMvalue; // PWM değeri Maksimum değer verilmesi
Bizim durumumuzda maksimum değer 255'tir (Maksimum parlaklık için)
Adım 6: - Daha sonra PWMLER kullanarak ilgili eşleşme kayıtlarına Mandal Etkinleştirmeyi ayarlamamız gerekir.
PWMLER = (1 << 0); // Enalbe PWM mandalı
(PWMMR0 kullanıyoruz) Bu nedenle PWMLER'de 1 ayarlayarak ilgili biti etkinleştirin
Adım 7: - PWM çıkışını pime etkinleştirmek için PWM Zamanlayıcı sayaçlarını ve PWM modlarını etkinleştirmek için PWMTCR'yi kullanmamız gerekir.
PWMTCR = (1 << 0) - (1 << 3); // PWM ve PWM sayacının etkinleştirilmesi
Adım 8: - Şimdi PWM'nin görev döngüsünü ayarlamak için potansiyometre değerlerini ADC pini P0.28'den almamız gerekiyor. Bu nedenle, potansiyometrelerin analog girişini (0 - 3.3V) ADC değerlerine (0 - 1023) dönüştürmek için LPC2148'deki ADC modülünü kullanıyoruz.
Burada , LPC2148'in PWM'si 8-Bit çözünürlüğe sahip olduğundan, 0-1023 arasındaki değerleri 4'e bölerek 0-255'e dönüştürüyoruz (2 8).
Adım 9: - For LPC2148 ADC pimi P0.28 seçerek kullandığımız
PINSEL1 = 0x01000000; // P0.28'in ADC INPUT AD0CR olarak ayarlanması = (((14) << 8) - (1 << 21)); // A / D Dönüşümü için saati ve PDN'yi ayarlama
Aşağıdaki satırlar Analog girişi (0 - 3.3V) yakalar ve onu dijital değere (0 - 1023) dönüştürür. Daha sonra bu dijital değerler 4'e bölünerek (0'dan 255'e) dönüştürülür ve son olarak LED'in bağlı olduğu LPC2148'in P0.0 pinine PWM çıkışı olarak beslenir.
AD0CR - = (1 << 1); // ADC kayıt gecikme süresinde (10) AD0.1 kanalını seçin ; AD0CR - = (1 << 24); // A / D dönüşümünü başlatırken ((AD0DR1 & (1 << 31)) == 0); // ADC Veri kaydındaki DONE bitini kontrol edin adcvalue = (AD0DR1 >> 6) & 0x3ff; // SONUÇ'u ADC veri kütüğünden alın dutycycle = adcvalue / 4; // (0'dan 255'e) görev döngüsü değerlerini elde etmek için formül PWMMR1 = iş döngüsü; // görev döngüsü değerini PWM eşleşme yazmacına ayarla PWMLER - = (1 << 1); // İş döngüsü değeri ile PWM çıktısını etkinleştirin
Adım 10: - Daha sonra bu değerleri LCD (16X2) Ekran modülünde görüntüleyeceğiz. Bu yüzden, LCD ekran modülünü başlatmak için aşağıdaki satırları ekliyoruz
Void LCD_INITILIZE (void) // LCD'yi hazırlama işlevi { IO0DIR = 0x0000FFF0; // P0.12, P0.13, P0.14, P0.15, P0.4, P0.6 pinlerini OUTPUT gecikme süresi (20) olarak ayarlar; LCD_SEND (0x02); // LCD'yi 4-bit çalışma modunda başlat LCD_SEND (0x28); // 2 satır (16X2 ) LCD_SEND (0x0C); // İmleç kapalı iken göster LCD_SEND (0x06); // Otomatik artış imleci LCD_SEND (0x01); // Ekran net LCD_SEND (0x80); // İlk satır ilk konum }
Biz bağlı olarak LPC2148 ile 4-bit modunda LCD biz kemirmek (Üst Nibble & Aşağı Nibble) tarafından kemirme olarak görüntülenecek değerleri göndermek gerekiyor. Bu nedenle aşağıdaki satırlar kullanılır.
void LCD_DISPLAY (char * msg) // Tek tek gönderilen karakterleri yazdırma işlevi { uint8_t i = 0; while (msg! = 0) { IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0xF0) << 8)); // Üst yarım bayt gönderir IO0SET = 0x00000050; // RS HIGH & ENABLE HIGH veri yazdırmak için IO0CLR = 0x00000020; // RW DÜŞÜK Yazma modu gecikme süresi (2); IO0CLR = 0x00000040; // EN = 0, RS ve RW değişmedi (yani RS = 1, RW = 0) gecikme süresi (5); IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0x0F) << 12)); // Alt yarım bayt gönderir IO0SET = 0x00000050; // RS & EN YÜKSEK IO0CLR = 0x00000020; gecikme süresi (2); IO0CLR = 0x00000040; gecikme süresi (5); i ++; } }
Bu ADC & PWM değerlerini görüntülemek için int main () fonksiyonunda aşağıdaki satırları kullanıyoruz.
LCD_SEND (0x80); sprintf (displayadc, "adcvalue =% f", adcvalue); LCD_DISPLAY (displayadc); // ADC değerini göster (0 ila 1023) LCD_SEND (0xC0); sprintf (ledoutput, "PWM OP =%. 2f", parlaklık); LCD_DISPLAY (ledçıktı); // (0'dan 255'e) çalışma döngüsü değerlerini göster
Eğiticinin tam kodu ve video açıklaması aşağıda verilmiştir.