- Servo Motor
- LPC2148 PWM ve ADC kullanarak Servo Motorun Kontrol Edilmesi
- ARM7-LPC2148'de PWM ve ADC pimleri
- Gerekli Bileşenler
- Devre Şeması ve Bağlantılar
- Servo Motor Kontrolü için Programlama ARM7-LPC2148
Önceki eğitimimizde, step motoru ARM7-LPC2148 ile arayüzledik. Bu eğitimde, Servo Motoru ARM7-LPC2148 ile kontrol edeceğiz. Servo motor, step motora göre düşük güç tüketim avantajına sahiptir. Bir servo motor, istenen konuma ulaşıldığında güç tüketimini durdurur, ancak step motor, mili istenen konumda kilitlemek için güç tüketmeye devam eder. Servo motorlar, doğruluğu ve kolay kullanımı nedeniyle çoğunlukla Robotik Projelerinde kullanılmaktadır.
Bu eğitimde Servo Motor ve Servo ile ARM7-LPC2148 arasındaki arayüz hakkında bilgi edineceğiz. Servo motor şaftının konumunu değiştirmek için bir potansiyometre ve açı değerini görüntülemek için bir LCD de arabirim vardır.
Servo Motor
Bir Servo Motor, DC motor, konum kontrol sistemi ve dişlilerin bir kombinasyonudur. Servo motorun dönüşü, kendisine bir PWM sinyali uygulanarak kontrol edilir, PWM sinyalinin genişliği, motorun dönüş açısına ve yönüne karar verir. Burada, bu eğitimde SG90 Servo Motor kullanacağız, popüler ve en ucuz olanlardan biridir. SG90, 180 derecelik bir servodur. Yani bu servo ile ekseni 0-180 derece arasında konumlandırabiliriz:
- Çalışma Gerilimi: + 5V
- Dişli Tipi: Plastik
- Dönme Açısı: 0 ila 180 derece
- Ağırlık: 9gm
- Dönme momenti: 2.5kg / cm
Servo motor için programlamaya başlamadan önce, Servo motorun kontrol edilmesi için ne tür bir sinyal gönderileceğini bilmeliyiz. MCU’yu, Servo motorun sinyal kablosuna PWM sinyalleri gönderecek şekilde programlamalıyız. Servo motorun içinde, PWM sinyalinin görev döngüsünü okuyan ve aşağıdaki resimde gösterildiği gibi servo motor şaftını ilgili yere konumlandıran bir kontrol devresi vardır.
Her 20 milisaniye için Servo motor darbeyi kontrol eder. Bu nedenle, motor şaftını döndürmek için sinyalin darbe genişliğini ayarlayın.
- Servonun 0 dereceye dönüşü için 1 ms (1 milisaniye) darbe genişliği
- 90 dereceye kadar dönüş için 1,5 ms darbe genişliği (nötr konum)
- Servonun 180 dereceye dönüşü için 2 ms darbe genişliği.
Servoyu ARM7-LPC2148'e bağlamadan önce bu Servo Motor Test Devresi yardımıyla servonuzu test edebilirsiniz. Ayrıca bir servo motorun diğer Mikrodenetleyiciler ile nasıl arayüzlenebileceğini kontrol edin:
- Arduino kullanarak Servo Motor Kontrolü
- 8051 Mikrodenetleyicili Servo Motor Arayüzü
- MATLAB kullanarak Servo Motor Kontrolü
- Raspberry Pi ile Servo Motor Kontrolü
- Servo Motor ile MSP430G2'nin Arabirimi
- Servo Motor ile STM32F103C8 Arabirimi
LPC2148 PWM ve ADC kullanarak Servo Motorun Kontrol Edilmesi
Bir Servo Motor, PWM kullanılarak LPC2148 tarafından kontrol edilebilir. SERVO'nun PWM pinine 20ms periyotlu ve 50Hz frekanslı PWM sinyali sağlayarak servo motor milini 180 derece (-90 ila +90) civarında konumlandırabiliriz.
PWM sinyalinin görev döngüsünü değiştirmek ve servo motor şaftını döndürmek için bir Potansiyometre kullanılır, bu yöntem LPC2148'deki ADC modülü kullanılarak uygulanır. Bu nedenle, bu öğreticide uygulanacak hem PWM hem de ADC kavramlarına ihtiyacımız var. Bu nedenle, ARM7-LPC2148'de PWM ve ADC'yi öğrenmek için önceki eğitimlerimize bakın.
- ARM7-LPC2148'de PWM nasıl kullanılır
- ARM-LPLC2148'de ADC nasıl kullanılır
ARM7-LPC2148'de PWM ve ADC pimleri
Aşağıdaki resim, LPC2148'deki PWM ve ADC pinlerini göstermektedir. Sarı kutular (6) PWM pini ve siyah kutu (14) ADC pini gösterir.
Gerekli Bileşenler
Donanım
- ARM7-LPC2148
- LCD (16x2) Ekran Modülü
- Servo Motor (SG-90)
- 3.3V voltaj regülatörü
- 10k Potansiyometre (2 Adet)
- Breadboard
- Kabloların Bağlanması
Yazılım
- Keil uVision5
- Flash Magic Aracı
Devre Şeması ve Bağlantılar
Aşağıdaki tablo Servo Motor ve ARM7-LPC2148 arasındaki Bağlantıyı göstermektedir :
SERVO PİMLERİ |
ARM7-LPC2148 |
KIRMIZI (+ 5V) |
+ 5V |
KAHVERENGİ (GND) |
GND |
TURUNCU (PWM) |
P0.1 |
P0.1 pimi, LPC2148'in PWM çıkışıdır.
Aşağıdaki tablo, LCD ve ARM7-LPC2148 arasındaki devre bağlantılarını göstermektedir.
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 |
Aşağıdaki tablo ARM7 LPC2148 ve 3.3V voltaj regülatörlü potansiyometre arasındaki bağlantıları göstermektedir.
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 Edilmesi Gereken 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ılır. 5V güç kullandığımız için 3.3V voltaj regülatörü ile voltajı düzenlememiz gerekiyor.
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.
3. LPC2148'in P0.1 pini, motorun konumunu kontrol etmek için servo motora PWM çıkışı sağlar.
4. Analog giriş (ADC) değerine göre servo motorun konumu, LPC2148'in P0.1'deki PWM çıkış pinine (0'dan 180 derece) kadar değişir.
Servo Motor Kontrolü için Programlama ARM7-LPC2148
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.
Servo Motoru kontrol etmek için PWM ve ADC için LPC2148'i yapılandırmada yer alan adımlar
Adım 1: - LPC2148'i kodlamak için gerekli başlık dosyalarını ekleyin
#Dahil etmek
Adım 2: - bir sonraki şey etmektir PLL yapılandırmak programcılar ihtiyaç gereği sistem saati ve 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 3: - Sonraki yapılacak şey, PINSEL kaydını kullanarak LPC2148'in PWM pinlerini ve PWM işlevini seçmektir. LPC2148'in PWM çıkışı için P0.1 kullandığımız için PINSEL0 kullanıyoruz.
PINSEL0 - = 0x00000008; // LPC2148'in P0.1 pinini PWM3 olarak ayarlama
Adım 4: - Sonra, PWMTCR (Zamanlayıcı Kontrol Kaydı) kullanarak zamanlayıcıları SIFIRLAMAK gerekir.
PWMTCR = 0x02; // PWM için sayacı sıfırlayın ve devre dışı bırakın
Ve sonra PWM'nin çözünürlüğünün ayarlandığına karar veren ön ölçek değerini ayarlayın.
PWMPR = 0x1D; // Prescale Register değeri
Adım 5: - Ardından, sıfırlama, PWMMR0 ve PWMMR3 için kesintiler gibi işlemleri ayarlarken PWMMCR'yi (PWM eşleşme kontrol yazmacı) ayarlayın.
PWMMCR = 0x00000203; // MR0 eşleşmesini sıfırla ve kes, MR3 eşleşmesini kes
Adım 6: - PWM kanalının maksimum süresi PWMMR0 kullanılarak ayarlanır ve PWM görev döngüsünün Ton değeri başlangıçta 0,65 msn'ye ayarlanır
PWMMR0 = 20000; // PWM dalgasının zaman periyodu, 20 msn PWMMR3 = 650; // Ton PWM dalgası 0,65 milisaniye
Adım 7: - Ardından, PWMLER kullanarak ilgili eşleşme kayıtlarına Mandal Etkinleştirmeyi ayarlamamız gerekir.
PWMLER = 0x09; // PWM3 ve PWM0 için mandal etkinleştirme
(PWMMR0 ve PWMMR3 kullanıyoruz) Bu nedenle PWMLER'de 1'i ayarlayarak karşılık gelen biti etkinleştirin
Adım 8: - 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.
PWMPCR = 0x0800; // PWM3 ve PWM 0'ı etkinleştirin, tek kenar kontrollü PWM PWMTCR = 0x09; // PWM ve sayacı etkinleştir
Adım 9: - Ş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'de ADC modülünü kullanıyoruz.
Adım 10: - 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. Ve sonra bu dijital değerler, onları (0'dan 255'e) dönüştürmek için 4'e bölünür ve son olarak LPC2148'in P0.1 pininde PWM çıkışı olarak beslenir. 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 (28).
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 11: - 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 }
LCD'yi 4-Bit modunda LPC2148 ile bağladığımız için, yarım bayt olarak görüntülenecek değerleri göndermemiz gerekiyor (Upper Nibble & Lower Nibble). 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", dutycycle); LCD_DISPLAY (displayadc); // ADC değerini göster (0 ila 1023) açı = (adcvalue / 5.7); // ADC değerini açıya dönüştüren formül (o ila 180 derece) LCD_SEND (0xC0); sprintf (açı değeri, "ANGLE =%. 2f deg", açı); LCD_DISPLAY (açı değeri);
Eğiticinin tam kodu ve video açıklaması aşağıda verilmiştir.